/*
* 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.tuscany.sca.assembly.xml;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import org.apache.tuscany.sca.assembly.Binding;
import org.apache.tuscany.sca.assembly.Component;
import org.apache.tuscany.sca.assembly.ComponentReference;
import org.apache.tuscany.sca.assembly.ComponentService;
import org.apache.tuscany.sca.assembly.Composite;
import org.apache.tuscany.sca.assembly.Endpoint;
import org.apache.tuscany.sca.assembly.EndpointReference;
import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
import org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
import org.apache.tuscany.sca.contribution.processor.ContributionWriteException;
import org.apache.tuscany.sca.contribution.processor.ProcessorContext;
import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
import org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor;
import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.core.FactoryExtensionPoint;
/**
*
*/
public class EndpointReferenceProcessor extends BaseAssemblyProcessor implements StAXArtifactProcessor<EndpointReference> {
private final static String ENDPOINT_REFERENCE = "endpointReference";
private final static QName ENDPOINT_REFERENCE_QNAME = new QName(Constants.SCA11_TUSCANY_NS, ENDPOINT_REFERENCE);
private ExtensionPointRegistry registry;
public EndpointReferenceProcessor(ExtensionPointRegistry registry,
StAXArtifactProcessor extensionProcessor,
StAXAttributeProcessor extensionAttributeProcessor) {
super(modelFactories(registry), extensionProcessor);
this.registry = registry;
}
/**
* Returns the model factory extension point to use.
*
* @param extensionPoints
* @return
*/
private static FactoryExtensionPoint modelFactories(ExtensionPointRegistry extensionPoints) {
return extensionPoints.getExtensionPoint(FactoryExtensionPoint.class);
}
public QName getArtifactType() {
return ENDPOINT_REFERENCE_QNAME;
}
public EndpointReference read(XMLStreamReader reader, ProcessorContext context) throws ContributionReadException, XMLStreamException {
EndpointReference endpointReference = assemblyFactory.createEndpointReference();
if (reader.getEventType() == XMLStreamConstants.START_DOCUMENT) {
reader.nextTag();
}
Object model = extensionProcessor.read(reader, context);
if (model instanceof Composite) {
Composite composite = (Composite)model;
Component component = composite.getComponents().get(0);
ComponentReference reference = component.getReferences().get(0);
Binding binding = reference.getBindings().get(0);
endpointReference.setComponent(component);
endpointReference.setReference(reference);
reference.getEndpointReferences().add(endpointReference);
endpointReference.setBinding(binding);
// set up the EPR so that resolution will happen
// at wire creation time if needs be
Endpoint endpoint = assemblyFactory.createEndpoint();
endpointReference.setTargetEndpoint(endpoint);
if (reference.getTargets().size() > 0){
// create a dummy endpoint with the URI set so that
// the endpoint registry will be consulted
endpoint.setUnresolved(true);
endpoint.setURI(reference.getTargets().get(0).getName());
endpointReference.setStatus(EndpointReference.Status.WIRED_TARGET_NOT_FOUND);
endpointReference.setUnresolved(true);
} else {
endpoint.setUnresolved(false);
endpoint.setBinding(reference.getBindings().get(0));
endpointReference.setStatus(EndpointReference.Status.RESOLVED_BINDING);
endpointReference.setUnresolved(false);
}
}
return endpointReference;
}
public void write(EndpointReference model, XMLStreamWriter writer, ProcessorContext context) throws ContributionWriteException, XMLStreamException {
extensionProcessor.write(wrap(model), writer, context);
}
private Composite wrap(EndpointReference endpointReference) {
try {
Composite composite = assemblyFactory.createComposite();
composite.setName(ENDPOINT_REFERENCE_QNAME);
composite.setLocal(false);
Component component = (Component)endpointReference.getComponent().clone();
composite.getComponents().add(component);
component.getReferences().clear();
component.getServices().clear();
ComponentReference reference = (ComponentReference)endpointReference.getReference().clone();
component.getReferences().add(reference);
reference.getBindings().clear();
Binding binding = (Binding)endpointReference.getBinding().clone();
reference.getBindings().add(binding);
//reference.setInterfaceContract(endpointReference.getInterfaceContract());
if (endpointReference.getStatus() != EndpointReference.Status.RESOLVED_BINDING){
ComponentService service = assemblyFactory.createComponentService();
service.setName(endpointReference.getTargetEndpoint().getURI());
reference.getTargets().clear();
reference.getTargets().add(service);
}
return composite;
} catch (CloneNotSupportedException e) {
return null;
}
}
public Class<EndpointReference> getModelType() {
return EndpointReference.class;
}
public void resolve(EndpointReference model, ModelResolver resolver, ProcessorContext context) throws ContributionResolveException {
}
}