org.wso2.developerstudio.eclipse.artifact.axis2.ui.wizard.Axis2ServiceCreationWizard.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.developerstudio.eclipse.artifact.axis2.ui.wizard.Axis2ServiceCreationWizard.java

Source

/*
 * Copyright (c) 2011 - 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 * 
 * 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.
 */

package org.wso2.developerstudio.eclipse.artifact.axis2.ui.wizard;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import org.apache.axis2.wsdl.WSDL2Java;
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.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.wso2.developerstudio.eclipse.artifact.axis2.Activator;
import org.wso2.developerstudio.eclipse.artifact.axis2.model.Axis2Model;
import org.wso2.developerstudio.eclipse.artifact.axis2.model.DataModel;
import org.wso2.developerstudio.eclipse.artifact.axis2.utils.Axis2ImageUtils;
import org.wso2.developerstudio.eclipse.artifact.axis2.utils.Axis2ParametersUtils;
import org.wso2.developerstudio.eclipse.libraries.utils.LibraryUtils;
import org.wso2.developerstudio.eclipse.logging.core.IDeveloperStudioLog;
import org.wso2.developerstudio.eclipse.logging.core.Logger;
import org.wso2.developerstudio.eclipse.maven.util.MavenUtils;
import org.wso2.developerstudio.eclipse.platform.ui.wizard.AbstractWSO2ProjectCreationWizard;
import org.wso2.developerstudio.eclipse.platform.ui.wizard.pages.MavenDetailsPage;
import org.wso2.developerstudio.eclipse.platform.ui.wizard.pages.ProjectOptionsDataPage;
import org.wso2.developerstudio.eclipse.utils.file.FileUtils;
import org.wso2.developerstudio.eclipse.utils.jdt.JavaUtils;
import org.wso2.developerstudio.eclipse.utils.project.ProjectUtils;

public class Axis2ServiceCreationWizard extends AbstractWSO2ProjectCreationWizard {
    private static IDeveloperStudioLog log = Logger.getLog(Activator.PLUGIN_ID);

    private static final String AXIS2_PROJECT_NATURE = "org.wso2.developerstudio.eclipse.axis2.project.nature";
    private static final String PROJECT_WIZARD_WINDOW_TITLE = "New Axis2 Service Project";
    private Axis2Model axis2Model;
    private Axis2ConfigurationPage wsdlConfigurationPage;
    private DataModel dataModel;
    private IWizardPage[] pages;

    public Axis2ServiceCreationWizard() {
        dataModel = new DataModel();
        setAxis2Model(new Axis2Model());
        setModel(getAxis2Model());
        setWindowTitle(PROJECT_WIZARD_WINDOW_TITLE);
        setDefaultPageImageDescriptor(Axis2ImageUtils.getInstance().getImageDescriptor("axis2-wizard.png"));
    }

    public void init(IWorkbench workbench, IStructuredSelection selection) {
        super.init(workbench, selection);
    }

    public boolean performFinish() {
        IFile axis2GenServiceXML = null;
        try {
            IProject project = createNewProject();
            IFolder sourceFolder = ProjectUtils.getWorkspaceFolder(project, "src", "main", "java");
            JavaUtils.addJavaSupportAndSourceFolder(project, sourceFolder);
            File pomfile = project.getFile("pom.xml").getLocation().toFile();
            getModel().getMavenInfo().setPackageName("service/axis2");
            createPOM(pomfile);
            getModel().addToWorkingSet(project);
            ProjectUtils.addNatureToProject(project, false, AXIS2_PROJECT_NATURE);
            MavenUtils.updateWithMavenEclipsePlugin(pomfile, new String[] { JDT_BUILD_COMMAND },
                    new String[] { AXIS2_PROJECT_NATURE, JDT_PROJECT_NATURE });

            project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());

            if (getModel().getSelectedOption().equals("import.Axis2")) {
                //TODO: import AAR

            } else if (getModel().getSelectedOption().equals("new.Axis2")) {
                String className = axis2Model.getServiceClass();
                String packageName = axis2Model.getPackageName();

                IJavaProject javaProject = JavaCore.create(project);
                IFolder resourceFolder = ProjectUtils.getWorkspaceFolder(project, "src", "main", "resources");
                if (!resourceFolder.exists()) {
                    resourceFolder.create(false, true, null);
                }

                IFolder metaFolder = ProjectUtils.getWorkspaceFolder(project, "src", "main", "resources",
                        "META-INF");
                if (!metaFolder.exists()) {
                    metaFolder.create(false, true, null);
                }
                IFile serviceXML = metaFolder.getFile("services.xml");
                createServiceXML(serviceXML, className, packageName.concat(".").concat(className));
                IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(sourceFolder);
                IPackageFragment sourcePackage = root.createPackageFragment(packageName, false, null);
                StringBuffer buffer = new StringBuffer();
                if (!packageName.equalsIgnoreCase("")) {
                    buffer.append("package " + packageName + ";\n");
                    buffer.append("\n");
                }
                buffer.append("public class " + className + "{\n\n}");
                ICompilationUnit compilationUnit = sourcePackage.createCompilationUnit(className + ".java",
                        buffer.toString(), false, null);
                project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
                IPath path = compilationUnit.getResource().getProjectRelativePath();
                IFile sourceFile = project.getFile(path);
                try {
                    refreshDistProjects();
                    IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(),
                            sourceFile);
                } catch (Exception e) {
                    log.error("Cannot open file in editor", e);
                }
            } else if (getModel().getSelectedOption().equals("import.Axis2wsdl")) {
                ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog(getShell());
                IFolder mainFolder = ProjectUtils.getWorkspaceFolder(project, "src", "main");
                dataModel.setSourceFolder("java");
                dataModel.setGeneratedCodeLocation(mainFolder.getRawLocation().toPortableString());
                dataModel.setSelectedProject(project);
                progressMonitorDialog.create();
                progressMonitorDialog.open();
                progressMonitorDialog.run(false, false, new CodegenJob());

                IFolder resourceFolder = ProjectUtils.getWorkspaceFolder(project, "src", "main", "resources");
                project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
                IFolder metaFolder = resourceFolder.getFolder("META-INF");
                if (!metaFolder.exists()) {
                    metaFolder.create(false, true, null);
                }
                axis2GenServiceXML = resourceFolder.getFile("services.xml");
                project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
                if (axis2GenServiceXML.exists()) {
                    IFile metaServiceXML = metaFolder.getFile("services.xml");
                    FileUtils.copy(axis2GenServiceXML.getLocation().toFile(),
                            metaServiceXML.getLocation().toFile());
                    project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
                    //axis2GenServiceXML.delete(true, new NullProgressMonitor());
                }
                project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
                refreshDistProjects();
            }

            project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());

        } catch (CoreException e) {
            log.error("CoreException has occurred", e);
        } catch (IOException e) {
            log.error("I/O error has occurred", e);
        } catch (InvocationTargetException e) {
            log.error("An error occurred while generating codes", e.getTargetException());
        } catch (Exception e) {
            log.error("An unexpected error has occurred", e);
        }

        return true;
    }

    private void createServiceXML(IFile serviceXML, String serviceName, String serviceClass) {
        String serviceXMLContent = "<service name=\"" + serviceName + "\">\n" + "\t<description>\n"
                + "\t\tPlease Type your service description here\n" + "\t</description>\n"
                + "\t<messageReceivers>\n"
                + "\t\t<messageReceiver class=\"org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver\" "
                + "mep=\"http://www.w3.org/2004/08/wsdl/in-only\"/>\n"
                + "\t\t<messageReceiver class=\"org.apache.axis2.rpc.receivers.RPCMessageReceiver\" "
                + "mep=\"http://www.w3.org/2004/08/wsdl/in-out\"/>\n" + "\t</messageReceivers>\n"
                + "\t<parameter locked=\"false\" name=\"ServiceClass\">" + serviceClass + "</parameter>\n"
                + "</service>\n";
        try {
            serviceXML.create(new ByteArrayInputStream(serviceXMLContent.getBytes()), true,
                    new NullProgressMonitor());
        } catch (CoreException e) {
            log.error("Error occurred while creating services.xml file for Axis2 service, service name : "
                    + serviceName + ", service class : " + serviceClass, e);
        }
    }

    private class CodegenJob implements IRunnableWithProgress {

        public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
            dataModel.setGenerateServicedescriptor(true);
            String operationText = "Generating server side code";
            monitor.beginTask(operationText, 100);
            monitor.subTask("Processing configuration...");
            String[] parameterArray = Axis2ParametersUtils
                    .getParameterArray(Axis2ParametersUtils.getParameterList(dataModel));
            monitor.worked(10);
            try {
                monitor.subTask("Generating code...");
                WSDL2Java.main(parameterArray);
                monitor.worked(75);
                monitor.subTask("Adding dependent libraries to the project...");
                JavaUtils.addJarLibraryToProject(dataModel.getSelectedProject(),
                        LibraryUtils.getDependencyPath(LibraryUtils.axis2_1_6_1_wso2vXX_jar));
                JavaUtils.addJarLibraryToProject(dataModel.getSelectedProject(),
                        LibraryUtils.getDependencyPath(LibraryUtils.axiom_1_2_11_wso2vXX_jar));
                monitor.worked(10);
                monitor.subTask("Refreshing project...");
                dataModel.getSelectedProject().refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
                monitor.worked(5);
                monitor.done();
            } catch (Exception e) {
                throw new InvocationTargetException(e);
            }
        }

    }

    public void setAxis2Model(Axis2Model axis2Model) {
        this.axis2Model = axis2Model;
    }

    public Axis2Model getAxis2Model() {
        return axis2Model;
    }

    public void addPages() {
        wsdlConfigurationPage = new Axis2ConfigurationPage("Axis2 Service Configuration", dataModel);
        super.addPages();
        addPage(wsdlConfigurationPage);
        pages = getPages();
    }

    public IWizardPage getNextPage(IWizardPage page) {
        IWizardPage nextPage = super.getNextPage(page);
        if (page instanceof ProjectOptionsDataPage) {
            if (getModel().getSelectedOption().equalsIgnoreCase("import.Axis2wsdl")) {
                dataModel.setWsdlURI(getModel().getImportFile().getAbsolutePath());
                dataModel.setGenerateServerSideCode(true);
                nextPage = wsdlConfigurationPage;
                wsdlConfigurationPage.populateParamsFromWSDL();
            }
        }
        if (page instanceof Axis2ConfigurationPage) {
            nextPage = pages[2];
        }
        if (page instanceof MavenDetailsPage) {
            nextPage = null;
        }
        return nextPage;
    }

    public IWizardPage getPreviousPage(IWizardPage page) {
        IWizardPage previousPage = super.getPreviousPage(page);
        if (page instanceof MavenDetailsPage) {
            if (getModel().getSelectedOption().equalsIgnoreCase("import.Axis2wsdl")) {
                previousPage = wsdlConfigurationPage;
            }
        }
        if (page instanceof Axis2ConfigurationPage) {
            previousPage = pages[1];
        }
        return previousPage;
    }

    public IResource getCreatedResource() {
        // TODO Auto-generated method stub
        return null;
    }

}