1 /* 2 * Copyright 2012-2013 smartics, Kronseder & Reiner GmbH 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package de.smartics.properties.api.core.context.alias; 17 18 import java.io.Serializable; 19 import java.util.HashMap; 20 import java.util.Map; 21 import java.util.Map.Entry; 22 23 import javax.annotation.concurrent.NotThreadSafe; 24 25 import de.smartics.util.lang.Arg; 26 import de.smartics.util.lang.BlankArgumentException; 27 28 /** 29 * The mapping of alias names of property reports to their physical names. The 30 * physical names are those file names that are stored in the 31 * <code>META-INF</code> folder or on the server in the case of HTML reports. 32 * The alias names are alternative, unique naming schemes that refer to the same 33 * files. 34 */ 35 @NotThreadSafe 36 public final class PropertyAliasMapping implements Serializable 37 { 38 // ********************************* Fields ********************************* 39 40 // --- constants ------------------------------------------------------------ 41 42 /** 43 * The class version identifier. 44 */ 45 private static final long serialVersionUID = 1L; 46 47 // --- members -------------------------------------------------------------- 48 49 /** 50 * The mapping of alias names of property reports to their physical names. The 51 * physical names are those file names that are stored in the 52 * <code>META-INF</code> folder or on the server in the case of HTML reports. 53 * The alias names are alternative, unique naming schemes that refer to the 54 * same files. 55 * <p> 56 * The key is the name of the alias, the value is the physical resource. There 57 * is only one physical for each alias, but different aliases may point to the 58 * same resource. 59 * </p> 60 * 61 * @serial 62 */ 63 private final Map<String, String> aliasMapping = 64 new HashMap<String, String>(); 65 66 // ****************************** Initializer ******************************* 67 68 // ****************************** Constructors ****************************** 69 70 /** 71 * Default constructor. 72 */ 73 public PropertyAliasMapping() 74 { 75 } 76 77 // ****************************** Inner Classes ***************************** 78 79 // ********************************* Methods ******************************** 80 81 // --- init ----------------------------------------------------------------- 82 83 // --- get&set -------------------------------------------------------------- 84 85 // --- business ------------------------------------------------------------- 86 87 /** 88 * Adds a new alias to the given physical resource. 89 * 90 * @param alias the new alias. 91 * @param target the resource the alias refers to. 92 * @throws BlankArgumentException if either {@code alias} or {@code target} is 93 * blank. 94 * @throws DuplicateAliasException if there is already an alias registered 95 * that points to a different physical resource. 96 */ 97 public void add(final String alias, final String target) 98 throws BlankArgumentException, DuplicateAliasException 99 { 100 Arg.checkNotBlank("alias", alias); // NOPMD 101 Arg.checkNotBlank("target", target); 102 103 final String oldTarget = aliasMapping.put(alias, target); 104 if (oldTarget != null && !oldTarget.equals(target)) 105 { 106 throw new DuplicateAliasException(alias, oldTarget, target); 107 } 108 } 109 110 /** 111 * Checks if the given alias is registered. 112 * 113 * @param alias the alias to check. 114 * @throws BlankArgumentException if {@code alias} is blank. 115 * @return <code>true</code> if the alias is known to the system, 116 * <code>false</code> otherwise. 117 */ 118 public boolean has(final String alias) throws BlankArgumentException 119 { 120 Arg.checkNotBlank("alias", alias); 121 122 return aliasMapping.containsKey(alias); 123 } 124 125 /** 126 * Returns the target the alias points to. 127 * 128 * @param alias the alias whose physical resource is requested. 129 * @return the target the alias points to. 130 * @throws BlankArgumentException if {@code alias} is blank. 131 * @throws UnknownAliasException if the alias is not known. 132 */ 133 public String get(final String alias) throws BlankArgumentException, 134 UnknownAliasException 135 { 136 Arg.checkNotBlank("alias", alias); 137 138 final String physical = aliasMapping.get(alias); 139 if (physical != null) 140 { 141 return physical; 142 } 143 144 throw new UnknownAliasException(alias); 145 } 146 147 /** 148 * Traverses the registered aliases. 149 * 150 * @param traverser the traverser to use. 151 * @throws NullPointerException if {@code traverser} is <code>null</code>. 152 */ 153 public void traverse(final AliasTraverser traverser) 154 throws NullPointerException 155 { 156 Arg.checkNotNull("traverser", traverser); 157 158 for (final Entry<String, String> entry : aliasMapping.entrySet()) 159 { 160 final String alias = entry.getKey(); 161 final String physical = entry.getValue(); 162 traverser.handle(alias, physical); 163 } 164 } 165 166 /** 167 * Checks whether any aliases are registered. 168 * 169 * @return <code>false</code> if at least one alias is registered, 170 * <code>true</code> otherwise. 171 */ 172 public boolean isEmpty() 173 { 174 return aliasMapping.isEmpty(); 175 } 176 177 // --- object basics -------------------------------------------------------- 178 179 }