blob: da3558855fe1b6c7f7ba075b17fb86f5b64fca9d [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.xmlbeans.impl.schema;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.xmlbeans.SchemaAnnotation;
import org.apache.xmlbeans.SchemaTypeSystem;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.impl.xb.xsdschema.AppinfoDocument;
import org.apache.xmlbeans.impl.xb.xsdschema.Annotated;
import org.apache.xmlbeans.impl.xb.xsdschema.AnnotationDocument;
import org.apache.xmlbeans.impl.xb.xsdschema.DocumentationDocument;
import org.apache.xmlbeans.SchemaComponent;
public class SchemaAnnotationImpl implements SchemaAnnotation
{
private SchemaContainer _container;
private String[] _appInfoAsXml;
private AppinfoDocument.Appinfo[] _appInfo;
private String[] _documentationAsXml;
private DocumentationDocument.Documentation[] _documentation;
private Attribute[] _attributes;
private String _filename;
public void setFilename(String filename)
{
_filename = filename;
}
public String getSourceName()
{
return _filename;
}
public XmlObject[] getApplicationInformation()
{
if (_appInfo == null)
{
int n = _appInfoAsXml.length;
_appInfo = new AppinfoDocument.Appinfo[n];
for (int i = 0; i < n; i++)
{
String appInfo = _appInfoAsXml[i];
try
{
_appInfo[i] = AppinfoDocument.Factory.
parse(appInfo).getAppinfo();
}
catch(XmlException e)
{
// problem in the classfile
_appInfo[i] = AppinfoDocument.Factory.
newInstance().getAppinfo();
}
}
}
return _appInfo;
}
public XmlObject[] getUserInformation()
{
if (_documentation == null)
{
int n = _documentationAsXml.length;
_documentation = new DocumentationDocument.Documentation[n];
for (int i = 0; i < n; i++)
{
String doc = _documentationAsXml[i];
try
{
_documentation[i] = DocumentationDocument.Factory.
parse(doc).getDocumentation();
}
catch (XmlException e)
{
// problem in the classfile
_documentation[i] = DocumentationDocument.Factory.
newInstance().getDocumentation();
}
}
}
return _documentation;
}
public Attribute[] getAttributes()
{ return _attributes; }
public int getComponentType()
{ return ANNOTATION; }
public SchemaTypeSystem getTypeSystem()
{ return _container != null ? _container.getTypeSystem() : null; }
SchemaContainer getContainer()
{ return _container; }
public QName getName()
{ return null; }
public SchemaComponent.Ref getComponentRef()
{ return null; }
public static SchemaAnnotationImpl getAnnotation(SchemaContainer c,
Annotated elem)
{
AnnotationDocument.Annotation ann = elem.getAnnotation();
return getAnnotation(c, elem, ann);
}
public static SchemaAnnotationImpl getAnnotation(SchemaContainer c,
XmlObject elem, AnnotationDocument.Annotation ann)
{
// Check option
if (StscState.get().noAnn())
return null;
SchemaAnnotationImpl result = new SchemaAnnotationImpl(c);
// Retrieving attributes, first attributes on the enclosing element
ArrayList attrArray = new ArrayList(2);
addNoSchemaAttributes(elem, attrArray);
if (ann == null)
{
if (attrArray.size() == 0)
return null; // no annotation present
// no annotation element present, but attributes on the enclosing
// element present, so we have an annotation component
result._appInfo = new AppinfoDocument.Appinfo[0];
result._documentation = new DocumentationDocument.Documentation[0];
}
else
{
result._appInfo = ann.getAppinfoArray();
result._documentation = ann.getDocumentationArray();
// Now the attributes on the annotation element
addNoSchemaAttributes(ann, attrArray);
}
result._attributes =
(AttributeImpl[]) attrArray.toArray(new AttributeImpl[attrArray.size()]);
return result;
}
private static void addNoSchemaAttributes(XmlObject elem, List attrList)
{
XmlCursor cursor = elem.newCursor();
boolean hasAttributes = cursor.toFirstAttribute();
while (hasAttributes)
{
QName name = cursor.getName();
String namespaceURI = name.getNamespaceURI();
if ("".equals(namespaceURI) ||
"http://www.w3.org/2001/XMLSchema".equals(namespaceURI))
; // no nothing
else
{
String attValue = cursor.getTextValue();
String valUri;
String prefix;
if (attValue.indexOf(':') > 0)
prefix = attValue.substring(0, attValue.indexOf(':'));
else
prefix = "";
cursor.push();
cursor.toParent();
valUri = cursor.namespaceForPrefix(prefix);
cursor.pop();
attrList.add(new AttributeImpl(name, attValue, valUri)); //add the attribute
}
hasAttributes = cursor.toNextAttribute();
}
cursor.dispose();
}
private SchemaAnnotationImpl(SchemaContainer c)
{
_container = c;
}
/*package*/ SchemaAnnotationImpl(SchemaContainer c,
String[] aapStrings, String[] adocStrings,
Attribute[] aat)
{
_container = c;
_appInfoAsXml = aapStrings;
_documentationAsXml = adocStrings;
_attributes = aat;
}
/*package*/ static class AttributeImpl implements Attribute
{
private QName _name;
private String _value;
private String _valueUri;
/*package*/ AttributeImpl(QName name, String value, String valueUri)
{
_name = name;
_value = value;
_valueUri = valueUri;
}
public QName getName()
{ return _name; }
public String getValue()
{ return _value; }
public String getValueUri()
{ return _valueUri; }
}
}