All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jlibs.xml.xsd.display.XSDisplayNameVisitor Maven / Gradle / Ivy

There is a newer version: 3.0.1
Show newest version
/**
 * Copyright 2015 Santhosh Kumar Tekuri
 *
 * The JLibs authors license this file to you 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 jlibs.xml.xsd.display;

import jlibs.core.graph.visitors.PathReflectionVisitor;
import jlibs.core.lang.ImpossibleException;
import jlibs.core.lang.StringUtil;
import jlibs.xml.XMLUtil;
import jlibs.xml.sax.helpers.MyNamespaceSupport;
import jlibs.xml.xsd.XSUtil;
import org.apache.xerces.xs.*;

/**
 * @author Santhosh Kumar T
 */
public class XSDisplayNameVisitor extends PathReflectionVisitor{
    XSPathDiplayFilter filter;
    private MyNamespaceSupport nsSupport;

    public XSDisplayNameVisitor(MyNamespaceSupport nsSupport, XSPathDiplayFilter filter){
        this.nsSupport = nsSupport;
        this.filter = filter;
    }

    @Override
    protected String getDefault(Object elem){
        return StringUtil.toString(elem);
    }

    protected String process(XSNamespaceItem nsItem){
        return StringUtil.toString(nsItem.getSchemaNamespace());
    }

    protected String process(XSObject obj){
        return XMLUtil.getQName(XSUtil.getQName(obj, nsSupport));
    }

    private String addCardinal(String str){
        if(!filter.select(path.getParentPath())){
            XSParticle particle = (XSParticle)path.getParentPath().getElement();
            return str+process(particle);
        }else
            return str;
    }

    protected String process(XSElementDeclaration elem){
        String str = '<'+process((XSObject)elem)+'>';
        return addCardinal(str);
    }
    
    protected String process(XSAttributeUse attrUse){
        String str = '@' + process((XSObject)attrUse);
        if(!attrUse.getRequired())
            str += '?';
        return str;
    }

    protected String process(XSParticle particle){
        if(particle.getMinOccurs()==0 && particle.getMaxOccursUnbounded())
            return "*";
        else if(particle.getMinOccurs()==1 && particle.getMaxOccursUnbounded())
            return "+";
        else if(particle.getMaxOccursUnbounded())
            return particle.getMinOccurs()+"+";
        else if(particle.getMinOccurs()==0 && particle.getMaxOccurs()==1)
            return "?";
        else
            return "["+particle.getMinOccurs()+","+particle.getMaxOccurs()+"]";
    }

    protected String process(XSModelGroup modelGroup){
        String str;
        switch(modelGroup.getCompositor()){
            case XSModelGroup.COMPOSITOR_ALL :
                str = "[ALL]";
                break;
            case XSModelGroup.COMPOSITOR_CHOICE :
                str =  "[OR]";
                break;
            case XSModelGroup.COMPOSITOR_SEQUENCE :
                str = "[SEQUENCE]";
                break;
            default:
                throw new ImpossibleException("Invalid Compositor: "+modelGroup.getCompositor());
        }
        return addCardinal(str);
    }

    protected String process(XSWildcard wildcard){
        String str;
        switch(wildcard.getConstraintType()){
            case XSWildcard.NSCONSTRAINT_ANY :
                str = "*:*";
                break;
            case XSWildcard.NSCONSTRAINT_LIST:
                StringBuilder buff = new StringBuilder();
                StringList list = wildcard.getNsConstraintList();
                for(int i=0; i0)
                        buff.append('|');
                    String prefix = nsSupport.findPrefix(item);
                    if(prefix!=null)
                        buff.append(prefix);
                    else
                        buff.append('{').append(item).append('}');
                }
                if(buff.toString().equals("{}"))
                    str = "*";
                else
                    str = buff+":*";
                break;
            case XSWildcard.NSCONSTRAINT_NOT:
                buff = new StringBuilder();
                list = wildcard.getNsConstraintList();
                for(int i=0; i0)
                        buff.append(',');
                    if(!StringUtil.isEmpty(prefix))
                        buff.append(prefix);
                    else{
                        buff.append('{').append(item).append('}');
                    }
                }
                if(!buff.toString().contains(","))
                    str = "!"+buff+":*";
                else
                    str = "!("+buff+"):*";
                break;
            default:
                throw new ImpossibleException("Invalid Constraint: "+wildcard.getConstraintType());
        }

        boolean attribute = false;
        if(path.getParentPath().getElement() instanceof XSElementDeclaration){
            XSElementDeclaration elem = (XSElementDeclaration)path.getParentPath().getElement();
            if(((XSComplexTypeDefinition)elem.getTypeDefinition()).getAttributeWildcard()==wildcard)
                attribute = true;
        }
        if(attribute)
            str = '@'+str;
        else
            str = '<'+str+'>';

        return addCardinal(str);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy