aoqi@0: /* aoqi@0: * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: package com.sun.xml.internal.xsom.impl; aoqi@0: aoqi@0: import com.sun.xml.internal.xsom.SCD; aoqi@0: import com.sun.xml.internal.xsom.XSAnnotation; aoqi@0: import com.sun.xml.internal.xsom.XSComponent; aoqi@0: import com.sun.xml.internal.xsom.XSSchemaSet; aoqi@0: import com.sun.xml.internal.xsom.util.ComponentNameFunction; aoqi@0: import com.sun.xml.internal.xsom.impl.parser.SchemaDocumentImpl; aoqi@0: import com.sun.xml.internal.xsom.parser.SchemaDocument; aoqi@0: import org.xml.sax.Locator; aoqi@0: aoqi@0: import javax.xml.namespace.NamespaceContext; aoqi@0: import java.text.ParseException; aoqi@0: import java.util.ArrayList; aoqi@0: import java.util.Collection; aoqi@0: import java.util.Collections; aoqi@0: import java.util.List; aoqi@0: aoqi@0: public abstract class ComponentImpl implements XSComponent aoqi@0: { aoqi@0: protected ComponentImpl( SchemaDocumentImpl _owner, AnnotationImpl _annon, Locator _loc, ForeignAttributesImpl fa ) { aoqi@0: this.ownerDocument = _owner; aoqi@0: this.annotation = _annon; aoqi@0: this.locator = _loc; aoqi@0: this.foreignAttributes = fa; aoqi@0: } aoqi@0: aoqi@0: protected final SchemaDocumentImpl ownerDocument; aoqi@0: public SchemaImpl getOwnerSchema() { aoqi@0: if(ownerDocument==null) aoqi@0: return null; aoqi@0: else aoqi@0: return ownerDocument.getSchema(); aoqi@0: } aoqi@0: aoqi@0: public XSSchemaSet getRoot() { aoqi@0: if(ownerDocument==null) aoqi@0: return null; aoqi@0: else aoqi@0: return getOwnerSchema().getRoot(); aoqi@0: } aoqi@0: aoqi@0: public SchemaDocument getSourceDocument() { aoqi@0: return ownerDocument; aoqi@0: } aoqi@0: aoqi@0: private AnnotationImpl annotation; aoqi@0: public final XSAnnotation getAnnotation() { return annotation; } aoqi@0: aoqi@0: public XSAnnotation getAnnotation(boolean createIfNotExist) { aoqi@0: if(createIfNotExist && annotation==null) { aoqi@0: annotation = new AnnotationImpl(); aoqi@0: } aoqi@0: return annotation; aoqi@0: } aoqi@0: aoqi@0: private final Locator locator; aoqi@0: public final Locator getLocator() { return locator; } aoqi@0: aoqi@0: /** aoqi@0: * Either {@link ForeignAttributesImpl} or {@link List}. aoqi@0: * aoqi@0: * Initially it's {@link ForeignAttributesImpl}, but it's lazily turned into aoqi@0: * a list when necessary. aoqi@0: */ aoqi@0: private Object foreignAttributes; aoqi@0: aoqi@0: public List getForeignAttributes() { aoqi@0: Object t = foreignAttributes; aoqi@0: aoqi@0: if(t==null) aoqi@0: return Collections.EMPTY_LIST; aoqi@0: aoqi@0: if(t instanceof List) aoqi@0: return (List)t; aoqi@0: aoqi@0: t = foreignAttributes = convertToList((ForeignAttributesImpl)t); aoqi@0: return (List)t; aoqi@0: } aoqi@0: aoqi@0: public String getForeignAttribute(String nsUri, String localName) { aoqi@0: for( ForeignAttributesImpl fa : getForeignAttributes() ) { aoqi@0: String v = fa.getValue(nsUri,localName); aoqi@0: if(v!=null) return v; aoqi@0: } aoqi@0: return null; aoqi@0: } aoqi@0: aoqi@0: private List convertToList(ForeignAttributesImpl fa) { aoqi@0: List lst = new ArrayList(); aoqi@0: while(fa!=null) { aoqi@0: lst.add(fa); aoqi@0: fa = fa.next; aoqi@0: } aoqi@0: return Collections.unmodifiableList(lst); aoqi@0: } aoqi@0: aoqi@0: public Collection select(String scd, NamespaceContext nsContext) { aoqi@0: try { aoqi@0: return SCD.create(scd,nsContext).select(this); aoqi@0: } catch (ParseException e) { aoqi@0: throw new IllegalArgumentException(e); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: public XSComponent selectSingle(String scd, NamespaceContext nsContext) { aoqi@0: try { aoqi@0: return SCD.create(scd,nsContext).selectSingle(this); aoqi@0: } catch (ParseException e) { aoqi@0: throw new IllegalArgumentException(e); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: @Override aoqi@0: public String toString() { aoqi@0: return apply(new ComponentNameFunction()); aoqi@0: } aoqi@0: }