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:
042: package org.netbeans.modules.xml.schema.model;
043:
044: import java.util.Collection;
045: import org.netbeans.modules.xml.xam.NamedReferenceable;
046: import org.netbeans.modules.xml.xam.Referenceable;
047: import org.netbeans.modules.xml.xam.dom.DocumentModel;
048:
049: /**
050: * This interface represents an instance of a schema model. A schema model is
051: * bound to a single file.
052: * @author Chris Webster
053: */
054: public interface SchemaModel extends DocumentModel<SchemaComponent>,
055: Referenceable {
056:
057: /**
058: * @return the schema represented by this model. The returned schema
059: * instance will be valid and well formed, thus attempting to update
060: * from a document which is not well formed will not result in any changes
061: * to the schema model.
062: */
063: Schema getSchema();
064:
065: /**
066: * This api returns the effective namespace for a given component.
067: * If given component has a targetNamespace different than the
068: * this schema, that namespace is returned. The special case is that if
069: * the targetNamespace of the component is null, there is no target
070: * namespace defined, then the import statements for this file are
071: * examined to determine if this component is directly or indirectly
072: * imported. If the component is imported, then null if returned
073: * otherwise the component is assumed to be included or redefined and
074: * the namespace of this schema is returned.
075: * @param component The component which namespace to find
076: * @return The effective target namespace
077: */
078: String getEffectiveNamespace(SchemaComponent component);
079:
080: /**
081: * @return common schema element factory valid for this instance
082: */
083: SchemaComponentFactory getFactory();
084:
085: /**
086: * Returns all visible schemas matching the given namespace.
087: * Note visibility rule is defined as following:
088: * (1) Include or redefine are transitive, i.e., includer can see all schemas
089: * included or redefined by the included
090: * (2) Import is not transitive, i.e., importing schema can only see the
091: * imported schema, but not those included, redefined or imported by the imported.
092: * (3) Imported schemas are not visible to includer or redefiner.
093: */
094: Collection<Schema> findSchemas(String namespaceURI);
095:
096: /**
097: * Finds the component in current schema by local name and type.
098: * @param localName the local name of the schema component.
099: * @param type the exact type of the schema component.
100: * @return first encountered of the schema component of specified name and type;
101: * null if not found.
102: */
103: <T extends NamedReferenceable> T findByNameAndType(
104: String localName, Class<T> type);
105:
106: /**
107: * Resolves the reference to component given namespace and local name.
108: * @param namespace the namespace of the referenced component
109: * @param localName local name of the refrenced component.
110: * @param type type of the component.
111: */
112: <T extends NamedReferenceable> T resolve(String namespace,
113: String localName, Class<T> type);
114: }
|