Search in sources :

Example 1 with BindInfo

use of com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo in project jaxb-ri by eclipse-ee4j.

the class DefaultClassBinder method complexType.

@Override
public CElement complexType(XSComplexType type) {
    CElement ci = allow(type, type.getName());
    if (ci != null)
        return ci;
    // no customization is given -- do as the default binding.
    BindInfo bi = builder.getBindInfo(type);
    if (type.isGlobal()) {
        QName tagName = null;
        String className = deriveName(type);
        Locator loc = type.getLocator();
        if (getGlobalBinding().isSimpleMode()) {
            // in the simple mode, we may optimize it away
            XSElementDecl referer = getSoleElementReferer(type);
            if (referer != null && isCollapsable(referer)) {
                // if a global element contains
                // a collpsable complex type, we bind this element to a named one
                // and collapses element and complex type.
                tagName = getName(referer);
                className = deriveName(referer);
                loc = referer.getLocator();
            }
        }
        // by default, global ones get their own classes.
        JPackage pkg = selector.getPackage(type.getTargetNamespace());
        return new CClassInfo(model, pkg, className, loc, getTypeName(type), tagName, type, bi.toCustomizationList());
    } else {
        XSElementDecl element = type.getScope();
        if (element.isGlobal() && isCollapsable(element)) {
            if (builder.getBindInfo(element).get(BIClass.class) != null)
                // cause unnecessary wrapping
                return null;
            // which creates unnecessary classes
            return new CClassInfo(model, selector.getClassScope(), deriveName(element), element.getLocator(), null, getName(element), element, bi.toCustomizationList());
        }
        CElement parentType = selector.isBound(element, type);
        String className;
        CClassInfoParent scope;
        if (parentType != null && parentType instanceof CElementInfo && ((CElementInfo) parentType).hasClass()) {
            // special case where we put a nested 'Type' element
            scope = (CElementInfo) parentType;
            className = "Type";
        } else {
            // since the parent element isn't bound to a type, merge the customizations associated to it, too.
            // custs = CCustomizations.merge( custs, builder.getBindInfo(type.getScope()).toCustomizationList());
            className = builder.getNameConverter().toClassName(element.getName());
            BISchemaBinding sb = builder.getBindInfo(type.getOwnerSchema()).get(BISchemaBinding.class);
            if (sb != null)
                className = sb.mangleAnonymousTypeClassName(className);
            scope = selector.getClassScope();
        }
        return new CClassInfo(model, scope, className, type.getLocator(), null, null, type, bi.toCustomizationList());
    }
}
Also used : Locator(org.xml.sax.Locator) CClassInfo(com.sun.tools.xjc.model.CClassInfo) CElement(com.sun.tools.xjc.model.CElement) CClassInfoParent(com.sun.tools.xjc.model.CClassInfoParent) QName(javax.xml.namespace.QName) BISchemaBinding(com.sun.tools.xjc.reader.xmlschema.bindinfo.BISchemaBinding) JPackage(com.sun.codemodel.JPackage) CElementInfo(com.sun.tools.xjc.model.CElementInfo) XSElementDecl(com.sun.xml.xsom.XSElementDecl) BIClass(com.sun.tools.xjc.reader.xmlschema.bindinfo.BIClass) BindInfo(com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo)

Example 2 with BindInfo

use of com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo in project jaxb-ri by eclipse-ee4j.

the class DefaultClassBinder method allow.

/**
 * Checks if a component carries a customization to map it to a class.
 * If so, make it a class.
 *
 * @param defaultBaseName
 *      The token which will be used as the basis of the class name
 *      if the class name is not specified in the customization.
 *      This is usually the name of an element declaration, and so on.
 *
 *      This parameter can be null, in that case it would be an error
 *      if a name is not given by the customization.
 */
private CElement allow(XSComponent component, String defaultBaseName) {
    BIClass decl = null;
    if (component instanceof XSComplexType) {
        XSType complexType = (XSType) component;
        BIClass lastFoundRecursiveBiClass = null;
        if (complexType.getName() != null) {
            while (!schemas.getAnyType().equals(complexType)) {
                BindInfo bindInfo = builder.getBindInfo(complexType);
                BIClass biClass = bindInfo.get(BIClass.class);
                if (biClass != null && "true".equals(biClass.getRecursive()))
                    lastFoundRecursiveBiClass = biClass;
                complexType = complexType.getBaseType();
            }
        }
        // use this as biclass for current component
        decl = lastFoundRecursiveBiClass;
    }
    BindInfo bindInfo = builder.getBindInfo(component);
    if (decl == null) {
        decl = bindInfo.get(BIClass.class);
        if (decl == null)
            return null;
    }
    decl.markAsAcknowledged();
    // first consider binding to the class reference.
    String ref = decl.getExistingClassRef();
    if (ref != null) {
        if (!JJavaName.isFullyQualifiedClassName(ref)) {
            Ring.get(ErrorReceiver.class).error(decl.getLocation(), Messages.format(Messages.ERR_INCORRECT_CLASS_NAME, ref));
        // recover by ignoring @ref
        } else {
            if (component instanceof XSComplexType) {
                // UGLY UGLY UGLY
                // since we are not going to bind this complex type, we need to figure out
                // its binding mode without actually binding it (and also expose this otherwise
                // hidden mechanism into this part of the code.)
                // 
                // this code is potentially dangerous as the base class might have been bound
                // in different ways. To be correct, we need to figure out how the content type
                // would have been bound, from the schema.
                Ring.get(ComplexTypeFieldBuilder.class).recordBindingMode((XSComplexType) component, ComplexTypeBindingMode.NORMAL);
            }
            return new CClassRef(model, component, decl, bindInfo.toCustomizationList());
        }
    }
    String clsName = decl.getClassName();
    if (clsName == null) {
        // from the current component.
        if (defaultBaseName == null) {
            Ring.get(ErrorReceiver.class).error(decl.getLocation(), Messages.format(Messages.ERR_CLASS_NAME_IS_REQUIRED));
            // recover by generating a pseudo-random name
            defaultBaseName = "undefined" + component.hashCode();
        }
        clsName = builder.deriveName(defaultBaseName, component);
    } else {
        if (!JJavaName.isJavaIdentifier(clsName)) {
            // not a valid Java class name
            Ring.get(ErrorReceiver.class).error(decl.getLocation(), Messages.format(Messages.ERR_INCORRECT_CLASS_NAME, clsName));
            // recover by a dummy name
            clsName = "Undefined" + component.hashCode();
        }
    }
    QName typeName = null;
    QName elementName = null;
    if (component instanceof XSType) {
        XSType t = (XSType) component;
        typeName = getName(t);
    }
    if (component instanceof XSElementDecl) {
        XSElementDecl e = (XSElementDecl) component;
        elementName = getName(e);
    }
    if (component instanceof XSElementDecl && !isCollapsable((XSElementDecl) component)) {
        XSElementDecl e = ((XSElementDecl) component);
        CElementInfo cei = new CElementInfo(model, elementName, selector.getClassScope(), clsName, bindInfo.toCustomizationList(), decl.getLocation());
        selector.boundElements.put(e, cei);
        // referer is element
        stb.refererStack.push(component);
        cei.initContentType(selector.bindToType(e.getType(), e), e, e.getDefaultValue());
        stb.refererStack.pop();
        return cei;
    // TODO: support javadoc and userSpecifiedImplClass
    } else {
        CClassInfo bt = new CClassInfo(model, selector.getClassScope(), clsName, decl.getLocation(), typeName, elementName, component, bindInfo.toCustomizationList());
        // set javadoc class comment.
        if (decl.getJavadoc() != null)
            bt.javadoc = decl.getJavadoc() + "\n\n";
        // add extra blank lines so that the schema fragment
        // and user-specified javadoc would be separated
        // if the implClass is given, set it to ClassItem
        String implClass = decl.getUserSpecifiedImplClass();
        if (implClass != null)
            bt.setUserSpecifiedImplClass(implClass);
        return bt;
    }
}
Also used : ComplexTypeFieldBuilder(com.sun.tools.xjc.reader.xmlschema.ct.ComplexTypeFieldBuilder) XSType(com.sun.xml.xsom.XSType) CClassInfo(com.sun.tools.xjc.model.CClassInfo) XSComplexType(com.sun.xml.xsom.XSComplexType) CClassRef(com.sun.tools.xjc.model.CClassRef) QName(javax.xml.namespace.QName) CElementInfo(com.sun.tools.xjc.model.CElementInfo) XSElementDecl(com.sun.xml.xsom.XSElementDecl) ErrorReceiver(com.sun.tools.xjc.ErrorReceiver) BIClass(com.sun.tools.xjc.reader.xmlschema.bindinfo.BIClass) BindInfo(com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo)

Example 3 with BindInfo

use of com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo in project jaxb-ri by eclipse-ee4j.

the class BGMBuilder method _getBindInfoReadOnly.

/**
 * Gets the BindInfo object associated to a schema component.
 *
 * @return
 *      null if no bind info is associated to this schema component.
 */
private BindInfo _getBindInfoReadOnly(XSComponent schemaComponent) {
    BindInfo bi = externalBindInfos.get(schemaComponent);
    if (bi != null)
        return bi;
    XSAnnotation annon = schemaComponent.getAnnotation();
    if (annon != null) {
        bi = (BindInfo) annon.getAnnotation();
        if (bi != null) {
            if (bi.getOwner() == null)
                bi.setOwner(this, schemaComponent);
            return bi;
        }
    }
    return null;
}
Also used : XSAnnotation(com.sun.xml.xsom.XSAnnotation) BindInfo(com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo)

Example 4 with BindInfo

use of com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo in project jaxb-ri by eclipse-ee4j.

the class BGMBuilder method getOrCreateBindInfo.

/**
 * Gets or creates the BindInfo object associated to a schema component.
 *
 * @return
 *      Always return a non-null valid BindInfo object.
 *      Even if no declaration was specified, this method creates
 *      a new BindInfo so that new decls can be added.
 */
public BindInfo getOrCreateBindInfo(XSComponent schemaComponent) {
    BindInfo bi = _getBindInfoReadOnly(schemaComponent);
    if (bi != null)
        return bi;
    // XSOM is read-only, so we cannot add new annotations.
    // for components that didn't have annotations,
    // we maintain an external map.
    bi = new BindInfo();
    bi.setOwner(this, schemaComponent);
    externalBindInfos.put(schemaComponent, bi);
    return bi;
}
Also used : BindInfo(com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo)

Example 5 with BindInfo

use of com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo in project jaxb-ri by eclipse-ee4j.

the class SimpleTypeBuilder method detectJavaTypeCustomization.

/**
 * Detect "javaType" customizations placed directly on simple types, rather
 * than being enclosed by "property" and "baseType" customizations (see
 * sec 6.8.1 of the spec).
 *
 * Report an error if any exist.
 */
private void detectJavaTypeCustomization() {
    BindInfo info = builder.getBindInfo(getReferer());
    BIConversion conv = info.get(BIConversion.class);
    if (conv != null) {
        // ack this conversion to prevent further error messages
        conv.markAsAcknowledged();
        // report the error
        getErrorReporter().error(conv.getLocation(), Messages.ERR_UNNESTED_JAVATYPE_CUSTOMIZATION_ON_SIMPLETYPE);
    }
}
Also used : BIConversion(com.sun.tools.xjc.reader.xmlschema.bindinfo.BIConversion) BindInfo(com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo)

Aggregations

BindInfo (com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo)11 BIConversion (com.sun.tools.xjc.reader.xmlschema.bindinfo.BIConversion)3 XSElementDecl (com.sun.xml.xsom.XSElementDecl)3 ErrorReceiver (com.sun.tools.xjc.ErrorReceiver)2 CClassInfo (com.sun.tools.xjc.model.CClassInfo)2 CClassRef (com.sun.tools.xjc.model.CClassRef)2 CElementInfo (com.sun.tools.xjc.model.CElementInfo)2 BIClass (com.sun.tools.xjc.reader.xmlschema.bindinfo.BIClass)2 BIDeclaration (com.sun.tools.xjc.reader.xmlschema.bindinfo.BIDeclaration)2 XSComplexType (com.sun.xml.xsom.XSComplexType)2 QName (javax.xml.namespace.QName)2 Locator (org.xml.sax.Locator)2 JPackage (com.sun.codemodel.JPackage)1 CClassInfoParent (com.sun.tools.xjc.model.CClassInfoParent)1 CElement (com.sun.tools.xjc.model.CElement)1 CNonElement (com.sun.tools.xjc.model.CNonElement)1 TypeUse (com.sun.tools.xjc.model.TypeUse)1 BIEnum (com.sun.tools.xjc.reader.xmlschema.bindinfo.BIEnum)1 BIGlobalBinding (com.sun.tools.xjc.reader.xmlschema.bindinfo.BIGlobalBinding)1 BIProperty (com.sun.tools.xjc.reader.xmlschema.bindinfo.BIProperty)1