Java tutorial
/****************************************************************************** * Copyright (c) 2011-2013, Linagora * * 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: * Linagora - initial API and implementation *******************************************************************************/ package com.ebmwebsourcing.petals.services.jsr181.v11; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import javax.xml.namespace.QName; import org.eclipse.bpel.common.wsdl.helpers.UriAndUrlHelper; import org.eclipse.bpel.common.wsdl.importhelpers.WsdlImportHelper; 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.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import com.ebmwebsourcing.petals.common.internal.provisional.maven.MavenBean; import com.ebmwebsourcing.petals.common.internal.provisional.utils.JavaUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.JaxWsUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.PetalsConstants; import com.ebmwebsourcing.petals.common.internal.provisional.utils.WsdlUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.WsdlUtils.JbiBasicBean; import com.ebmwebsourcing.petals.services.cdk.Cdk5Utils; import com.ebmwebsourcing.petals.services.cdk.cdk5.Cdk5Package; import com.ebmwebsourcing.petals.services.jsr181.Jsr181Constants; import com.ebmwebsourcing.petals.services.jsr181.PetalsJsr181Plugin; import com.ebmwebsourcing.petals.services.jsr181.generated.JaxWsImplementation; import com.ebmwebsourcing.petals.services.jsr181.jsr181.Jsr181Package; import com.ebmwebsourcing.petals.services.su.extensions.ComponentVersionDescription; import com.ebmwebsourcing.petals.services.su.wizards.AbstractServiceUnitWizard; import com.ebmwebsourcing.petals.services.su.wizards.pages.AbstractSuWizardPage; import com.sun.java.xml.ns.jbi.AbstractEndpoint; import com.sun.java.xml.ns.jbi.JbiPackage; import com.sun.java.xml.ns.jbi.Provides; /** * @author Vincent Zurczak - EBM WebSourcing */ public class Jsr181ProvidesWizard11 extends AbstractServiceUnitWizard { private Jsr181ProvidePage11 page; /** * Constructor. */ public Jsr181ProvidesWizard11() { super(); this.settings.showJbiPage = false; this.settings.openJbiEditor = false; } /* (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.wizards.AbstractServiceUnitWizard * #getComponentVersionDescription() */ @Override public ComponentVersionDescription getComponentVersionDescription() { return new Jsr181Description11(); } /* (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.wizards.AbstractServiceUnitWizard * #getAdditionalMavenDependencies() */ @Override public List<MavenBean> getAdditionalMavenDependencies() { List<MavenBean> result = new ArrayList<MavenBean>(); MavenBean bean = new MavenBean(); bean.setArtifactId("petals-se-jsr181-library"); bean.setGroupId("org.ow2.petals"); bean.setVersion("1.2.0"); result.add(bean); return result; } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.wizards.AbstractServiceUnitWizard * #performLastActions(org.eclipse.core.resources.IFolder, com.sun.java.xml.ns.jbi.AbstractEndpoint, * org.eclipse.core.runtime.IProgressMonitor, java.util.List) */ @Override public IStatus performLastActions(IFolder resourceFolder, AbstractEndpoint ae, IProgressMonitor monitor) { // Generate the JAX-WS part IStatus result = Status.OK_STATUS; try { // Java project IJavaProject jp = JavaUtils.createJavaProject(resourceFolder.getProject()); // Start working on the JAX-WS part if (this.page.isWsdlFirst()) { wsdlFirstApproach(jp, ae, monitor); } else { implementationFirstApproach(jp.getProject(), ae, monitor); } // Find the libraries to add in the project class path JavaUtils.updateClasspathWithProjectLibraries(jp, monitor, "libs-cdk-p4", "libs-jsr181"); } catch (CoreException e) { result = new Status(Status.ERROR, PetalsJsr181Plugin.PLUGIN_ID, "Jsr181 Error", e); } catch (IOException e) { result = new Status(Status.ERROR, PetalsJsr181Plugin.PLUGIN_ID, "Jsr181 Error", e); } return result; } /** * Completes the wizard for an implementation-first approach. * * @param project * @param ae * @param resourcesToSelect * @param monitor */ private void implementationFirstApproach(IProject project, AbstractEndpoint ae, IProgressMonitor monitor) { IFolder srcFolder = project.getFolder(PetalsConstants.LOC_SRC_FOLDER); String className = this.page.getClassToGenerate(); int lastDotIndex = className.lastIndexOf('.'); String packageName, simpleClassName; // The page validation guarantees that the class name respects Java conventions if (lastDotIndex > 0) { simpleClassName = className.substring(lastDotIndex + 1); packageName = className.substring(0, lastDotIndex); } else { simpleClassName = className; packageName = ""; } // Set values String[] nsParts = packageName.trim().split("\\."); StringBuffer nsStringBuffer = new StringBuffer("http://"); for (int i = nsParts.length - 1; i > 0; i--) { nsStringBuffer.append(nsParts[i]); nsStringBuffer.append("."); } nsStringBuffer.append(nsParts[0]); String namespace = nsStringBuffer.toString(); ae.setServiceName(new QName(namespace, simpleClassName)); ae.setInterfaceName(new QName(namespace, simpleClassName)); ae.setEndpointName(simpleClassName + "Port"); ae.eSet(Jsr181Package.Literals.JSR181_PROVIDES__CLAZZ, className); // Fill-in the generation properties Properties generationProperties = new Properties(); generationProperties.put(Jsr181Constants.INTERFACE_NAME, simpleClassName + "Interface"); generationProperties.put(Jsr181Constants.CLASS_NAME, simpleClassName); generationProperties.put(Jsr181Constants.PACKAGE_NAME, packageName); generationProperties.put(Jsr181Constants.PROJECT_NAME, project.getName()); generationProperties.put(Jsr181Constants.PROJECT_LOCATION, srcFolder.getProject().getLocation().toString()); generationProperties.put(Jsr181Constants.SERVICE_NAME, ae.getServiceName().getLocalPart()); generationProperties.put(Jsr181Constants.PORT_NAME, ae.getEndpointName()); generationProperties.put(Jsr181Constants.TNS, ae.getServiceName().getNamespaceURI()); // Create the package StringBuffer sb = new StringBuffer(); for (String path : packageName.trim().split("\\.")) { sb.append(path); sb.append("/"); } File packageDirectory = srcFolder.getLocation().append(sb.toString()).toFile(); if (!packageDirectory.exists() && !packageDirectory.mkdirs()) { PetalsJsr181Plugin.log(new IOException("Could not create the Java package."), IStatus.ERROR); return; } try { srcFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); } catch (CoreException e) { // nothing } // Create the JAX-WS implementation final IFile file = srcFolder.getFile(sb.toString() + simpleClassName + ".java"); createFile(file, new JaxWsImplementation().generate(generationProperties), monitor); // Open the implementation in the Java editor Display.getDefault().asyncExec(new Runnable() { @Override public void run() { try { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IDE.openEditor(page, file); } catch (PartInitException e) { PetalsJsr181Plugin.log(e, IStatus.ERROR); } } }); // Select the created file this.resourcesToSelect.add(file); } /** * Completes the wizard for a WSDL-first approach. * * @param jp the Java project * @param ae * @param resourcesToSelect * @param monitor */ private void wsdlFirstApproach(IJavaProject jp, AbstractEndpoint ae, IProgressMonitor monitor) { try { // Create the WS implementation IProject project = jp.getProject(); URI wsdlUri = UriAndUrlHelper.urlToUri(this.page.getWsdlUriAsString()); IFolder srcFolder = project.getFolder(PetalsConstants.LOC_SRC_FOLDER); File srcDirectory = srcFolder.getLocation().toFile(); Map<String, String> buildOptions = new HashMap<String, String>(); JaxWsUtils.INSTANCE.generateWsClient(wsdlUri, srcDirectory); srcFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); project.build(IncrementalProjectBuilder.FULL_BUILD, JavaCore.BUILDER_ID, buildOptions, monitor); srcFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); JaxWsUtils.removeWebServiceClient(jp, monitor); Map<String, String> serviceNameToClassName = JaxWsUtils.createJaxWsImplementation(jp, monitor); srcFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); project.build(IncrementalProjectBuilder.FULL_BUILD, JavaCore.BUILDER_ID, buildOptions, monitor); // Update JBI JbiBasicBean bean = WsdlUtils.INSTANCE.parse(this.page.getWsdlUriAsString()).get(0); ae.eSet(JbiPackage.Literals.ABSTRACT_ENDPOINT__INTERFACE_NAME, bean.getInterfaceName()); ae.eSet(JbiPackage.Literals.ABSTRACT_ENDPOINT__SERVICE_NAME, bean.getServiceName()); ae.eSet(JbiPackage.Literals.ABSTRACT_ENDPOINT__ENDPOINT_NAME, bean.getEndpointName()); ae.eSet(Jsr181Package.Literals.JSR181_PROVIDES__CLAZZ, serviceNameToClassName.values().iterator().next()); // Import the WSDL in the project IFolder resFolder = project.getFolder(PetalsConstants.LOC_RES_FOLDER); File resFile = resFolder.getLocation().toFile(); Map<String, File> uriToFile = new WsdlImportHelper().importWsdlOrXsdAndDependencies(resFile, this.page.getWsdlUriAsString()); File f = uriToFile.get(this.page.getWsdlUriAsString()); String wsdlName = f == null ? wsdlUri.toURL().getFile() : f.getName(); ae.eSet(Cdk5Package.Literals.CDK5_PROVIDES__WSDL, wsdlName); resFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); // Open the implementation file final List<IFile> javaFiles = new ArrayList<IFile>(); for (String className : serviceNameToClassName.values()) { IFile javaFile = srcFolder.getFile(className.replaceAll("\\.", "/") + ".java"); javaFiles.add(javaFile); } this.resourcesToSelect.addAll(javaFiles); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { try { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); for (IFile file : javaFiles) IDE.openEditor(page, file); } catch (PartInitException e) { PetalsJsr181Plugin.log(e, IStatus.ERROR); } } }); } catch (Exception e) { PetalsJsr181Plugin.log(e, IStatus.ERROR); } } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.wizards.AbstractServiceUnitWizard * #presetServiceValues(com.sun.java.xml.ns.jbi.AbstractEndpoint) */ @Override protected void presetServiceValues(AbstractEndpoint endpoint) { Cdk5Utils.setInitialProvidesValues((Provides) endpoint); } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.wizards.AbstractServiceUnitWizard * #getLastCustomWizardPages() */ @Override protected AbstractSuWizardPage[] getLastCustomWizardPages() { this.page = new Jsr181ProvidePage11(); return new AbstractSuWizardPage[] { this.page }; } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.wizards.AbstractServiceUnitWizard * #isJavaProject() */ @Override protected boolean isJavaProject() { return true; } }