001 /*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License"). You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at
010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012 * See the License for the specific language governing permissions
013 * and limitations under the License.
014 *
015 * When distributing Covered Code, include this CDDL HEADER in each
016 * file and include the License file at
017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
018 * add the following below this CDDL HEADER, with the fields enclosed
019 * by brackets "[]" replaced with your own identifying information:
020 * Portions Copyright [yyyy] [name of copyright owner]
021 *
022 * CDDL HEADER END
023 *
024 *
025 * Copyright 2006-2008 Sun Microsystems, Inc.
026 */
027 package org.opends.server.tools.makeldif;
028 import org.opends.messages.Message;
029
030
031
032 import java.util.List;
033
034 import org.opends.server.core.DirectoryServer;
035 import org.opends.server.types.AttributeType;
036 import org.opends.server.types.InitializationException;
037
038 import static org.opends.messages.ToolMessages.*;
039
040 import static org.opends.server.util.StaticUtils.*;
041
042
043
044 /**
045 * This class defines a tag that is used to reference the value of a specified
046 * attribute already defined in the entry.
047 */
048 public class AttributeValueTag
049 extends Tag
050 {
051 // The attribute type that specifies which value should be used.
052 private AttributeType attributeType;
053
054 // The maximum number of characters to include from the value.
055 private int numCharacters;
056
057
058
059 /**
060 * Creates a new instance of this attribute value tag.
061 */
062 public AttributeValueTag()
063 {
064 attributeType = null;
065 numCharacters = 0;
066 }
067
068
069
070 /**
071 * Retrieves the name for this tag.
072 *
073 * @return The name for this tag.
074 */
075 public String getName()
076 {
077 return "AttributeValue";
078 }
079
080
081
082 /**
083 * Indicates whether this tag is allowed for use in the extra lines for
084 * branches.
085 *
086 * @return <CODE>true</CODE> if this tag may be used in branch definitions,
087 * or <CODE>false</CODE> if not.
088 */
089 public boolean allowedInBranch()
090 {
091 return true;
092 }
093
094
095
096 /**
097 * Performs any initialization for this tag that may be needed while parsing
098 * a branch definition.
099 *
100 * @param templateFile The template file in which this tag is used.
101 * @param branch The branch in which this tag is used.
102 * @param arguments The set of arguments provided for this tag.
103 * @param lineNumber The line number on which this tag appears in the
104 * template file.
105 * @param warnings A list into which any appropriate warning messages
106 * may be placed.
107 *
108 * @throws InitializationException If a problem occurs while initializing
109 * this tag.
110 */
111 public void initializeForBranch(TemplateFile templateFile, Branch branch,
112 String[] arguments, int lineNumber,
113 List<Message> warnings)
114 throws InitializationException
115 {
116 if ((arguments.length < 1) || (arguments.length > 2))
117 {
118 Message message = ERR_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT.get(
119 getName(), lineNumber, 1, 2, arguments.length);
120 throw new InitializationException(message);
121 }
122
123 String lowerName = toLowerCase(arguments[0]);
124 attributeType = DirectoryServer.getAttributeType(lowerName, true);
125 if (! branch.hasAttribute(attributeType))
126 {
127 Message message =
128 ERR_MAKELDIF_TAG_UNDEFINED_ATTRIBUTE.get(arguments[0], lineNumber);
129 throw new InitializationException(message);
130 }
131
132 if (arguments.length == 2)
133 {
134 try
135 {
136 numCharacters = Integer.parseInt(arguments[1]);
137 if (numCharacters < 0)
138 {
139 Message message = ERR_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND.get(
140 numCharacters, 0, getName(), lineNumber);
141 throw new InitializationException(message);
142 }
143 }
144 catch (NumberFormatException nfe)
145 {
146 Message message = ERR_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER.get(
147 arguments[1], getName(), lineNumber);
148 throw new InitializationException(message);
149 }
150 }
151 else
152 {
153 numCharacters = 0;
154 }
155 }
156
157
158
159 /**
160 * Performs any initialization for this tag that may be needed while parsing
161 * a template definition.
162 *
163 * @param templateFile The template file in which this tag is used.
164 * @param template The template in which this tag is used.
165 * @param arguments The set of arguments provided for this tag.
166 * @param lineNumber The line number on which this tag appears in the
167 * template file.
168 * @param warnings A list into which any appropriate warning messages
169 * may be placed.
170 *
171 * @throws InitializationException If a problem occurs while initializing
172 * this tag.
173 */
174 public void initializeForTemplate(TemplateFile templateFile,
175 Template template, String[] arguments,
176 int lineNumber, List<Message> warnings)
177 throws InitializationException
178 {
179 if ((arguments.length < 1) || (arguments.length > 2))
180 {
181 Message message = ERR_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT.get(
182 getName(), lineNumber, 1, 2, arguments.length);
183 throw new InitializationException(message);
184 }
185
186 String lowerName = toLowerCase(arguments[0]);
187 attributeType = DirectoryServer.getAttributeType(lowerName, true);
188 if (! template.hasAttribute(attributeType))
189 {
190 Message message =
191 ERR_MAKELDIF_TAG_UNDEFINED_ATTRIBUTE.get(arguments[0], lineNumber);
192 throw new InitializationException(message);
193 }
194
195 if (arguments.length == 2)
196 {
197 try
198 {
199 numCharacters = Integer.parseInt(arguments[1]);
200 if (numCharacters < 0)
201 {
202 Message message = ERR_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND.get(
203 numCharacters, 0, getName(), lineNumber);
204 throw new InitializationException(message);
205 }
206 }
207 catch (NumberFormatException nfe)
208 {
209 Message message = ERR_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER.get(
210 arguments[1], getName(), lineNumber);
211 throw new InitializationException(message);
212 }
213 }
214 else
215 {
216 numCharacters = 0;
217 }
218 }
219
220
221
222 /**
223 * Generates the content for this tag by appending it to the provided tag.
224 *
225 * @param templateEntry The entry for which this tag is being generated.
226 * @param templateValue The template value to which the generated content
227 * should be appended.
228 *
229 * @return The result of generating content for this tag.
230 */
231 public TagResult generateValue(TemplateEntry templateEntry,
232 TemplateValue templateValue)
233 {
234 TemplateValue v = templateEntry.getValue(attributeType);
235 if (v == null)
236 {
237 // This is fine -- we just won't append anything.
238 return TagResult.SUCCESS_RESULT;
239 }
240
241 if (numCharacters > 0)
242 {
243 String valueString = v.getValue().toString();
244 if (valueString.length() > numCharacters)
245 {
246 templateValue.append(valueString.substring(0, numCharacters));
247 }
248 else
249 {
250 templateValue.append(valueString);
251 }
252 }
253 else
254 {
255 templateValue.getValue().append(v.getValue());
256 }
257
258 return TagResult.SUCCESS_RESULT;
259 }
260 }
261