Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses 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 org.apache.felix.scrplugin.xml;
 
 import java.io.File;
 import java.util.List;
 
 
ComponentDescriptorIO is a helper class to read and write component descriptor files.
 
 public class ComponentDescriptorIO {
 
     private static final String PROPERTY_ATTR_TYPE = "type";

    
General attribute for the name (component, reference, property)
 
     private static final String ATTR_NAME = "name";
 
     private static final String ATTR_CARDINALITY = "cardinality";
 
     private static final String ATTR_DESCRIPTION = "description";
 
     private static final String ATTR_LABEL = "label";

    
The inner namespace - used for all inner elements.
 
     public static final String INNER_NAMESPACE_URI = "";

    
The prefix used for the namespace.
 
     private static final String PREFIX = "scr";

    
The root element.
 
     private static final String COMPONENTS = "components";

    
The component element.
 
     private static final String COMPONENT = "component";

    
The qualified component element.
 
     private static final String COMPONENT_QNAME =  + ':' + ;

    
The enabled attribute.
 
     private static final String COMPONENT_ATTR_ENABLED = "enabled";

    
Component: The policy attribute.
 
     private static final String COMPONENT_ATTR_POLICY = "configuration-policy";

    
Component: The factory attribute.
 
     private static final String COMPONENT_ATTR_FACTORY = "factory";

    
Component: The immediate attribute.
    private static final String COMPONENT_ATTR_IMMEDIATE = "immediate";

    
Component: The activate attribute.
    private static final String COMPONENT_ATTR_ACTIVATE = "activate";

    
Component: The deactivate attribute.
    private static final String COMPONENT_ATTR_DEACTIVATE = "deactivate";

    
Component: The modified attribute.
    private static final String COMPONENT_ATTR_MODIFIED = "modified";

    
Component: The configuration pid attribute.
    private static final String COMPONENT_ATTR_CONFIGURATION_PID = "configuration-pid";
    private static final String IMPLEMENTATION = "implementation";
    private static final String IMPLEMENTATION_QNAME = ;
    private static final String IMPLEMENTATION_ATTR_CLASS = "class";
    private static final String SERVICE = "service";
    private static final String SERVICE_QNAME = ;
    private static final String SERVICE_ATTR_FACTORY = "servicefactory";
    private static final String PROPERTY = "property";
    private static final String PROPERTY_QNAME = ;
    private static final String PROPERTY_ATTR_VALUE = "value";
    private static final String PROPERTY_ATTR_PRIVATE = "private";
    private static final String REFERENCE = "reference";
    private static final String REFERENCE_QNAME = ;
    private static final String REFERENCE_ATTR_POLICY = "policy";
    private static final String REFERENCE_ATTR_POLICY_OPTION = "policy-option";
    private static final String REFERENCE_ATTR_UPDATED = "updated";
    private static final String REFERENCE_ATTR_UNBIND = "unbind";
    private static final String REFERENCE_ATTR_BIND = "bind";
    private static final String REFERENCE_ATTR_TARGET = "target";
    private static final String REFERENCE_ATTR_STRATEGY = "strategy";
    private static final String INTERFACE = "provide";
    private static final String INTERFACE_QNAME = ;
    private static final String INTERFACE_ATTR_NAME = "interface";
    private static final String PROPERTIES = "properties";
    public static List<ClassDescriptionread(final InputStream file,
            final ClassLoader classLoader,
            final IssueLog iLogfinal String locationthrows SCRDescriptorException {
        try {
            final XmlHandler xmlHandler = new XmlHandler(classLoaderiLoglocation);
            IOUtils.parse(filexmlHandler);
            return xmlHandler.components;
        } catch (final TransformerException e) {
            throw new SCRDescriptorException("Unable to read xml"locatione);
        }
    }

    
Generate the xml top level element and start streaming the components.

Parameters:
components
contentHandler
Throws:
org.xml.sax.SAXException
    private static void generateXML(final DescriptionContainer module,
            final List<ComponentContainercomponents,
            final File descriptorFile,
            final Log loggerthrows SAXExceptionIOExceptionTransformerException {
        logger.info("Writing " + components.size() + " Service Component Descriptors to "
                + descriptorFile);
        final ContentHandler contentHandler = IOUtils.getSerializer(descriptorFile);
        // detect namespace to use
        final String namespace = module.getOptions().getSpecVersion().getNamespaceUrl();
        contentHandler.startDocument();
        contentHandler.startPrefixMapping(namespace);
        IOUtils.newline(contentHandler);
        // wrapper element to generate well formed xml if 0 or more than 1 component
        int startIndent = 0;
        if ( components.size() != 1 ) {
            contentHandler.startElement(""..new AttributesImpl());
            IOUtils.newline(contentHandler);
            startIndent = 1;
        }
        for (final ComponentContainer component : components) {
            generateXML(namespacemodulecomponentcontentHandlerstartIndent);
        }
        // end wrapper element
        if ( components.size() != 1 ) {
            contentHandler.endElement(""..);
            IOUtils.newline(contentHandler);
        }
        contentHandler.endPrefixMapping();
        contentHandler.endDocument();
    }

    
Write the xml for a Component

Parameters:
component
contentHandler
Throws:
org.xml.sax.SAXException
    private static void generateXML(final String namespace,
            final DescriptionContainer module,
            final ComponentContainer container,
            final ContentHandler contentHandler,
            final int indent)
    throws SAXException {
        final ComponentDescription component = container.getComponentDescription();
        final AttributesImpl ai = new AttributesImpl();
        IOUtils.addAttribute(aicomponent.getEnabled());
        IOUtils.addAttribute(aicomponent.getImmediate());
        IOUtils.addAttribute(aicomponent.getName());
        IOUtils.addAttribute(aicomponent.getFactory());
        // attributes new in 1.1
        if (module.getOptions().getSpecVersion().ordinal() >= ..ordinal() ) {
            if ( component.getConfigurationPolicy() != null
                    && component.getConfigurationPolicy() != . ) {
                IOUtils.addAttribute(aicomponent.getConfigurationPolicy().name().toLowerCase());
            }
            IOUtils.addAttribute(aicomponent.getActivate());
            IOUtils.addAttribute(aicomponent.getDeactivate());
            IOUtils.addAttribute(aicomponent.getModified());
        }
        // attributes new in 1.2
        if ( module.getOptions().getSpecVersion().ordinal() >= ..ordinal() ) {
            if ( component.getConfigurationPid() != null && !component.getConfigurationPid().equals(component.getName())) {
                IOUtils.addAttribute(aicomponent.getConfigurationPid());
            }
        }
        IOUtils.indent(contentHandlerindent);
        contentHandler.startElement(namespace..ai);
        IOUtils.newline(contentHandler);
        generateImplementationXML(containercontentHandlerindent+1);
        if (container.getServiceDescription() != null) {
            generateServiceXML(container.getServiceDescription(), contentHandlerindent+1);
        }
        for (final PropertyDescription property : container.getProperties().values()) {
            generatePropertyXML(propertycontentHandlerindent+1);
        }
        for (final ReferenceDescription reference : container.getReferences().values()) {
            generateReferenceXML(componentmodulereferencecontentHandlerindent+1);
        }
        IOUtils.indent(contentHandlerindent);
        IOUtils.newline(contentHandler);
    }

    
Write the xml for an Implementation.

Parameters:
implementation
contentHandler
Throws:
org.xml.sax.SAXException
    private static void generateImplementationXML(final ComponentContainer component,
            final ContentHandler contentHandler,
            final int indent)
    throws SAXException {
        final AttributesImpl ai = new AttributesImpl();
        IOUtils.indent(contentHandlerindent);
                .ai);
                .);
        IOUtils.newline(contentHandler);
    }

    
Write the xml for a service.

Parameters:
service
contentHandler
Throws:
org.xml.sax.SAXException
    private static void generateServiceXML(
            final ServiceDescription service,
            final ContentHandler contentHandler,
            final int indent)
    throws SAXException {
        final AttributesImpl ai = new AttributesImpl();
        IOUtils.addAttribute(ai, String.valueOf(service.isServiceFactory()));
        IOUtils.indent(contentHandlerindent);
        if (service.getInterfaces() != null && service.getInterfaces().size() > 0) {
            IOUtils.newline(contentHandler);
            for (final String interf : service.getInterfaces()) {
                generateServiceXML(interfcontentHandlerindent+1);
            }
            IOUtils.indent(contentHandlerindent);
        }
        IOUtils.newline(contentHandler);
    }

    
Write the xml for a interface

Parameters:
interf
contentHandler
Throws:
org.xml.sax.SAXException
    private static void generateServiceXML(final String interfaceName,
            final ContentHandler contentHandler,
            final int indent)
    throws SAXException {
        final AttributesImpl ai = new AttributesImpl();
        IOUtils.addAttribute(aiinterfaceName);
        IOUtils.indent(contentHandlerindent);
                ai);
        IOUtils.newline(contentHandler);
    }

    
Write the xml for a property.

Parameters:
property
contentHandler
Throws:
org.xml.sax.SAXException
    private static void generatePropertyXML(final PropertyDescription property,
            final ContentHandler contentHandler,
            final int indent)
    throws SAXException {
        final AttributesImpl ai = new AttributesImpl();
        IOUtils.addAttribute(aiproperty.getName());
        if ( property.getType() != . && property.getType() != .) {
            IOUtils.addAttribute(aiproperty.getType());
        }
        String value = property.getValue();
        if ( value != null ) {
            if ( property.getType() == . || property.getType() == . ) {
                value = String.valueOf((int)value.charAt(0));
            }
            IOUtils.addAttribute(aivalue);
        }
        IOUtils.indent(contentHandlerindent);
        if (property.getMultiValue() != null && property.getMultiValue().length > 0) {
            // generate a new line first
            IOUtils.text(contentHandler"\n");
            for (int i = 0; i < property.getMultiValue().lengthi++) {
                IOUtils.indent(contentHandlerindent + 1);
                value = property.getMultiValue()[i];
                if ( property.getType() == . || property.getType() == . ) {
                    value = String.valueOf((int)value.charAt(0));
                }
                IOUtils.text(contentHandlervalue);
                IOUtils.newline(contentHandler);
            }
            IOUtils.indent(contentHandlerindent);
        }
        IOUtils.newline(contentHandler);
    }

    
Write the xml for a Reference.

Parameters:
reference
contentHandler
Throws:
org.xml.sax.SAXException
    private static void generateReferenceXML(final ComponentDescription component,
            final DescriptionContainer module,
            final ReferenceDescription reference,
            final ContentHandler contentHandler,
            final int indent)
    throws SAXException {
        final AttributesImpl ai = new AttributesImpl();
        IOUtils.addAttribute(aireference.getName());
        IOUtils.addAttribute(aireference.getInterfaceName());
        IOUtils.addAttribute(aireference.getCardinality().getCardinalityString());
        IOUtils.addAttribute(aireference.getPolicy().name().toLowerCase());
        IOUtils.addAttribute(aireference.getTarget());
        IOUtils.addAttribute(aireference.getBind());
        IOUtils.addAttribute(aireference.getUnbind());
        // attributes new in 1.1-felix (FELIX-1893)
        if (module.getOptions().getSpecVersion().ordinal() >= ..ordinal() ) {
            IOUtils.addAttribute(aireference.getUpdated());
        }
        // attributes new in 1.2
        if (module.getOptions().getSpecVersion().ordinal() >= ..ordinal() ) {
            if ( reference.getPolicyOption() != . ) {
                IOUtils.addAttribute(aireference.getPolicyOption().name().toLowerCase());
            }
        }
        IOUtils.indent(contentHandlerindent);
                ai);
        IOUtils.newline(contentHandler);
    }

    
A content handler for parsing the component descriptions.
    protected static final class XmlHandler extends DefaultHandler {

        
The components container.
        private final List<ClassDescriptioncomponents = new ArrayList<ClassDescription>();

        
Spec version.
        private SpecVersion specVersion;

        
A reference to the current class.
        private ClassDescription currentClass;

        
A reference to the current component.
        private ComponentDescription currentComponent;

        
The current service.
        private ServiceDescription currentService;

        
Pending property.
        private PropertyDescription pendingProperty;

        
Flag for detecting the first element.
        private boolean firstElement = true;

        
Flag for elements inside a component element
        private boolean isComponent = false;

        
Override namespace.
        private String overrideNamespace;

        
The issue log.
        private final IssueLog iLog;

        
XML file location.
        private final String location;

        
Classloader.
        private final ClassLoader classLoader;
        public XmlHandler(final ClassLoader classLoaderfinal IssueLog iLogfinal String loc) {
            this. = iLog;
            this. = loc;
            this. = classLoader;
        }

        
        @Override
        public void startElement(String urifinal String localNamefinal String namefinal Attributes attributes)
                throws SAXException {
            // according to the spec, the elements should have the namespace,
            // except when the root element is the "component" element
            // So we check this for the first element, we receive.
            if (this.) {
                this. = false;
                if (localName.equals() && "".equals(uri)) {
                    this. = ..getNamespaceUrl();
                }
            }
            if (this. != null && "".equals(uri)) {
                uri = this.;
            }
            // however the spec also states that the inner elements
            // of a component are unqualified, so they don't have
            // the namespace - we allow both: with or without namespace!
            if (this. && "".equals(uri)) {
                uri = ..getNamespaceUrl();
            }
            // from here on, uri has the namespace regardless of the used xml format
             = SpecVersion.fromNamespaceUrl(uri);
            if ( != null) {
                if (localName.equals()) {
                    this. = true;
                    final ComponentDescription desc = new ComponentDescription(null);
                    desc.setName(attributes.getValue());
                    // enabled attribute is optional
                    if (attributes.getValue() != null) {
                        desc.setEnabled(Boolean.valueOf(attributes.getValue()));
                    }
                    // immediate attribute is optional
                    if (attributes.getValue() != null) {
                        desc.setImmediate(Boolean.valueOf(attributes.getValue()));
                    }
                    desc.setFactory(attributes.getValue());
                    desc.setConfigurationPolicy(.);
                    // check for version 1.1 attributes
                    if (.ordinal() >= ..ordinal()) {
                        final String policy = attributes.getValue();
                        if ( policy != null ) {
                            try {
                                desc.setConfigurationPolicy(ComponentConfigurationPolicy.valueOf(policy.toUpperCase()));
                            } catch (final IllegalArgumentException iae) {
                                .addWarning("Invalid value for attribute " +  + " : " + policythis.);
                            }
                        }
                        if ( attributes.getValue() != null ) {
                            desc.setActivate(attributes.getValue());
                        }
                        if ( attributes.getValue() != null ) {
                            desc.setDeactivate(attributes.getValue());
                        }
                        if ( attributes.getValue() != null ) {
                            desc.setModified(attributes.getValue());
                        }
                    }
                    this. = desc;
                } else if (localName.equals()) {
                    // now we can create the class description and attach the component description
                    // Set the implementation class name (mandatory)
                    final String className = attributes.getValue();
                    Class<?> cl = null;
                    try {
                        cl = this..loadClass(className);
                    } catch (final Throwable e) {
                        // this doesn't have an effect as the classes we processed are loaded
                        // anyway.
                    }
                    this. = new ClassDescription(cl"classpath:" + className);
                    this..add(this.);
                    this..add(this.);
                } else if (localName.equals()) {
                    // read the property, unless it is the service.pid
                    // property which must not be inherited
                    final String propName = attributes.getValue();
                    if (!.....equals(propName)) {
                        final PropertyDescription prop = new PropertyDescription(null);
                        prop.setName(propName);
                        final String type = attributes.getValue();
                        if ( type != null ) {
                            try {
                                prop.setType(PropertyType.valueOf(type));
                            } catch (final IllegalArgumentException iae) {
                                .addWarning("Invalid value for attribute type : " + typethis.);
                            }
                        }
                        if ( prop.getType() == null ) {
                            prop.setType(.);
                        }
                        if (attributes.getValue() != null) {
                            if ( prop.getType() == . || prop.getType() == . ) {
                                final int val = Integer.valueOf(attributes.getValue());
                                final Character c = Character.valueOf((char)val);
                                prop.setValue(c.toString());
                            } else {
                                prop.setValue(attributes.getValue());
                            }
                            this..add(prop);
                        } else {
                            // hold the property pending as we have a multi value
                            this. = prop;
                        }
                        // check for abstract properties
                        prop.setLabel(attributes.getValue());
                        prop.setDescription(attributes.getValue());
                        final String cardinality = attributes.getValue();
                        prop.setUnbounded(.);
                        if ( cardinality != null ) {
                            prop.setCardinality(Integer.valueOf(cardinality));
                            if ( prop.getCardinality() == . ) {
                                prop.setCardinality(0);
                                prop.setUnbounded(.);
                            } else if ( prop.getCardinality() == . ) {
                                prop.setCardinality(0);
                                prop.setUnbounded(.);
                            }
                        }
                        final String pValue = attributes.getValue();
                        if (pValue != null) {
                            prop.setPrivate(Boolean.valueOf(pValue));
                        }
                    }
                } else if (localName.equals()) {
                    // TODO: implement the properties tag
                } else if (localName.equals()) {
                    this. = new ServiceDescription(null);
                    this..add(this.);
                    if (attributes.getValue() != null) {
                        this..setServiceFactory(Boolean.valueOf(attributes.getValue()));
                    }
                } else if (localName.equals()) {
                    this..addInterface(attributes.getValue());
                } else if (localName.equals()) {
                    final ReferenceDescription ref = new ReferenceDescription(null);
                    ref.setName(attributes.getValue());
                    ref.setInterfaceName(attributes.getValue());
                    final String cardinality = attributes.getValue();
                    if ( cardinality != null ) {
                        ref.setCardinality(ReferenceCardinality.fromValue(cardinality));
                        if ( ref.getCardinality() == null ) {
                            .addWarning("Invalid value for attribute cardinality : " + cardinalitythis.);
                        }
                    }
                    ref.setPolicy(.);
                    final String policy = attributes.getValue();
                    if ( policy != null ) {
                        try {
                            ref.setPolicy(ReferencePolicy.valueOf(policy.toUpperCase()));
                        } catch (final IllegalArgumentException iae) {
                            .addWarning("Invalid value for attribute policy : " + policythis.);
                        }
                    }
                    ref.setPolicyOption(.);
                    final String policyOption = attributes.getValue();
                    if ( policyOption != null ) {
                        try {
                            ref.setPolicyOption(ReferencePolicyOption.valueOf(policyOption.toUpperCase()));
                        } catch (final IllegalArgumentException iae) {
                            .addWarning("Invalid value for attribute policy-option : " + policyOptionthis.);
                        }
                    }
                    ref.setTarget(attributes.getValue());
                    if ( attributes.getValue() != null ) {
                        ref.setBind(attributes.getValue());
                    }
                    if ( attributes.getValue() != null ) {
                        ref.setUnbind(attributes.getValue());
                    }
                    if ( attributes.getValue() != null ) {
                        ref.setUnbind(attributes.getValue());
                    }
                    final String strategy = attributes.getValue();
                    if ( strategy != null ) {
                        try {
                            ref.setStrategy(ReferenceStrategy.valueOf(strategy.toUpperCase()));
                        } catch (final IllegalArgumentException iae) {
                            throw new SAXException("Invalid value for attribute strategy : " + strategy);
                        }
                    }
                    this..add(ref);
                }
            }
        }

        
        @Override
        public void endElement(String uriString localNameString namethrows SAXException {
            if (this. != null && "".equals(uri)) {
                uri = this.;
            }
            if (this. && "".equals(uri)) {
                uri = ..getNamespaceUrl();
            }
            if (SpecVersion.fromNamespaceUrl(uri) != null) {
                if (localName.equals()) {
                    this. = null;
                    this. = null;
                    this. = false;
                } else if (localName.equals() && this. != null) {
                    // now split the value
                    final String text = this..getValue();
                    if (text != null) {
                        final StringTokenizer st = new StringTokenizer(text);
                        final String[] values = new String[st.countTokens()];
                        int index = 0;
                        while (st.hasMoreTokens()) {
                            values[index] = st.nextToken();
                            if ( this..getType() == . || this..getType() == . ) {
                                final int val = Integer.valueOf(values[index]);
                                final Character c = Character.valueOf((char)val);
                                values[index] = c.toString();
                            }
                            index++;
                        }
                        this..setMultiValue(values);
                    }
                    this..add(this.);
                    this. = null;
                }
            }
        }

        
        @Override
        public void characters(char[] chint startint lengththrows SAXException {
            if (this. != null) {
                final String text = new String(chstartlength);
                if (this..getValue() == null) {
                    this..setValue(text);
                } else {
                    this..setValue(this..getValue() + text);
                }
            }
        }
    }
    private static final String PARENT_NAME = "OSGI-INF";

    
Generate descriptor file(s)
    public static List<StringgenerateDescriptorFiles(final DescriptionContainer modulefinal Options optionsfinal Log logger)
            throws SCRDescriptorExceptionSCRDescriptorFailureException {
        // get the list of all relevant containers
        final List<ComponentContainercomponents = new ArrayList<ComponentContainer>();
        for(final ComponentContainer container : module.getComponents()) {
            if (!container.getComponentDescription().isCreateDs()) {
                logger.debug("Ignoring descriptor for DS : " + container);
            } else if (!container.getComponentDescription().isAbstract()) {
                logger.debug("Adding descriptor for DS : " + container);
                components.add(container);
            }
        }
        // check descriptor file
        final File descriptorDir = options.getComponentDescriptorDirectory();
        // terminate if there is nothing else to write
        if (components.isEmpty()) {
            logger.debug("No Service Component Descriptors found in project.");
            // remove files if it exists
            if ( descriptorDir.exists() && !options.isIncremental()) {
                for(final File f : descriptorDir.listFiles()) {
                    if ( f.isFile() ) {
                        logger.debug("Removing obsolete service descriptor " + f);
                        f.delete();
                    }
                }
            }
            return null;
        }
        // finally the descriptors have to be written ....
        descriptorDir.mkdirs(); // ensure parent dir
        final List<StringfileNames = new ArrayList<String>();
        final List<ComponentContainerContainercontainers = ComponentContainerUtil.split(components);
        for(final ComponentContainerContainer ccc : containers) {
            final SpecVersion globalVersion = module.getOptions().getSpecVersion();
            SpecVersion sv = null;
            for(final ComponentContainer cc : ccc.components ) {
                if ( sv == null || sv.ordinal() < cc.getComponentDescription().getSpecVersion().ordinal() ) {
                    sv = cc.getComponentDescription().getSpecVersion();
                }
            }
            module.getOptions().setSpecVersion(sv);
            final File useFile = new File(descriptorDirccc.className + ".xml");
            try {
                ComponentDescriptorIO.generateXML(moduleccc.componentsuseFilelogger);
            } catch (final IOException e) {
                throw new SCRDescriptorException("Unable to generate xml"useFile.toString(), e);
            } catch (final TransformerException e) {
                throw new SCRDescriptorException("Unable to generate xml"useFile.toString(), e);
            } catch (final SAXException e) {
                throw new SCRDescriptorException("Unable to generate xml"useFile.toString(), e);
            }
            fileNames.add( + '/' + useFile.getName());
            module.getOptions().setSpecVersion(globalVersion);
        }
        return fileNames;
    }
New to GrepCode? Check out our FAQ X