Package org.apache.ws.jaxme.generator.ino.api4j

Source Code of org.apache.ws.jaxme.generator.ino.api4j.TaminoAPI4JSG$InoAttribute

/*
* Copyright 2003, 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.ws.jaxme.generator.ino.api4j;

import java.util.HashSet;
import java.util.Set;

import org.apache.ws.jaxme.JMElement;
import org.apache.ws.jaxme.generator.SchemaReader;
import org.apache.ws.jaxme.generator.sg.AttributeSG;
import org.apache.ws.jaxme.generator.sg.AttributeSGChain;
import org.apache.ws.jaxme.generator.sg.ObjectSG;
import org.apache.ws.jaxme.generator.sg.ObjectSGChain;
import org.apache.ws.jaxme.generator.sg.SGFactory;
import org.apache.ws.jaxme.generator.sg.SGFactoryChain;
import org.apache.ws.jaxme.generator.sg.SchemaSGChain;
import org.apache.ws.jaxme.generator.sg.TypeSG;
import org.apache.ws.jaxme.generator.sg.impl.AttributeSGImpl;
import org.apache.ws.jaxme.generator.sg.impl.JaxMeSchemaReader;
import org.apache.ws.jaxme.generator.sg.impl.ObjectSGChainImpl;
import org.apache.ws.jaxme.generator.sg.impl.SGFactoryChainImpl;
import org.apache.ws.jaxme.js.JavaQName;
import org.apache.ws.jaxme.js.JavaQNameImpl;
import org.apache.ws.jaxme.js.JavaSource;
import org.apache.ws.jaxme.pm.ino.InoObject;
import org.apache.ws.jaxme.pm.ino.InoResponseHandler;
import org.apache.ws.jaxme.xs.XSAnnotation;
import org.apache.ws.jaxme.xs.XSAttribute;
import org.apache.ws.jaxme.xs.XSElement;
import org.apache.ws.jaxme.xs.XSObject;
import org.apache.ws.jaxme.xs.XSSchema;
import org.apache.ws.jaxme.xs.XSType;
import org.apache.ws.jaxme.xs.jaxb.JAXBAttribute;
import org.apache.ws.jaxme.xs.jaxb.JAXBGlobalBindings;
import org.apache.ws.jaxme.xs.jaxb.JAXBJavadoc;
import org.apache.ws.jaxme.xs.jaxb.JAXBProperty;
import org.apache.ws.jaxme.xs.jaxb.JAXBSchemaBindings;
import org.apache.ws.jaxme.xs.jaxb.JAXBType;
import org.apache.ws.jaxme.xs.parser.XsObjectCreator;
import org.apache.ws.jaxme.xs.parser.impl.LocSAXException;
import org.apache.ws.jaxme.xs.types.XSString;
import org.apache.ws.jaxme.xs.xml.XsESchema;
import org.apache.ws.jaxme.xs.xml.XsObject;
import org.apache.ws.jaxme.xs.xml.XsObjectFactory;
import org.apache.ws.jaxme.xs.xml.XsQName;
import org.apache.ws.jaxme.xs.xml.impl.XsObjectImpl;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;

/**
* @author <a href="mailto:joe@ispsoft.de">Jochen Wiedmann</a>
*/
public class TaminoAPI4JSG extends SGFactoryChainImpl {
    public static final String TAMINOAPI4J_SCHEMA_URI = "http://ws.apache.org/jaxme/namespaces/jaxme2/TaminoAPI4J";
    private static final JavaQName INO_OBJECT_TYPE = JavaQNameImpl.getInstance(InoObject.class);
    private static final JavaQName JMELEMENT_TYPE = JavaQNameImpl.getInstance(JMElement.class);

    public class RaDetails extends XsObjectImpl {
        private String collection, jndiReference;
        RaDetails(XsObject pParent) {
            super(pParent);
        }
        public void setCollection(String pCollection) {
            collection = pCollection;
        }
        public String getCollection() {
            String p = "taminoapi4j.collection";
            return sgFactory.getGenerator().getProperty(p, collection);
        }
        public void setJndiReference(String pReference) {
            jndiReference = pReference;
        }
        public String getJndiReference() {
            String p = "taminoapi4j.jndiReference";
            return sgFactory.getGenerator().getProperty(p, jndiReference);
        }
    }

    private RaDetails raDetails;
    private SGFactory sgFactory;

    public TaminoAPI4JSG(SGFactoryChain o) {
        super(o);
    }

    public void setRaDetails(RaDetails pDetails) {
        raDetails = pDetails;
    }
    public RaDetails getRaDetails() {
        return raDetails;
    }
   
    public void init(SGFactory pFactory) {
        super.init(pFactory);
        sgFactory = pFactory;
        SchemaReader schemaReader = pFactory.getGenerator().getSchemaReader();
        if (schemaReader instanceof JaxMeSchemaReader) {
            JaxMeSchemaReader jaxmeSchemaReader = (JaxMeSchemaReader) schemaReader;
            jaxmeSchemaReader.addXsObjectCreator(new XsObjectCreator(){
                public XsObject newBean(XsObject pParent, Locator pLocator, XsQName pQName) throws SAXException {
                    if (pParent instanceof JAXBGlobalBindings) {
                        if (TAMINOAPI4J_SCHEMA_URI.equals(pQName.getNamespaceURI())) {
                            if ("raDetails".equals(pQName.getLocalName())) {
                                if (getRaDetails() != null) {
                                    throw new LocSAXException("An element named " + pQName + " has already been specified.",
                                                      pLocator);
                                }
                                RaDetails details = new RaDetails(pParent);
                                setRaDetails(details);
                                return details;
                            } else {
                                throw new LocSAXException("Invalid element name: " + pQName, pLocator);
                            }
                        }
                    }
                    return null;
                }
            });
        } else {
            throw new IllegalStateException("The schema reader " + schemaReader.getClass().getName() +
                    " is not an instance of " + JaxMeSchemaReader.class.getName());
        }
    }

    public Object newSchemaSG(SGFactory pController, XSSchema pSchema) throws SAXException {
        SchemaSGChain chain = (SchemaSGChain) super.newSchemaSG(pController, pSchema);
        chain = new TaminoAPI4JSchemaSG(chain, this);
        return chain;
    }

    private class InoJAXBProperty implements JAXBProperty {
        private final String name;
        public InoJAXBProperty(String pName) {
            name = pName;
        }
        public String getName() { return name; }
        public String getCollectionType() { return null; }
        public Boolean isFixedAttributeAsConstantProperty() { return null; }
        public Boolean isGenerateIsSetMethod() { return null; }
        public Boolean isEnableFailFastCheck() { return null; }
        public JAXBJavadoc getJavadoc() { return null; }
        public BaseType getBaseType() { return null; }
        public XsESchema getXsESchema() { return null; }
        public boolean isTopLevelObject() { return false; }
        public XsObject getParentObject() { return null; }
        public XsObjectFactory getObjectFactory() { return null; }
        public Locator getLocator() { return null; }
        public void validate() throws SAXException {
        }
    }

    private class InoAttribute implements JAXBAttribute {
        private final XsQName qName;
        private final XSType type;
        private final XSType parent;
        private final JAXBProperty jaxbProperty;

        public InoAttribute(XSType pParent, XsQName pName, XSType pType, String pPropertyName) {
            qName = pName;
            type = pType;
            parent = pParent;
            jaxbProperty = new InoJAXBProperty(pPropertyName);
        }
        public boolean isGlobal() { return true; }
        public XsQName getName() { return qName; }
        public XSType getType() { return type; }
        public boolean isOptional() { return true; }
        public XSAnnotation[] getAnnotations() { return new XSAnnotation[0]; }
        public String getDefault() { return null; }
        public String getFixed() { return null; }
        public Attributes getOpenAttributes() { return new AttributesImpl(); }
        public XSSchema getXSSchema() { return parent.getXSSchema(); }
        public boolean isTopLevelObject() { return true; }
        public XSObject getParentObject() { return null; }
        public Locator getLocator() { return parent.getLocator(); }
        public void validate() throws SAXException {
        }
        public JAXBSchemaBindings getJAXBSchemaBindings() {
            return ((JAXBType) parent).getJAXBSchemaBindings();
        }
        public JAXBProperty getJAXBProperty() {
            return jaxbProperty;
        }
    }

    protected void addAttribute(TypeSG pComplexTypeSG, XSType pParent,
                XsQName pName, XSType pType, String pPropertyName)
        throws SAXException {
        AttributeSG[] attrs = pComplexTypeSG.getComplexTypeSG().getAttributes();
        for (int i = 0;  i < attrs.length;  i++) {
            AttributeSG attr = attrs[i];
            if (attr.isWildcard()) {
                continue;
            }
      XsQName qName = attr.getName();
      if (qName.equals(pName)) {
          return;
            }
        }

        XSAttribute attribute = new InoAttribute(pParent, pName, pType, pPropertyName);
        AttributeSGChain chain = (AttributeSGChain) pComplexTypeSG.getComplexTypeSG().newAttributeSG(attribute);
        AttributeSG attributeSG = new AttributeSGImpl(chain);
        pComplexTypeSG.getComplexTypeSG().addAttributeSG(attributeSG);
    }

    public Object newObjectSG(SGFactory pFactory, XSElement pElement) throws SAXException {
        ObjectSGChain chain = (ObjectSGChain) super.newObjectSG(pFactory, pElement);
        chain = new ObjectSGChainImpl(chain){
            public JavaSource getXMLImplementation(ObjectSG pController) throws SAXException {
                JavaSource result = super.getXMLImplementation(pController);
                JavaQName[] interfaces = result.getImplements();
                boolean done = false;
                result.clearImplements();
                for (int i = 0;  i < interfaces.length;  i++) {
                    JavaQName interfaceName = interfaces[i];
                    if (interfaceName.equals(JMELEMENT_TYPE||
                        interfaceName.equals(INO_OBJECT_TYPE)) {
                        if (!done) {
                            result.addImplements(INO_OBJECT_TYPE);
                            done = true;
                        }
                    } else {
                        result.addImplements(interfaceName);
                    }
                }
                if (!done) {
                    result.addImplements(INO_OBJECT_TYPE);
                }
                return result;
            }
        };
        return chain;
    }

    private Set elementNames = new HashSet();
    public ObjectSG getObjectSG(SGFactory pFactory, XSElement pElement) throws SAXException {
        ObjectSG result = super.getObjectSG(pFactory, pElement);
        if (result.getTypeSG().isComplex()) {
          XsQName elementName = pElement.getName();
          if (!elementNames.contains(elementName)) {
              elementNames.add(elementName);
            // Does the element have an ino:id attribute? If not, create it
            XsQName qName = new XsQName(InoResponseHandler.INO_RESPONSE2_URI, "id", "ino");
            XSType stringType = XSString.getInstance();
            addAttribute(result.getTypeSG(), pElement.getType(), qName, stringType, "inoId");
            // Does the element have an ino:docname attribute? If not, create it
            qName = new XsQName(InoResponseHandler.INO_RESPONSE2_URI, "docname", "ino");
            addAttribute(result.getTypeSG(), pElement.getType(), qName, stringType, "inoDocname");
          }
        }
        return result;
    }
}
TOP

Related Classes of org.apache.ws.jaxme.generator.ino.api4j.TaminoAPI4JSG$InoAttribute

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.