blob: 55bb5d3616172d574588a6c42c7cea837f565a1a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2004 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.j2ee.internal.migration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jst.j2ee.client.ApplicationClient;
import org.eclipse.jst.j2ee.client.ApplicationClientResource;
import org.eclipse.jst.j2ee.common.QName;
import org.eclipse.jst.j2ee.common.XMLResource;
import org.eclipse.jst.j2ee.common.impl.J2EEResourceFactoryRegistry;
import org.eclipse.jst.j2ee.ejb.EJBJar;
import org.eclipse.jst.j2ee.ejb.EJBResource;
import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
import org.eclipse.jst.j2ee.internal.migration.actions.J2EEMigrationUIResourceHandler;
import org.eclipse.jst.j2ee.internal.project.J2EENature;
import org.eclipse.jst.j2ee.migration.J2EEMigrationStatus;
import org.eclipse.jst.j2ee.migration.SpecificationMigrator;
import org.eclipse.jst.j2ee.webapplication.WebApp;
import org.eclipse.jst.j2ee.webapplication.WebAppResource;
import org.eclipse.jst.j2ee.webservice.WebServiceConstants;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.ExceptionMapping;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.InterfaceMapping;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.JavaWSDLMapping;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.JavaXMLTypeMapping;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.JaxrpcmapResource;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.JaxrpcmapResourceFactory;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.MethodParamPartsMapping;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.RootTypeQname;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.ServiceEndpointInterfaceMapping;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.ServiceEndpointMethodMapping;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.ServiceInterfaceMapping;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.WSDLBinding;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.WSDLMessage;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.WSDLMessageMapping;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.WSDLPortType;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.WSDLReturnValueMapping;
import org.eclipse.jst.j2ee.webservice.jaxrpcmap.WSDLServiceName;
import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
import org.eclipse.jst.j2ee.webservice.wsdd.WebServiceDescription;
import org.eclipse.jst.j2ee.webservice.wsdd.WebServices;
import org.eclipse.jst.j2ee.webservice.wsdd.WsddResource;
import org.eclipse.jst.j2ee.webservices.WebServiceEditModel;
import org.eclipse.jst.j2ee.webservices.WebServicesManager;
import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
import com.ibm.wtp.emf.workbench.ProjectUtilities;
/**
*
*/
public class JaxrpcmapSpecificationMigrator extends SpecificationMigrator {
private String DEFAULT_NAMESPACE_PREFIX = "pfx"; //$NON-NLS-1$
private String JAXRPC_SUCCESSFUL = J2EEMigrationUIResourceHandler.getString("JaxrpcmapSpecificationMigrator_UI_1"); //$NON-NLS-1$
private String NO_MODULE_ROOT_FOUND = J2EEMigrationUIResourceHandler.getString("JaxrpcmapSpecificationMigrator_UI_2"); //$NON-NLS-1$
private J2EEMigrationStatus JAXRPCMAP_OK_STATUS = new J2EEMigrationStatus(J2EEMigrationStatus.COMPLETED_OK, JAXRPC_SUCCESSFUL);
public JaxrpcmapSpecificationMigrator(String aVersion, boolean complex) {
super(aVersion, complex);
}
public JaxrpcmapSpecificationMigrator(XMLResource anXmlResource, String aVersion, boolean complex) {
super(anXmlResource, aVersion, complex);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.j2ee.migration.J2EESpecificationMigrator#migrateTo14(org.eclipse.jst.j2ee.ejb.EJBResource)
*/
protected J2EEMigrationStatus migrateTo14(EJBResource ejbResource) {
//These should be in J2EEInit!!
//JaxrpcmapPackageImpl.init();
//JaxrpcmapResourceFactory.registerDtds();
//
ArrayList mappingFileList = new ArrayList();
IProject project = ProjectUtilities.getProject(ejbResource);
ResourceSet resSet = ejbResource.getResourceSet();
EJBJar ejbJar = ejbResource.getEJBJar();
Iterator ejbs = ejbJar.getEnterpriseBeans().iterator();
while (ejbs.hasNext()) {
EnterpriseBean ejb = (EnterpriseBean) ejbs.next();
Iterator serviceRefs = ejb.getServiceRefs().iterator();
while (serviceRefs.hasNext()) {
ServiceRef sref = (ServiceRef) serviceRefs.next();
String mappingFile = sref.getJaxrpcMappingFile();
if (mappingFile != null && mappingFile.length() > 0) {
mappingFileList.add(mappingFile);
}
}
}
appendServiceSideMappingFiles(ejbResource, mappingFileList);
String[] mappingFiles = convertToStringArray(mappingFileList.toArray());
return migrateJaxrpcmapTo14(resSet, project, mappingFiles);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.j2ee.migration.SpecificationMigrator#migrateTo14(org.eclipse.jst.j2ee.client.ApplicationClientResource)
*/
protected J2EEMigrationStatus migrateTo14(ApplicationClientResource resource) {
//These should be in J2EEInit!!
//JaxrpcmapPackageImpl.init();
//JaxrpcmapResourceFactory.registerDtds();
//
ArrayList mappingFileList = new ArrayList();
IProject project = ProjectUtilities.getProject(resource);
ResourceSet resSet = resource.getResourceSet();
ApplicationClient appClient = resource.getApplicationClient();
Iterator serviceRefs = appClient.getServiceRefs().iterator();
while (serviceRefs.hasNext()) {
ServiceRef sref = (ServiceRef) serviceRefs.next();
String mappingFile = sref.getJaxrpcMappingFile();
if (mappingFile != null && mappingFile.length() > 0) {
mappingFileList.add(mappingFile);
}
}
String[] mappingFiles = convertToStringArray(mappingFileList.toArray());
return migrateJaxrpcmapTo14(resSet, project, mappingFiles);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.j2ee.migration.SpecificationMigrator#migrateTo14(org.eclipse.jst.j2ee.webapplication.WebAppResource)
*/
protected J2EEMigrationStatus migrateTo14(WebAppResource resource) {
//These should be in J2EEInit!!
//JaxrpcmapPackageImpl.init();
//JaxrpcmapResourceFactory.registerDtds();
//
ArrayList mappingFileList = new ArrayList();
IProject project = ProjectUtilities.getProject(resource);
ResourceSet resSet = resource.getResourceSet();
WebApp webApp = resource.getWebApp();
Iterator serviceRefs = webApp.getServiceRefs().iterator();
while (serviceRefs.hasNext()) {
ServiceRef sref = (ServiceRef) serviceRefs.next();
String mappingFile = sref.getJaxrpcMappingFile();
if (mappingFile != null && mappingFile.length() > 0) {
mappingFileList.add(mappingFile);
}
}
appendServiceSideMappingFiles(resource, mappingFileList);
String[] mappingFiles = convertToStringArray(mappingFileList.toArray());
return migrateJaxrpcmapTo14(resSet, project, mappingFiles);
}
private void appendServiceSideMappingFiles(XMLResource resource, ArrayList mappingFileList) {
IProject project = ProjectUtilities.getProject(resource);
if (project == null)
return;
WebServiceEditModel webServicesEditModel = WebServicesManager.getInstance().getWSEditModel(project);
if (webServicesEditModel == null)
return;
WsddResource wsddResource = webServicesEditModel.getWebServicesXmlResource();
if (wsddResource == null)
return;
WebServices ws = wsddResource.getWebServices();
if (ws == null)
return;
Iterator wsdescs = ws.getWebServiceDescriptions().iterator();
while (wsdescs.hasNext()) {
WebServiceDescription wsdesc = (WebServiceDescription) wsdescs.next();
String mappingFile = wsdesc.getJaxrpcMappingFile();
if (mappingFile != null && mappingFile.length() > 0) {
mappingFileList.add(mappingFile);
}
}
}
private J2EEMigrationStatus migrateJaxrpcmapTo14(ResourceSet resSet, IProject project, String[] moduleRootRelativePathNames) {
//Get the J2EEResourceFactoryRegistry on the resource set.
J2EEResourceFactoryRegistry registry = (J2EEResourceFactoryRegistry) resSet.getResourceFactoryRegistry();
//Get the module root folder
J2EENature nature = J2EENature.getRegisteredRuntime(project);
IResource moduleRoot = nature.getModuleServerRoot();
IFolder moduleRootFolder = null;
if (moduleRoot instanceof IFolder) {
moduleRootFolder = (IFolder) moduleRoot;
} else {
return new J2EEMigrationStatus(J2EEMigrationStatus.NOT_POSSIBLE, NO_MODULE_ROOT_FOUND);
}
//Migrate all the mapping files in the array
for (int i = 0; i < moduleRootRelativePathNames.length; i++) {
String moduleRootRelativePathName = moduleRootRelativePathNames[i];
//Calculate the name of the mapping file being migrated.
String mappingFileName = null;
int lastSlashIdx = moduleRootRelativePathName.lastIndexOf('/');
if (lastSlashIdx == -1) {
mappingFileName = moduleRootRelativePathName;
} else {
mappingFileName = moduleRootRelativePathName.substring(lastSlashIdx + 1);
}
//Register the mapping file.
registry.registerLastFileSegment(mappingFileName, new JaxrpcmapResourceFactory(RendererFactory.getDefaultRendererFactory()));
//Get the IFile for the mapping file
IFile mappingFile = moduleRootFolder.getFile(moduleRootRelativePathName);
if (mappingFile != null && mappingFile.exists()) {
//Get the URI
URI uri = URI.createPlatformResourceURI(mappingFile.getFullPath().toString());
try {
//Load the resource
JaxrpcmapResource jaxrpcmapRes = (JaxrpcmapResource) resSet.getResource(uri, true);
//Migrate the resource
jaxrpcmapRes.setModuleVersionID(WebServiceConstants.WEBSERVICE_1_1_ID);
EObject rootObject = jaxrpcmapRes.getRootObject();
jaxrpcmapRes.getContents().remove(rootObject);
jaxrpcmapRes.getContents().add(rootObject);
JavaWSDLMapping jwm = jaxrpcmapRes.getJavaWSDLMapping();
JavaWSDLMappingMigrator jwmMigrator = new JavaWSDLMappingMigrator();
jwmMigrator.migrateTo14(jwm);
//Save the resource
Map options = new HashMap();
jaxrpcmapRes.save(options);
} catch (Exception e) {
//Should log something here.
}
}
}
return JAXRPCMAP_OK_STATUS;
}
private String[] convertToStringArray(Object[] a) {
if (a == null)
return new String[0];
int length = a.length;
String[] sa = new String[length];
for (int i = 0; i < length; i++) {
Object obj = a[i];
if (obj instanceof String) {
sa[i] = (String) obj;
}
}
return sa;
}
private class JavaWSDLMappingMigrator {
public void migrateTo14(JavaWSDLMapping javaWsdlMapping) {
Iterator jxtms = javaWsdlMapping.getJavaXMLTypeMappings().iterator();
Iterator ems = javaWsdlMapping.getExceptionMappings().iterator();
Iterator ims = javaWsdlMapping.getInterfaceMappings().iterator();
while (jxtms.hasNext()) {
JavaXMLTypeMapping jxtm = (JavaXMLTypeMapping) jxtms.next();
//migrate the root-type-qname
RootTypeQname rtqn = jxtm.getRootTypeQname();
if (qnameIsAnonymous(rtqn)) {
jxtm.setRootTypeQname(null);
StringBuffer atqnsb = new StringBuffer();
atqnsb.append(rtqn.getNamespaceURI());
atqnsb.append(":"); //$NON-NLS-1$
atqnsb.append(rtqn.getLocalPart());
String atqn = atqnsb.toString();
jxtm.setAnonymousTypeQname(atqn);
} else {
migrateQNameTo14(rtqn);
}
}
while (ems.hasNext()) {
ExceptionMapping em = (ExceptionMapping) ems.next();
WSDLMessage wm = em.getWsdlMessage();
migrateQNameTo14(wm);
}
while (ims.hasNext()) {
InterfaceMapping im = (InterfaceMapping) ims.next();
if (im instanceof ServiceInterfaceMapping) {
ServiceInterfaceMapping sim = (ServiceInterfaceMapping) im;
WSDLServiceName wsn = sim.getWsdlServiceName();
migrateQNameTo14(wsn);
} else if (im instanceof ServiceEndpointInterfaceMapping) {
ServiceEndpointInterfaceMapping seim = (ServiceEndpointInterfaceMapping) im;
//wsdl-port-type
WSDLPortType wpt = seim.getWsdlPortType();
migrateQNameTo14(wpt);
//wsdl-binding
WSDLBinding wb = seim.getWsdlBinding();
migrateQNameTo14(wb);
Iterator semms = seim.getServiceEndpointMethodMappings().iterator();
while (semms.hasNext()) {
ServiceEndpointMethodMapping semm = (ServiceEndpointMethodMapping) semms.next();
Iterator mppms = semm.getMethodParamPartsMappings().iterator();
while (mppms.hasNext()) {
MethodParamPartsMapping mppm = (MethodParamPartsMapping) mppms.next();
WSDLMessageMapping wmm = mppm.getWsdlMessageMapping();
//wsdl-message
WSDLMessage wm = wmm.getWsdlMessage();
migrateQNameTo14(wm);
}
WSDLReturnValueMapping wrvm = semm.getWsdlReturnValueMapping();
if (wrvm != null) {
//wsdl-message
WSDLMessage wm = wrvm.getWsdlMessage();
migrateQNameTo14(wm);
}
}
}
}
}
private void migrateQNameTo14(QName qname) {
String namespaceURI = qname.getNamespaceURI();
String localPart = qname.getLocalPart();
qname.setValues(DEFAULT_NAMESPACE_PREFIX, namespaceURI, localPart);
}
private boolean qnameIsAnonymous(QName qname) {
String localPart = qname.getLocalPart();
if (localPart.indexOf('>') >= 0 || localPart.indexOf('[') >= 0) {
return true;
}
return false;
}
}
}