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.types.InitializationException;
035
036 import static org.opends.messages.ToolMessages.*;
037
038
039
040 /**
041 * This class defines a tag that is used to include a sequentially-incrementing
042 * integer in the generated values.
043 */
044 public class SequentialTag
045 extends Tag
046 {
047 // Indicates whether to reset for each parent.
048 private boolean resetOnNewParents;
049
050 // The initial value in the sequence.
051 private int initialValue;
052
053 // The next value in the sequence.
054 private int nextValue;
055
056
057
058 /**
059 * Creates a new instance of this sequential tag.
060 */
061 public SequentialTag()
062 {
063 // No implementation required.
064 }
065
066
067
068 /**
069 * Retrieves the name for this tag.
070 *
071 * @return The name for this tag.
072 */
073 public String getName()
074 {
075 return "Sequential";
076 }
077
078
079
080 /**
081 * Indicates whether this tag is allowed for use in the extra lines for
082 * branches.
083 *
084 * @return <CODE>true</CODE> if this tag may be used in branch definitions,
085 * or <CODE>false</CODE> if not.
086 */
087 public boolean allowedInBranch()
088 {
089 return true;
090 }
091
092
093
094 /**
095 * Performs any initialization for this tag that may be needed while parsing
096 * a branch definition.
097 *
098 * @param templateFile The template file in which this tag is used.
099 * @param branch The branch in which this tag is used.
100 * @param arguments The set of arguments provided for this tag.
101 * @param lineNumber The line number on which this tag appears in the
102 * template file.
103 * @param warnings A list into which any appropriate warning messages
104 * may be placed.
105 *
106 * @throws InitializationException If a problem occurs while initializing
107 * this tag.
108 */
109 public void initializeForBranch(TemplateFile templateFile, Branch branch,
110 String[] arguments, int lineNumber,
111 List<Message> warnings)
112 throws InitializationException
113 {
114 initializeInternal(templateFile, arguments, lineNumber);
115 }
116
117
118
119 /**
120 * Performs any initialization for this tag that may be needed while parsing
121 * a template definition.
122 *
123 * @param templateFile The template file in which this tag is used.
124 * @param template The template in which this tag is used.
125 * @param arguments The set of arguments provided for this tag.
126 * @param lineNumber The line number on which this tag appears in the
127 * template file.
128 * @param warnings A list into which any appropriate warning messages
129 * may be placed.
130 *
131 * @throws InitializationException If a problem occurs while initializing
132 * this tag.
133 */
134 public void initializeForTemplate(TemplateFile templateFile,
135 Template template, String[] arguments,
136 int lineNumber, List<Message> warnings)
137 throws InitializationException
138 {
139 initializeInternal(templateFile, arguments, lineNumber);
140 }
141
142
143
144 /**
145 * Performs any initialization for this tag that may be needed for this tag.
146 *
147 * @param templateFile The template file in which this tag is used.
148 * @param arguments The set of arguments provided for this tag.
149 * @param lineNumber The line number on which this tag appears in the
150 * template file.
151 *
152 * @throws InitializationException If a problem occurs while initializing
153 * this tag.
154 */
155 private void initializeInternal(TemplateFile templateFile, String[] arguments,
156 int lineNumber)
157 throws InitializationException
158 {
159 switch (arguments.length)
160 {
161 case 0:
162 initialValue = 0;
163 nextValue = 0;
164 resetOnNewParents = true;
165 break;
166 case 1:
167 try
168 {
169 initialValue = Integer.parseInt(arguments[0]);
170 }
171 catch (NumberFormatException nfe)
172 {
173 Message message = ERR_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER.get(
174 arguments[0], getName(), lineNumber);
175 throw new InitializationException(message);
176 }
177
178 nextValue = initialValue;
179 resetOnNewParents = true;
180 break;
181 case 2:
182 try
183 {
184 initialValue = Integer.parseInt(arguments[0]);
185 }
186 catch (NumberFormatException nfe)
187 {
188 Message message = ERR_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER.get(
189 arguments[0], getName(), lineNumber);
190 throw new InitializationException(message);
191 }
192
193 if (arguments[1].equalsIgnoreCase("true"))
194 {
195 resetOnNewParents = true;
196 }
197 else if (arguments[1].equalsIgnoreCase("false"))
198 {
199 resetOnNewParents = false;
200 }
201 else
202 {
203 Message message = ERR_MAKELDIF_TAG_CANNOT_PARSE_AS_BOOLEAN.get(
204 arguments[1], getName(), lineNumber);
205 throw new InitializationException(message);
206 }
207
208 nextValue = initialValue;
209 break;
210 default:
211 Message message = ERR_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT.get(
212 getName(), lineNumber, 0, 2, arguments.length);
213 throw new InitializationException(message);
214 }
215 }
216
217
218
219 /**
220 * Performs any initialization for this tag that may be needed when starting
221 * to generate entries below a new parent.
222 *
223 * @param parentEntry The entry below which the new entries will be
224 * generated.
225 */
226 public void initializeForParent(TemplateEntry parentEntry)
227 {
228 if (resetOnNewParents)
229 {
230 nextValue = initialValue;
231 }
232 }
233
234
235
236 /**
237 * Generates the content for this tag by appending it to the provided tag.
238 *
239 * @param templateEntry The entry for which this tag is being generated.
240 * @param templateValue The template value to which the generated content
241 * should be appended.
242 *
243 * @return The result of generating content for this tag.
244 */
245 public TagResult generateValue(TemplateEntry templateEntry,
246 TemplateValue templateValue)
247 {
248 templateValue.getValue().append(nextValue++);
249 return TagResult.SUCCESS_RESULT;
250 }
251 }
252