blob: fb2b7d3d76b5bb372b18c0fedf7246447db4842d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 by SAP AG, Walldorf.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.ws.jaxws.dom.runtime.persistence.sync;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WSAnnotationFeatures.ENDPOINT_INTERFACE_ATTRIBUTE;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WSAnnotationFeatures.PORT_NAME_ATTRIBUTE;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WSAnnotationFeatures.SERVICE_NAME_ATTRIBUTE;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WSAnnotationFeatures.TARGET_NAMESPACE_ATTRIBUTE;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WSAnnotationFeatures.WSDL_LOCATION_ATTRIBUTE;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WSAnnotationFeatures.WS_ANNOTATION;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.DomFactory;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.DomPackage;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IServiceEndpointInterface;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebService;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebServiceProject;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.IAnnotationSerializer;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.IModelElementSynchronizer;
import org.eclipse.jst.ws.jaxws.utils.JaxWsUtils;
import org.eclipse.jst.ws.jaxws.utils.annotations.IAnnotation;
import org.eclipse.jst.ws.jaxws.utils.annotations.IAnnotationInspector;
public class WsSynchronizer extends ElementSynchronizerImpl
{
private final SeiMerger seiMerger;
public WsSynchronizer(IModelElementSynchronizer parent)
{
super(parent);
this.seiMerger = new SeiMerger(this, new WSMethodSynchronizer(this));
}
private IWebService obtainInstance(IWebServiceProject wsProject, String implName)
{
for (IWebService ws : wsProject.getWebServices())
{
if (ws.getImplementation()!= null && ws.getImplementation().equals(implName))
{
return ws;
}
}
final IWebService newWs = DomFactory.eINSTANCE.createIWebService();
util().setFeatureValue(newWs, DomPackage.IJAVA_WEB_SERVICE_ELEMENT__IMPLEMENTATION, implName);
util().addToCollectionFeature(wsProject, DomPackage.IWEB_SERVICE_PROJECT__WEB_SERVICES, newWs);
return newWs;
}
public IWebService synchronizeWebService(IWebServiceProject wsProject, IAnnotation<IType> wsAnnotation, IAnnotationInspector inspector) throws JavaModelException
{
if(wsAnnotation.getAppliedElement().getFullyQualifiedName()==null) {
return null;
}
final IWebService ws = obtainInstance(wsProject, wsAnnotation.getAppliedElement().getFullyQualifiedName());
mergeWebService(ws, wsProject, wsAnnotation, inspector);
resource().getSerializerFactory().adapt(ws, IAnnotationSerializer.class);
adaptToLocationInterface(ws, WS_ANNOTATION, wsAnnotation);
return ws;
}
private void mergeWebService(IWebService toMerge, IWebServiceProject wsProject, IAnnotation<IType> wsAnnotation, IAnnotationInspector inspector) throws JavaModelException
{
// add serviceName name
final String wsName = wsAnnotation.getPropertyValue(SERVICE_NAME_ATTRIBUTE) == null ?
JaxWsUtils.getDefaultServiceName(wsAnnotation.getAppliedElement().getFullyQualifiedName()) :
wsAnnotation.getPropertyValue(SERVICE_NAME_ATTRIBUTE);
if (!wsName.equals(toMerge.getName()))
{
util().setFeatureValue(toMerge, DomPackage.IWEB_SERVICE__NAME, wsName);
}
// add targetNamespace
final String targetNs = extractTargetNamespace(wsAnnotation);
if (!targetNs.equals(toMerge.getTargetNamespace())) {
util().setFeatureValue(toMerge, DomPackage.IWEB_SERVICE__TARGET_NAMESPACE, targetNs);
}
// add portName
final String portName = wsAnnotation.getPropertyValue(PORT_NAME_ATTRIBUTE)==null ?
JaxWsUtils.getDefaultPortName(wsAnnotation.getAppliedElement().getFullyQualifiedName()) :
wsAnnotation.getPropertyValue(PORT_NAME_ATTRIBUTE);
if (!portName.equals(toMerge.getPortName())) {
toMerge.setPortName(portName);
}
// add wsdlLocation
toMerge.setWsdlLocation(wsAnnotation.getPropertyValue(WSDL_LOCATION_ATTRIBUTE));
// add endpointInterface
final String newSeiImpl = wsAnnotation.getPropertyValue(ENDPOINT_INTERFACE_ATTRIBUTE);
if (newSeiImpl == null)
{
mergeImplicitInterface(obtainImplicitInterfaceInstance(wsProject, toMerge, wsAnnotation), wsAnnotation, inspector);
} else
{
if (toMerge.getServiceEndpoint() == null || !toMerge.getServiceEndpoint().getImplementation().equals(newSeiImpl))
{
serviceData().map(toMerge, newSeiImpl);
resolveInterface(toMerge, wsProject, wsAnnotation.getPropertyValue(ENDPOINT_INTERFACE_ATTRIBUTE));
}
}
}
private IServiceEndpointInterface obtainImplicitInterfaceInstance(IWebServiceProject wsProject, IWebService ws, IAnnotation<IType> wsAnnotation)
{
if (ws.getServiceEndpoint() != null && ws.getServiceEndpoint().isImplicit())
{
return ws.getServiceEndpoint();
}
final IServiceEndpointInterface sei = DomFactory.eINSTANCE.createIServiceEndpointInterface();
util().setFeatureValue(sei, DomPackage.ISERVICE_ENDPOINT_INTERFACE__IMPLICIT, true);
util().setFeatureValue(sei, DomPackage.IJAVA_WEB_SERVICE_ELEMENT__IMPLEMENTATION, wsAnnotation.getAppliedElement().getFullyQualifiedName());
util().setFeatureValue(ws, DomPackage.IWEB_SERVICE__SERVICE_ENDPOINT, sei);
wsProject.getServiceEndpointInterfaces().add(sei);
return sei;
}
private void mergeImplicitInterface(IServiceEndpointInterface sei, IAnnotation<IType> wsAnnotation, IAnnotationInspector inspector) throws JavaModelException
{
seiMerger.merge(sei, wsAnnotation, inspector);
resource().getSerializerFactory().adapt(sei, IAnnotationSerializer.class);
}
private String extractTargetNamespace(final IAnnotation<IType> wsAnnotation)
{
// add targetNamespace
final String targetNs = wsAnnotation.getPropertyValue(TARGET_NAMESPACE_ATTRIBUTE);
if (targetNs==null) {
return JaxWsUtils.composeJaxWsTargetNamespaceByPackage(wsAnnotation.getAppliedElement().getPackageFragment().getElementName());
}
return targetNs;
}
private void resolveInterface(IWebService ws, IWebServiceProject preffered, String implementation)
{
IServiceEndpointInterface resolved = null;
for (IWebServiceProject prj : getDomBeingLoaded().getWebServiceProjects())
{
for (IServiceEndpointInterface sei : prj.getServiceEndpointInterfaces())
{
if (sei.getImplementation().equals(implementation))
{
resolved = sei;
if (preffered.equals(prj))
{
break;
} else
{
resolved = sei;
}
}
}
}
util().setFeatureValue(ws, DomPackage.IWEB_SERVICE__SERVICE_ENDPOINT, resolved);
}
}