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: */package org.netbeans.modules.vmd.model;
041:
042: import org.netbeans.modules.vmd.api.model.*;
043: import org.netbeans.modules.vmd.api.model.common.DocumentSupport;
044: import org.openide.util.Lookup;
045: import org.w3c.dom.Document;
046: import org.w3c.dom.Node;
047:
048: /**
049: * @author David Kaspar
050: */
051: public final class XMLComponentProducer extends ComponentProducer {
052:
053: private static final Lookup.Result<? extends ProducerDeserializer> result = Lookup
054: .getDefault().lookupResult(ProducerDeserializer.class);
055:
056: public static final String COMPONENT_PRODUCER_NODE = "ComponentProducer"; // NOI18N
057: public static final String VERSION_ATTR = "version"; // NOI18N
058:
059: public static final String PRODUCERID_ATTR = "producerID"; // NOI18N
060: public static final String MAIN_COMPONENT_TYPEID_ATTR = "mainComponentTypeID"; // NOI18N
061:
062: public static final String DISPLAY_NAME_ATTR = "displayName"; // NOI18N
063: public static final String TOOLTIP_ATTR = "toolTip"; // NOI18N
064: public static final String SMALL_ICON_ATTR = "smallIcon"; // NOI18N
065: public static final String LARGE_ICON_ATTR = "largeIcon"; // NOI18N
066: public static final String PREFERRED_CATEGORYID_ATTR = "preferredCategoryID"; // NOI18N
067:
068: public static final String VERSION_VALUE_1 = "1"; // NOI18N
069:
070: protected XMLComponentProducer(String producerID, TypeID typeID,
071: PaletteDescriptor paletteDescriptor) {
072: super (producerID, typeID, paletteDescriptor);
073: }
074:
075: public static XMLComponentProducer deserialize(String projectType,
076: Document document) {
077: Node rootNode = document.getFirstChild();
078:
079: if (!COMPONENT_PRODUCER_NODE.equals(rootNode.getNodeName())) {
080: Debug.warning("Invalid root node"); // NOI18N
081: return null;
082: }
083:
084: String version = XMLComponentDescriptor.getAttributeValue(
085: rootNode, VERSION_ATTR);
086: if (!VERSION_VALUE_1.equals(version)) {
087: Debug.warning("Invalid version", version); // NOI18N
088: return null;
089: }
090:
091: String producerID = XMLComponentDescriptor.getAttributeValue(
092: rootNode, PRODUCERID_ATTR);
093: if (producerID == null) {
094: Debug.warning("Missing producerID attribute"); // NOI18N
095: return null;
096: }
097:
098: String typeID = XMLComponentDescriptor.getAttributeValue(
099: rootNode, MAIN_COMPONENT_TYPEID_ATTR);
100: if (typeID == null) {
101: Debug.warning("Missing mainComponentTypeID attribute"); // NOI18N
102: return null;
103: }
104:
105: PaletteDescriptor paletteDescriptor = new PaletteDescriptor(
106: XMLComponentDescriptor.getAttributeValue(rootNode,
107: PREFERRED_CATEGORYID_ATTR),
108: XMLComponentDescriptor.getAttributeValue(rootNode,
109: DISPLAY_NAME_ATTR), XMLComponentDescriptor
110: .getAttributeValue(rootNode, TOOLTIP_ATTR),
111: XMLComponentDescriptor.getAttributeValue(rootNode,
112: SMALL_ICON_ATTR), XMLComponentDescriptor
113: .getAttributeValue(rootNode, LARGE_ICON_ATTR));
114:
115: return new XMLComponentProducer(producerID, TypeID
116: .createFrom(typeID), paletteDescriptor);
117: }
118:
119: @Override
120: public Result postInitialize(DesignDocument document,
121: DesignComponent mainComponent) {
122: ComponentDescriptor descriptor = document
123: .getDescriptorRegistry().getComponentDescriptor(
124: getMainComponentTypeID());
125: if (descriptor != null) {
126: TypeID super TypeID = descriptor.getTypeDescriptor()
127: .getSuperType();
128: if (super TypeID != null) {
129: ComponentProducer producer = DocumentSupport
130: .getComponentProducer(document, super TypeID
131: .toString());
132: if (producer != null)
133: producer.postInitialize(document, mainComponent);
134: }
135: }
136: return super .postInitialize(document, mainComponent);
137: }
138:
139: public Boolean checkValidity(final DesignDocument document,
140: boolean useCachedValue) {
141: if (!checkValidityByDeserializers(document))
142: return false;
143:
144: final ComponentProducer[] producers = new ComponentProducer[1];
145: document.getTransactionManager().readAccess(new Runnable() {
146: public void run() {
147: ComponentDescriptor descriptor = document
148: .getDescriptorRegistry()
149: .getComponentDescriptor(
150: getMainComponentTypeID());
151: if (descriptor != null) {
152: TypeID super TypeID = descriptor.getTypeDescriptor()
153: .getSuperType();
154: if (super TypeID != null)
155: producers[0] = DocumentSupport
156: .getComponentProducer(document,
157: super TypeID.toString());
158: }
159: }
160: });
161:
162: if (producers[0] == null) {
163: return true;
164: }
165:
166: return producers[0].checkValidity(document, useCachedValue);
167: }
168:
169: private boolean checkValidityByDeserializers(DesignDocument document) {
170: String projectType = document.getDocumentInterface()
171: .getProjectType();
172: for (ProducerDeserializer deserializer : result.allInstances())
173: if (projectType.equals(deserializer.getProjectType()))
174: if (!deserializer.checkValidity(document, this ))
175: return false;
176: return true;
177: }
178:
179: }
|