Package org.talend.esb.servicelocator.client

Source Code of org.talend.esb.servicelocator.client.SimpleEndpoint

/*
* #%L
* Service Locator Client for CXF
* %%
* Copyright (C) 2011 - 2012 Talend Inc.
* %%
* 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.
* #L%
*/

package org.talend.esb.servicelocator.client;

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import javax.xml.transform.Result;
import javax.xml.transform.dom.DOMResult;

import org.talend.esb.servicelocator.client.ws.addressing.AttributedURIType;
import org.talend.esb.servicelocator.client.ws.addressing.EndpointReferenceType;
import org.talend.esb.servicelocator.client.ws.addressing.MetadataType;

import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class SimpleEndpoint implements Endpoint {

    private static final Logger LOG = Logger.getLogger(SimpleEndpoint.class.getName());

    private static final org.talend.esb.servicelocator.client.ws.addressing.ObjectFactory
    WSA_OBJECT_FACTORY = new org.talend.esb.servicelocator.client.ws.addressing.ObjectFactory();

    private static volatile JAXBContext jContext;

    private final QName sName;

    private String addr;

    private final BindingType binding;

    private final TransportType transport;

    private SLProperties props;

    public SimpleEndpoint(QName serviceName, String endpoint) {
        this(serviceName, endpoint, null);
    }

    public SimpleEndpoint(QName serviceName, String endpoint, SLProperties properties) {
        this(serviceName, endpoint, BindingType.SOAP11, TransportType.HTTP, properties);
    }

    public SimpleEndpoint(QName serviceName, String endpoint, BindingType bindingType,
            TransportType transportType, SLProperties properties) {
        sName = serviceName;
        addr = endpoint;
        binding = bindingType;
        transport = transportType;
        props = properties;
    }

    @Override
    public BindingType getBinding() {
        return binding;
    }

    @Override
    public TransportType getTransport() {
        return transport;
    }

    @Override
    public String getAddress() {
        return addr;
    }

    @Override
    public SLProperties getProperties() {
        return props;
    }

    public QName forService() {
        return sName;
    }

    @Override
    public QName getServiceName() {
        return forService();
    }

    @Override
    public void writeEndpointReferenceTo(Result result, PropertiesTransformer transformer)
        throws ServiceLocatorException {

        EndpointReferenceType epr = createEndpointReference(transformer);
        try {
            JAXBElement<EndpointReferenceType> ep =
                WSA_OBJECT_FACTORY.createEndpointReference(epr);
            JAXBContext jc =  getContext();
            jc.createMarshaller().marshal(ep, result);
        } catch (JAXBException e) {
            if (LOG.isLoggable(Level.SEVERE)) {
                LOG.log(Level.SEVERE,
                    "Failed to serialize endpoint data", e);
            }
            throw new ServiceLocatorException("Failed to serialize endpoint data", e);
        }
    }

    @Override
    public void addEndpointReference(Node parent) throws ServiceLocatorException {
        EndpointReferenceType wsAddr = createEndpointReference(null);

        try {
            JAXBElement<EndpointReferenceType> ep =
                WSA_OBJECT_FACTORY.createEndpointReference(wsAddr);
            JAXBContext jc = getContext();
            jc.createMarshaller().marshal(ep, parent);
        } catch (JAXBException e) {
            if (LOG.isLoggable(Level.SEVERE)) {
                LOG.log(Level.SEVERE,
                        "Failed to serialize endpoint data", e);
            }
            throw new ServiceLocatorException("Failed to serialize endpoint data", e);
        }
    }

    protected void init(String endpoint, SLProperties properties) {
        addr = endpoint;
        props = properties;
    }

    private EndpointReferenceType createEndpointReference(PropertiesTransformer transformer) {
        AttributedURIType endpoint = new AttributedURIType();
        endpoint.setValue(addr);
        EndpointReferenceType epr = new EndpointReferenceType();
        epr.setAddress(endpoint);
        if (props != null) {
            DOMResult result = new DOMResult();
            transformer.writePropertiesTo(props, result);
            Document docResult = (Document)result.getNode();
            MetadataType metadata = new MetadataType();
            epr.setMetadata(metadata);
           
            metadata.getAny().add(docResult.getDocumentElement());
        }
        return epr;
    }

    private static JAXBContext getContext() throws JAXBException{
        if (jContext == null) {
            jContext = JAXBContext.newInstance(
                    "org.talend.esb.servicelocator.client.ws.addressing:"
                            + "org.talend.esb.servicelocator.client.internal.endpoint",
                    SimpleEndpoint.class.getClassLoader());
        }
        return jContext;
    }

}
TOP

Related Classes of org.talend.esb.servicelocator.client.SimpleEndpoint

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.