001 package org.apache.fulcrum.intake.xmlmodel;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import java.io.Serializable;
023
024 import java.util.ArrayList;
025 import java.util.Iterator;
026 import java.util.List;
027
028 import org.apache.fulcrum.intake.IntakeException;
029
030 import org.xml.sax.Attributes;
031
032 /**
033 * A class for holding application data structures.
034 *
035 * @author <a href="mailto:jmcnally@collab.net>John McNally</a>
036 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
037 * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
038 * @version $Id: AppData.java 535465 2007-05-05 06:58:06Z tv $
039 */
040 public class AppData
041 implements Serializable
042 {
043 /**
044 * Serial version id
045 */
046 private static final long serialVersionUID = -3953843038383617960L;
047
048 /** List of groups */
049 private List inputs;
050
051 /** Package that will be used for all mapTo objects */
052 private String basePackage;
053
054 /** Prefix string that will be used to qualify <prefix>:<intakegroup> names */
055 private String groupPrefix;
056
057 /**
058 * Default Constructor
059 */
060 public AppData()
061 {
062 inputs = new ArrayList();
063 }
064
065 /**
066 * Imports the top level element from an XML specification
067 */
068 public void loadFromXML(Attributes attrib)
069 {
070 String basePkg = attrib.getValue("basePackage");
071 if (basePkg == null)
072 {
073 setBasePackage("");
074 }
075 else
076 {
077 if (basePkg.charAt(basePkg.length() - 1) != '.')
078 {
079 setBasePackage(basePkg + '.');
080 }
081 else
082 {
083 setBasePackage(basePkg);
084 }
085 }
086
087 setGroupPrefix(attrib.getValue("groupPrefix"));
088 }
089
090 /**
091 * Return a collection of input sections (<group>).
092 * The names of the groups returned here are only unique
093 * to this AppData object and not qualified with the groupPrefix.
094 * This method is used in the IntakeService to register all the
095 * groups with and without prefix in the service.
096 *
097 */
098 public List getGroups()
099 {
100 return inputs;
101 }
102
103 /**
104 * Get a XmlGroup with the given name. It finds both
105 * qualified and unqualified names in this package.
106 *
107 * @param groupName a <code>String</code> value
108 * @return a <code>XmlGroup</code> value
109 * @throws IntakeException indicates that the groupName was null
110 */
111 public XmlGroup getGroup(String groupName)
112 throws IntakeException
113 {
114 if (groupName == null)
115 {
116 throw new IntakeException(
117 "Intake AppData.getGroup(groupName) is null");
118 }
119
120 String groupPrefix = getGroupPrefix();
121
122 for (Iterator it = inputs.iterator(); it.hasNext();)
123 {
124 XmlGroup group = (XmlGroup) it.next();
125
126 if (group.getName().equals(groupName))
127 {
128 return group;
129 }
130 if (groupPrefix != null)
131 {
132 StringBuffer qualifiedGroupName = new StringBuffer();
133
134 qualifiedGroupName.append(groupPrefix)
135 .append(':')
136 .append(group.getName());
137
138 if (qualifiedGroupName.toString().equals(groupName))
139 {
140 return group;
141 }
142 }
143 }
144 return null;
145 }
146
147 /**
148 * An utility method to add a new input group from
149 * an xml attribute.
150 */
151 public XmlGroup addGroup(Attributes attrib)
152 {
153 XmlGroup input = new XmlGroup();
154 input.loadFromXML(attrib);
155 addGroup(input);
156 return input;
157 }
158
159 /**
160 * Add an input group to the vector and sets the
161 * AppData property to this AppData
162 */
163 public void addGroup(XmlGroup input)
164 {
165 input.setAppData(this);
166 inputs.add(input);
167 }
168
169 /**
170 * Get the base package String that will be appended to
171 * any mapToObjects
172 *
173 * @return value of basePackage.
174 */
175 public String getBasePackage()
176 {
177 return basePackage;
178 }
179
180 /**
181 * Set the base package String that will be appended to
182 * any mapToObjects
183 *
184 * @param v Value to assign to basePackage.
185 */
186 public void setBasePackage(String v)
187 {
188 this.basePackage = v;
189 }
190
191 /**
192 * Get the prefix String that will be used to qualify
193 * intake groups when using multiple XML files
194 *
195 * @return value of groupPrefix
196 */
197 public String getGroupPrefix()
198 {
199 return groupPrefix;
200 }
201
202 /**
203 * Set the prefix String that will be used to qualify
204 * intake groups when using multiple XML files
205 *
206 * @param groupPrefix Value to assign to basePackage.
207 */
208 public void setGroupPrefix(String groupPrefix)
209 {
210 this.groupPrefix = groupPrefix;
211 }
212
213 /**
214 * Creats a string representation of this AppData.
215 * The representation is given in xml format.
216 */
217 public String toString()
218 {
219 StringBuffer result = new StringBuffer();
220
221 result.append("<input-data>\n");
222 for (Iterator iter = inputs.iterator(); iter.hasNext();)
223 {
224 result.append(iter.next());
225 }
226 result.append("</input-data>");
227 return result.toString();
228 }
229 }