/* * #%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.internal; import java.util.List; 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 org.talend.esb.servicelocator.client.BindingType; import org.talend.esb.servicelocator.client.SLEndpoint; import org.talend.esb.servicelocator.client.SLProperties; import org.talend.esb.servicelocator.client.SLPropertiesImpl; import org.talend.esb.servicelocator.client.SimpleEndpoint; import org.talend.esb.servicelocator.client.TransportType; import org.talend.esb.servicelocator.client.internal.endpoint.EndpointDataType; import org.talend.esb.servicelocator.client.internal.endpoint.ServiceLocatorPropertiesType; import org.talend.esb.servicelocator.client.ws.addressing.EndpointReferenceType; import org.talend.esb.servicelocator.client.ws.addressing.MetadataType; import org.w3c.dom.Element; public class SLEndpointProvider extends SimpleEndpoint implements SLEndpoint { private static final Logger LOG = Logger.getLogger(SLEndpointProvider.class .getName()); private static final org.talend.esb.servicelocator.client.internal.endpoint.ObjectFactory SL_OBJECT_FACTORY = new org.talend.esb.servicelocator.client.internal.endpoint.ObjectFactory(); private static final String SERVICE_LOCATOR_PROPERTIES_NS = "http://talend.org/schemas/esb/locator/content/20011/11"; private static final String SERVICE_LOCATOR_PROPERTIES_LN = "ServiceLocatorProperties"; private final long lastTimeStarted; private final long lastTimeStopped; private final boolean isLive; public SLEndpointProvider(QName serviceName, EndpointDataType endpointData, boolean live) { super(serviceName, null, extractBinding(endpointData), extractTransport(endpointData), null); EndpointReferenceType epr = toEndPointReference((Element) endpointData.getEndpointReference()); init(extractAddress(epr), extractProperties(epr)); lastTimeStarted = endpointData.getLastTimeStarted(); lastTimeStopped = endpointData.getLastTimeStopped(); isLive = live; } @Override public long getLastTimeStarted() { return lastTimeStarted; } @Override public long getLastTimeStopped() { return lastTimeStopped; } @Override public boolean isLive() { return isLive; } @SuppressWarnings("unchecked") private EndpointReferenceType toEndPointReference(Element root) { EndpointReferenceType epr = null; if (root != null) { try { JAXBContext jc = JaxbContextHandler.getAddressingContext(); JAXBElement<EndpointReferenceType> eprElem = (JAXBElement<EndpointReferenceType>) jc.createUnmarshaller().unmarshal(root); epr = eprElem.getValue(); } catch (JAXBException e) { if (LOG.isLoggable(Level.SEVERE)) { LOG.log(Level.SEVERE, "Failed to deserialize endpoint reference", e); } } } else { LOG.log(Level.SEVERE, "No endpoint reference found in content"); } return epr != null ? epr : new EndpointReferenceType(); } private static String extractAddress(EndpointReferenceType epr) { return epr.getAddress() != null ? epr.getAddress().getValue() : null; } private static BindingType extractBinding(EndpointDataType epd) { return epd.getBinding() != null ? BindingType.fromValue(epd.getBinding().value()) : null; } private static TransportType extractTransport(EndpointDataType epd) { return epd.getTransport() != null ? TransportType.fromValue(epd.getTransport().value()) : null; } private SLProperties extractProperties(EndpointReferenceType epr) { MetadataType metadata = epr.getMetadata(); if (metadata != null) { List<Object> metaAny = metadata.getAny(); for (Object any : metaAny) { if (any instanceof Element) { Element root = (Element) any; if (isServiceLocatorProperties(root)) { ServiceLocatorPropertiesType slp = toServiceLocatorProperties(root); return SLPropertiesConverter.toSLProperties(slp); } } } } return new SLPropertiesImpl(); } @SuppressWarnings("unchecked") private ServiceLocatorPropertiesType toServiceLocatorProperties(Element root) { try { JAXBContext jc = JaxbContextHandler.getEndpointContext(); JAXBElement<ServiceLocatorPropertiesType> slp = (JAXBElement<ServiceLocatorPropertiesType>) jc.createUnmarshaller().unmarshal(root); return slp.getValue(); } catch (JAXBException e) { if (LOG.isLoggable(Level.SEVERE)) { LOG.log(Level.SEVERE, "Failed to deserialize service locator properties", e); } return SL_OBJECT_FACTORY.createServiceLocatorPropertiesType(); } } private static boolean isServiceLocatorProperties(Element elem) { return SERVICE_LOCATOR_PROPERTIES_LN.equals(elem.getLocalName()) && SERVICE_LOCATOR_PROPERTIES_NS.equals(elem.getNamespaceURI()); } }