/** * * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. * * 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.tuscany.model.scdl.loader.impl; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.wsdl.Definition; import javax.wsdl.WSDLException; import javax.wsdl.factory.WSDLFactory; import javax.wsdl.xml.WSDLReader; import org.apache.tuscany.common.resource.ResourceLoader; import org.apache.tuscany.model.assembly.AssemblyModelContext; import org.apache.tuscany.model.assembly.ComponentType; import org.apache.tuscany.model.assembly.Module; import org.apache.tuscany.model.assembly.ModuleFragment; import org.apache.tuscany.model.assembly.Subsystem; import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader; import org.apache.tuscany.model.scdl.loader.SCDLModelLoader; import org.apache.tuscany.model.util.ModelTransformer; import org.apache.tuscany.model.util.ModelTransformerImpl; import org.eclipse.emf.ecore.util.EcoreUtil; /** */ public class SCDLAssemblyModelLoaderImpl implements AssemblyModelLoader { private SCDLXMLReader xmlReader=new SCDLXMLReader(); private WSDLReader wsdlReader; private AssemblyModelContext modelContext; private List scdlModelLoaders; private Map componentTypes=new HashMap(); private Map modules=new HashMap(); private Map moduleFragments=new HashMap(); private Map subsystems=new HashMap(); private Map definitions=new HashMap(); private Map> definitionsByNamespace=new HashMap>(); /** * Constructor */ public SCDLAssemblyModelLoaderImpl(List loaders) { scdlModelLoaders=loaders!=null? loaders:new ArrayList(); } /** * @param modelContext The modelContext to set. */ public void setModelContext(AssemblyModelContext modelContext) { this.modelContext = modelContext; } /** * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadComponentType(java.lang.String) */ public ComponentType loadComponentType(String uri) { ComponentType componentType=componentTypes.get(uri); if (componentType!=null) return componentType; // Load the SCDL component type org.apache.tuscany.model.scdl.ComponentType scdlComponentType=xmlReader.getComponentType(uri); // Transform it to an assembly component type componentType=transform(scdlComponentType).getComponentType(); componentTypes.put(uri, componentType); return componentType; } /** * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadModule(java.lang.String) */ public Module loadModule(String uri) { Module module=modules.get(uri); if (module!=null) return module; // Load the SCDL module org.apache.tuscany.model.scdl.Module scdlModule=xmlReader.getModule(uri); // Transform it to an assembly module module=transform(scdlModule).getModule(); modules.put(uri, module); return module; } /** * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadModuleFragment(java.lang.String) */ public ModuleFragment loadModuleFragment(String uri) { ModuleFragment moduleFragment=moduleFragments.get(uri); if (moduleFragment!=null) return moduleFragment; // Load the SCDL module fragment org.apache.tuscany.model.scdl.ModuleFragment scdlFragment=xmlReader.getModuleFragment(uri); // Transform it to an assembly module fragment moduleFragment=transform(scdlFragment).getModuleFragment(); moduleFragments.put(uri, moduleFragment); return moduleFragment; } /** * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadSubsystem(java.lang.String) */ public Subsystem loadSubsystem(String uri) { Subsystem subsystem=subsystems.get(uri); if (subsystem!=null) return subsystem; // Load the SCDL subsystem org.apache.tuscany.model.scdl.Subsystem scdlSubsystem=xmlReader.getSubsystem(uri); subsystem=transform(scdlSubsystem).getSubsystem(); subsystems.put(uri, subsystem); return subsystem; } /** * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadDefinition(java.lang.String) */ public Definition loadDefinition(String uri) { Definition definition=definitions.get(uri); if (definition!=null) return definition; try { if (wsdlReader==null) wsdlReader=WSDLFactory.newInstance().newWSDLReader(); definition = wsdlReader.readWSDL(uri); } catch (WSDLException e) { throw new IllegalArgumentException(e); } if (definition==null) throw new IllegalArgumentException("Could not load WSDL definition at "+uri); definitions.put(uri, definition); String namespace=definition.getTargetNamespace(); List list=definitionsByNamespace.get(namespace); if (list==null) { list=new ArrayList(); definitionsByNamespace.put(namespace, list); } list.add(definition); return definition; } /** * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadDefinitions(java.lang.String) */ public List loadDefinitions(String namespace) { return definitionsByNamespace.get(namespace); } /** * Transform a model and return the handler containing the result of the transformation. * @param object * @return */ private SCDLModelContentHandlerImpl transform(Object object) { //FIXME Remove this dependency on EMF Iterator contents=EcoreUtil.getAllContents(Collections.singleton(object), true); ModelTransformer transformer=new ModelTransformerImpl(); SCDLModelContentHandlerImpl handler=new SCDLModelContentHandlerImpl(modelContext, scdlModelLoaders); transformer.transform(contents, handler); return handler; } }