public static Descriptor buildDescriptor()

in jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/descriptor/DescriptorFactory.java [159:345]


    public static Descriptor buildDescriptor(final byte[] bytes) {
        try {
            // Validate descriptor
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XSD_SCHEMA_LANGUAGE);
            Schema schema = schemaFactory.newSchema(DescriptorFactory.class.getResource(JBI_DESCRIPTOR_XSD));
            Validator validator = schema.newValidator();
            validator.setErrorHandler(new ErrorHandler() {
                public void warning(SAXParseException exception) throws SAXException {
                    //log.debug("Validation warning on " + url + ": " + exception);
                }

                public void error(SAXParseException exception) throws SAXException {
                    //log.info("Validation error on " + url + ": " + exception);
                }

                public void fatalError(SAXParseException exception) throws SAXException {
                    throw exception;
                }
            });
            validator.validate(new StreamSource(new ByteArrayInputStream(bytes)));
            // Parse descriptor
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            DocumentBuilder docBuilder = factory.newDocumentBuilder();
            Document doc = docBuilder.parse(new ByteArrayInputStream(bytes));
            Element jbi = doc.getDocumentElement();
            Descriptor desc = new Descriptor();
            desc.setVersion(Double.parseDouble(getAttribute(jbi, VERSION)));
            Element child = getFirstChildElement(jbi);
            if (COMPONENT.equals(child.getLocalName())) {
                ComponentDesc component = new ComponentDesc();
                component.setType(child.getAttribute(TYPE));
                component.setComponentClassLoaderDelegation(getAttribute(child, COMPONENT_CLASS_LOADER_DELEGATION));
                component.setBootstrapClassLoaderDelegation(getAttribute(child, BOOTSTRAP_CLASS_LOADER_DELEGATION));
                List<SharedLibraryList> sls = new ArrayList<SharedLibraryList>();
                DocumentFragment ext = null;
                for (Element e = getFirstChildElement(child); e != null; e = getNextSiblingElement(e)) {
                    if (IDENTIFICATION.equals(e.getLocalName())) {
                        component.setIdentification(readIdentification(e));
                    } else if (COMPONENT_CLASS_NAME.equals(e.getLocalName())) {
                        component.setComponentClassName(getText(e));
                        component.setDescription(getAttribute(e, DESCRIPTION));
                    } else if (COMPONENT_CLASS_PATH.equals(e.getLocalName())) {
                        ClassPath componentClassPath = new ClassPath();
                        ArrayList<String> l = new ArrayList<String>();
                        for (Element e2 = getFirstChildElement(e); e2 != null; e2 = getNextSiblingElement(e2)) {
                            if (PATH_ELEMENT.equals(e2.getLocalName())) {
                                l.add(getText(e2));
                            }
                        }
                        componentClassPath.setPathList(l);
                        component.setComponentClassPath(componentClassPath);
                    } else if (BOOTSTRAP_CLASS_NAME.equals(e.getLocalName())) {
                        component.setBootstrapClassName(getText(e));
                    } else if (BOOTSTRAP_CLASS_PATH.equals(e.getLocalName())) {
                        ClassPath bootstrapClassPath = new ClassPath();
                        ArrayList<String> l = new ArrayList<String>();
                        for (Element e2 = getFirstChildElement(e); e2 != null; e2 = getNextSiblingElement(e2)) {
                            if (PATH_ELEMENT.equals(e2.getLocalName())) {
                                l.add(getText(e2));
                            }
                        }
                        bootstrapClassPath.setPathList(l);
                        component.setBootstrapClassPath(bootstrapClassPath);
                    } else if (SHARED_LIBRARY.equals(e.getLocalName())) {
                        SharedLibraryList sl = new SharedLibraryList();
                        sl.setName(getText(e));
                        sl.setVersion(getAttribute(e, VERSION));
                        sls.add(sl);
                    } else {
                        if (ext == null) {
                            ext = doc.createDocumentFragment();
                        }
                        ext.appendChild(e);
                    }
                }
                component.setSharedLibraries(sls.toArray(new SharedLibraryList[sls.size()]));
                if (ext != null) {
                    InstallationDescriptorExtension descriptorExtension = new InstallationDescriptorExtension();
                    descriptorExtension.setDescriptorExtension(ext);
                    component.setDescriptorExtension(descriptorExtension);
                }
                desc.setComponent(component);
            } else if (SHARED_LIBRARY.equals(child.getLocalName())) {
                SharedLibraryDesc sharedLibrary = new SharedLibraryDesc();
                sharedLibrary.setClassLoaderDelegation(getAttribute(child, CLASS_LOADER_DELEGATION));
                sharedLibrary.setVersion(getAttribute(child, VERSION));
                for (Element e = getFirstChildElement(child); e != null; e = getNextSiblingElement(e)) {
                    if (IDENTIFICATION.equals(e.getLocalName())) {
                        sharedLibrary.setIdentification(readIdentification(e));
                    } else if (SHARED_LIBRARY_CLASS_PATH.equals(e.getLocalName())) {
                        ClassPath sharedLibraryClassPath = new ClassPath();
                        ArrayList<String> l = new ArrayList<String>();
                        for (Element e2 = getFirstChildElement(e); e2 != null; e2 = getNextSiblingElement(e2)) {
                            if (PATH_ELEMENT.equals(e2.getLocalName())) {
                                l.add(getText(e2));
                            }
                        }
                        sharedLibraryClassPath.setPathList(l);
                        sharedLibrary.setSharedLibraryClassPath(sharedLibraryClassPath);
                    }
                }
                desc.setSharedLibrary(sharedLibrary);
            } else if (SERVICE_ASSEMBLY.equals(child.getLocalName())) {
                ServiceAssemblyDesc serviceAssembly = new ServiceAssemblyDesc();
                ArrayList<ServiceUnitDesc> sus = new ArrayList<ServiceUnitDesc>();
                for (Element e = getFirstChildElement(child); e != null; e = getNextSiblingElement(e)) {
                    if (IDENTIFICATION.equals(e.getLocalName())) {
                        serviceAssembly.setIdentification(readIdentification(e));
                    } else if (SERVICE_UNIT.equals(e.getLocalName())) {
                        ServiceUnitDesc su = new ServiceUnitDesc();
                        for (Element e2 = getFirstChildElement(e); e2 != null; e2 = getNextSiblingElement(e2)) {
                            if (IDENTIFICATION.equals(e2.getLocalName())) {
                                su.setIdentification(readIdentification(e2));
                            } else if (TARGET.equals(e2.getLocalName())) {
                                Target target = new Target();
                                for (Element e3 = getFirstChildElement(e2); e3 != null; e3 = getNextSiblingElement(e3)) {
                                    if (ARTIFACTS_ZIP.equals(e3.getLocalName())) {
                                        target.setArtifactsZip(getText(e3));
                                    } else if (COMPONENT_NAME.equals(e3.getLocalName())) {
                                        target.setComponentName(getText(e3));
                                    }
                                }
                                su.setTarget(target);
                            }
                        }
                        sus.add(su);
                    } else if (CONNECTIONS.equals(e.getLocalName())) {
                        Connections connections = new Connections();
                        ArrayList<Connection> cns = new ArrayList<Connection>();
                        for (Element e2 = getFirstChildElement(e); e2 != null; e2 = getNextSiblingElement(e2)) {
                            if (CONNECTION.equals(e2.getLocalName())) {
                                Connection cn = new Connection();
                                for (Element e3 = getFirstChildElement(e2); e3 != null; e3 = getNextSiblingElement(e3)) {
                                    if (CONSUMER.equals(e3.getLocalName())) {
                                        Consumer consumer = new Consumer();
                                        consumer.setInterfaceName(readAttributeQName(e3, INTERFACE_NAME));
                                        consumer.setServiceName(readAttributeQName(e3, SERVICE_NAME));
                                        consumer.setEndpointName(getAttribute(e3, ENDPOINT_NAME));
                                        cn.setConsumer(consumer);
                                    } else if (PROVIDER.equals(e3.getLocalName())) {
                                        Provider provider = new Provider();
                                        provider.setServiceName(readAttributeQName(e3, SERVICE_NAME));
                                        provider.setEndpointName(getAttribute(e3, ENDPOINT_NAME));
                                        cn.setProvider(provider);
                                    }
                                }
                                cns.add(cn);
                            }
                        }
                        connections.setConnections(cns.toArray(new Connection[cns.size()]));
                        serviceAssembly.setConnections(connections);
                    }
                }
                serviceAssembly.setServiceUnits(sus.toArray(new ServiceUnitDesc[sus.size()]));
                desc.setServiceAssembly(serviceAssembly);
            } else if (SERVICES.equals(child.getLocalName())) {
                Services services = new Services();
                services.setBindingComponent(Boolean.valueOf(getAttribute(child, BINDING_COMPONENT)).booleanValue());
                ArrayList<Provides> provides = new ArrayList<Provides>();
                ArrayList<Consumes> consumes = new ArrayList<Consumes>();
                for (Element e = getFirstChildElement(child); e != null; e = getNextSiblingElement(e)) {
                    if (PROVIDES.equals(e.getLocalName())) {
                        Provides p = new Provides();
                        p.setInterfaceName(readAttributeQName(e, INTERFACE_NAME));
                        p.setServiceName(readAttributeQName(e, SERVICE_NAME));
                        p.setEndpointName(getAttribute(e, ENDPOINT_NAME));
                        provides.add(p);
                    } else if (CONSUMES.equals(e.getLocalName())) {
                        Consumes c = new Consumes();
                        c.setInterfaceName(readAttributeQName(e, INTERFACE_NAME));
                        c.setServiceName(readAttributeQName(e, SERVICE_NAME));
                        c.setEndpointName(getAttribute(e, ENDPOINT_NAME));
                        c.setLinkType(getAttribute(e, LINK_TYPE));
                        consumes.add(c);
                    }
                }
                services.setProvides(provides.toArray(new Provides[provides.size()]));
                services.setConsumes(consumes.toArray(new Consumes[consumes.size()]));
                desc.setServices(services);
            }
            checkDescriptor(desc);
            return desc;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }