001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.vmd.model;
042:
043: import org.netbeans.modules.vmd.api.model.*;
044: import org.netbeans.modules.vmd.api.model.common.DefaultVersionDescriptor;
045: import org.w3c.dom.*;
046:
047: import java.util.ArrayList;
048: import java.util.Collection;
049: import java.util.List;
050: import java.util.Collections;
051:
052: /**
053: * @author David Kaspar
054: */
055: // TODO - whole serialization and deserialization of versionDescriptor, excludePropertyDescriptorNames, required library
056: public class XMLComponentDescriptor extends ComponentDescriptor {
057:
058: public static final String COMPONENT_DESCRIPTOR_NODE = "ComponentDescriptor"; // NOI18N
059: public static final String VERSION_ATTR = "version"; // NOI18N
060:
061: public static final String TYPE_NODE = "TypeDescriptor"; // NOI18N
062: public static final String SUPER_TYPEID_ATTR = "superTypeID"; // NOI18N
063: public static final String THIS_TYPEID_ATTR = "thisTypeID"; // NOI18N
064: public static final String CAN_INSTANTIATE_ATTR = "canInstantiate"; // NOI18N
065: public static final String CAN_DERIVE_ATTR = "canDerive"; // NOI18N
066:
067: public static final String PALETTE_NODE = "PaletteDescriptor"; // NOI18N
068: public static final String DISPLAY_NAME_ATTR = "displayName"; // NOI18N
069: public static final String TOOLTIP_ATTR = "toolTip"; // NOI18N
070: public static final String SMALL_ICON_ATTR = "smallIcon"; // NOI18N
071: public static final String LARGE_ICON_ATTR = "largeIcon"; // NOI18N
072: public static final String PREFERRED_CATEGORYID_ATTR = "preferredCategoryID"; // NOI18N
073:
074: public static final String PROPERTY_DESCRIPTOR_NODE = "PropertyDescriptor"; // NOI18N
075: public static final String NAME_ATTR = "name"; // NOI18N
076: public static final String TYPEID_ATTR = "typeID"; // NOI18N
077: public static final String DEFAULT_VALUE_ATTR = "defaultValue"; // NOI18N
078: public static final String ALLOW_NULL = "allowNull"; // NOI18N
079: public static final String ALLOW_USER_CODE = "allowUserCode"; // NOI18N
080: public static final String USE_FOR_SERIALIZATION_ATTR = "useForSerialization"; // NOI18N
081: public static final String READ_ONLY_ATTR = "readOnly"; // NOI18N
082:
083: public static final String PRESENTERS_NODE = "Presenters"; // NOI18N
084:
085: public static final String VERSION_VALUE_1 = "1"; // NOI18N
086:
087: private TypeDescriptor typeDescriptor;
088: private PaletteDescriptor paletteDescriptor;
089: private List<PropertyDescriptor> propertyDescriptors;
090: private List<PresenterDeserializer.PresenterFactory> presenterDescriptors;
091:
092: public TypeDescriptor getTypeDescriptor() {
093: return typeDescriptor;
094: }
095:
096: public VersionDescriptor getVersionDescriptor() {
097: return DefaultVersionDescriptor
098: .createForeverCompatibleVersionDescriptor(); // TODO
099: }
100:
101: public Collection<String> getExcludedPropertyDescriptorNames() {
102: return Collections.emptySet(); // TODO
103: }
104:
105: public List<PropertyDescriptor> getDeclaredPropertyDescriptors() {
106: return propertyDescriptors;
107: }
108:
109: public PaletteDescriptor getPaletteDescriptor() {
110: return paletteDescriptor;
111: }
112:
113: protected List<? extends Presenter> createPresenters() {
114: ArrayList<Presenter> presenters = new ArrayList<Presenter>();
115: for (PresenterDeserializer.PresenterFactory factory : presenterDescriptors) {
116: List<Presenter> list = factory.createPresenters(this );
117: if (list != null)
118: presenters.addAll(list);
119: }
120: return presenters;
121: }
122:
123: public boolean deserialize(String projectType, Document document) {
124: Node rootNode = document.getFirstChild();
125:
126: if (!COMPONENT_DESCRIPTOR_NODE.equals(rootNode.getNodeName())) {
127: Debug.warning("Invalid root node"); // NOI18N
128: return false;
129: }
130:
131: String version = getAttributeValue(rootNode, VERSION_ATTR);
132: if (VERSION_VALUE_1.equals(version)) {
133: deserializeVersion1(projectType, rootNode);
134: return true;
135: } else {
136: Debug.warning("Invalid version", version); // NOI18N
137: return false;
138: }
139: }
140:
141: private void deserializeVersion1(String projectType, Node rootNode) {
142: ArrayList<PropertyDescriptor> properties = new ArrayList<PropertyDescriptor>();
143: ArrayList<PresenterDeserializer.PresenterFactory> presenters = new ArrayList<PresenterDeserializer.PresenterFactory>();
144:
145: for (Node node : getChildNode(rootNode)) {
146: if (TYPE_NODE.equals(node.getNodeName())) {
147: String this TypeID = getAttributeValue(node,
148: THIS_TYPEID_ATTR);
149: if (this TypeID == null) {
150: Debug.warning("Missing " + THIS_TYPEID_ATTR
151: + " attribute"); // NOI18N
152: continue;
153: }
154: typeDescriptor = new TypeDescriptor(TypeID
155: .createFrom(getAttributeValue(node,
156: SUPER_TYPEID_ATTR)), TypeID
157: .createFrom(this TypeID), Boolean
158: .parseBoolean(getAttributeValue(node,
159: CAN_INSTANTIATE_ATTR)), Boolean
160: .parseBoolean(getAttributeValue(node,
161: CAN_DERIVE_ATTR)));
162: } else if (PALETTE_NODE.equals(node.getNodeName())) {
163: paletteDescriptor = new PaletteDescriptor(
164: getAttributeValue(node,
165: PREFERRED_CATEGORYID_ATTR),
166: getAttributeValue(node, DISPLAY_NAME_ATTR),
167: getAttributeValue(node, TOOLTIP_ATTR),
168: getAttributeValue(node, SMALL_ICON_ATTR),
169: getAttributeValue(node, LARGE_ICON_ATTR));
170: } else if (PROPERTY_DESCRIPTOR_NODE.equals(node
171: .getNodeName())) {
172: String name = getAttributeValue(node, NAME_ATTR);
173: if (name == null) {
174: Debug.warning("Missing name attribute"); // NOI18N
175: continue;
176: }
177: TypeID typeID = TypeID.createFrom(getAttributeValue(
178: node, TYPEID_ATTR));
179: if (typeID == null) {
180: Debug.warning("Missing typeID attribute", name); // NOI18N
181: continue;
182: }
183: String defaultValue = getAttributeValue(node,
184: DEFAULT_VALUE_ATTR);
185: properties.add(new PropertyDescriptor(name, typeID,
186: defaultValue != null ? PropertyValue
187: .createUserCode(defaultValue)
188: : PropertyValue.createNull(), Boolean
189: .parseBoolean(getAttributeValue(node,
190: ALLOW_NULL)), Boolean
191: .parseBoolean(getAttributeValue(node,
192: ALLOW_USER_CODE)),
193: Versionable.FOREVER, Boolean
194: .parseBoolean(getAttributeValue(node,
195: USE_FOR_SERIALIZATION_ATTR)),
196: Boolean.parseBoolean(getAttributeValue(node,
197: READ_ONLY_ATTR))));
198: }
199: }
200:
201: deserializePresenters(rootNode, projectType, presenters);
202:
203: propertyDescriptors = properties;
204: presenterDescriptors = presenters;
205: }
206:
207: private void deserializePresenters(Node rootNode,
208: String projectType,
209: ArrayList<PresenterDeserializer.PresenterFactory> presenters) {
210: for (Node presentersNode : getChildNode(rootNode))
211: if (PRESENTERS_NODE.equals(presentersNode.getNodeName()))
212: for (Node node : getChildNode(presentersNode)) {
213: PresenterDeserializer.PresenterFactory presenterFactory = PresenterDeserializerSupport
214: .deserialize(projectType, node);
215: if (presenterFactory != null)
216: presenters.add(presenterFactory);
217: }
218: }
219:
220: // private Image loadImage (String imageResource) {
221: // return imageResource != null ? Utilities.loadImage (imageResource) : null;
222: // }
223:
224: static String getAttributeValue(Node node, String attr) {
225: try {
226: if (node != null) {
227: NamedNodeMap map = node.getAttributes();
228: if (map != null) {
229: node = map.getNamedItem(attr);
230: if (node != null)
231: return node.getNodeValue();
232: }
233: }
234: } catch (DOMException e) {
235: Debug.warning(e);
236: }
237: return null;
238: }
239:
240: static Node[] getChildNode(Node node) {
241: NodeList childNodes = node.getChildNodes();
242: Node[] nodes = new Node[childNodes != null ? childNodes
243: .getLength() : 0];
244: for (int i = 0; i < nodes.length; i++)
245: nodes[i] = childNodes.item(i);
246: return nodes;
247: }
248:
249: }
|