org.eclipse.cft.server.standalone.ui.internal.application.JarArchivingUIHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cft.server.standalone.ui.internal.application.JarArchivingUIHandler.java

Source

/*******************************************************************************
 * Copyright (c) 2016 Pivotal Software, Inc. and others
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution. 
 * 
 * The Eclipse Public License is available at 
 * 
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * and the Apache License v2.0 is available at 
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * You may elect to redistribute this code under either of these licenses.
 *  
 *  Contributors:
 *     Pivotal Software, Inc. - initial API and implementation
 ********************************************************************************/
package org.eclipse.cft.server.standalone.ui.internal.application;

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

import org.eclipse.cft.server.core.internal.CFConsoleHandler;
import org.eclipse.cft.server.core.internal.CloudErrorUtil;
import org.eclipse.cft.server.core.internal.CloudFoundryServer;
import org.eclipse.cft.server.core.internal.client.CloudFoundryApplicationModule;
import org.eclipse.cft.server.standalone.core.internal.application.DeploymentErrorHandler;
import org.eclipse.cft.server.standalone.ui.internal.Messages;
import org.eclipse.cft.server.ui.internal.CFUiUtil;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.internal.ui.jarpackagerfat.FatJarRsrcUrlBuilder;
import org.eclipse.jdt.ui.jarpackager.IJarBuilder;
import org.eclipse.jdt.ui.jarpackager.IJarExportRunnable;
import org.eclipse.jdt.ui.jarpackager.JarPackageData;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wst.server.core.IModule;
import org.springframework.boot.loader.tools.Libraries;
import org.springframework.boot.loader.tools.Library;
import org.springframework.boot.loader.tools.LibraryCallback;
import org.springframework.boot.loader.tools.LibraryScope;
import org.springframework.boot.loader.tools.Repackager;

class JarArchivingUIHandler {

    private CloudFoundryApplicationModule appModule;
    private CloudFoundryServer cloudServer;
    private CFConsoleHandler consoleHandler;
    private DeploymentErrorHandler errorHandler;

    public JarArchivingUIHandler(CloudFoundryApplicationModule appModule, CloudFoundryServer cloudServer,
            CFConsoleHandler consoleHandler, DeploymentErrorHandler errorHandler) {
        this.appModule = appModule;
        this.cloudServer = cloudServer;
        this.consoleHandler = consoleHandler;
        this.errorHandler = errorHandler;
    }

    protected String getTempJarPath(IModule module) throws CoreException {
        try {
            File tempFolder = File.createTempFile("tempFolderForJavaAppJar", //$NON-NLS-1$
                    null);
            tempFolder.delete();
            tempFolder.mkdirs();

            if (!tempFolder.exists()) {
                throw CloudErrorUtil.toCoreException(
                        NLS.bind(Messages.JavaCloudFoundryArchiver_ERROR_CREATE_TEMP_DIR, tempFolder.getPath()));
            }

            File targetFile = new File(tempFolder, module.getName() + ".jar"); //$NON-NLS-1$
            targetFile.deleteOnExit();

            String path = new Path(targetFile.getAbsolutePath()).toString();

            return path;

        } catch (IOException io) {
            CloudErrorUtil.toCoreException(io);
        }
        return null;
    }

    protected IJarBuilder getDefaultLibJarBuilder() {
        return new FatJarRsrcUrlBuilder() {

            public void writeRsrcUrlClasses() throws IOException {
                // Do not unpack and repackage the Eclipse jar loader
            }
        };
    }

    protected JavaPackageFragmentRootHandler getPackageFragmentRootHandler(IJavaProject javaProject,
            IProgressMonitor monitor) throws CoreException {

        return new JavaPackageFragmentRootHandler(javaProject, cloudServer);
    }

    protected void bootRepackage(final IPackageFragmentRoot[] roots, File packagedFile) throws CoreException {
        Repackager bootRepackager = new Repackager(packagedFile);
        try {
            bootRepackager.repackage(new Libraries() {

                public void doWithLibraries(LibraryCallback callBack) throws IOException {
                    for (IPackageFragmentRoot root : roots) {

                        if (root.isArchive()) {

                            File rootFile = new File(root.getPath().toOSString());
                            if (rootFile.exists()) {
                                callBack.library(new Library(rootFile, LibraryScope.COMPILE));
                            }
                        }
                    }
                }
            });
        } catch (IOException e) {
            errorHandler.handleApplicationDeploymentFailure(
                    NLS.bind(Messages.JavaCloudFoundryArchiver_ERROR_REPACKAGE_SPRING, e.getMessage()));
        }
    }

    protected JarPackageData getJarPackageData(IPackageFragmentRoot[] roots, IType mainType,
            IProgressMonitor monitor) throws CoreException {

        String filePath = getTempJarPath(appModule.getLocalModule());

        if (filePath == null) {
            errorHandler.handleApplicationDeploymentFailure("Failed to create temporary JAR file");
        }

        IPath location = new Path(filePath);

        // Note that if no jar builder is specified in the package data
        // then a default one is used internally by the data that does NOT
        // package any jar dependencies.
        JarPackageData packageData = new JarPackageData();

        packageData.setJarLocation(location);

        // Don't create a manifest. A repackager should determine if a
        // generated
        // manifest is necessary
        // or use a user-defined manifest.
        packageData.setGenerateManifest(false);

        // Since user manifest is not used, do not save to manifest (save to
        // manifest saves to user defined manifest)
        packageData.setSaveManifest(false);

        packageData.setManifestMainClass(mainType);
        packageData.setElements(roots);
        return packageData;
    }

    protected File packageApplication(final JarPackageData packageData, IProgressMonitor monitor)
            throws CoreException {

        int progressWork = 10;
        final SubMonitor subProgress = SubMonitor.convert(monitor, progressWork);

        final File[] createdFile = new File[1];

        final CoreException[] error = new CoreException[1];
        Display.getDefault().syncExec(new Runnable() {

            @Override
            public void run() {
                try {

                    Shell shell = CFUiUtil.getShell();

                    IJarExportRunnable runnable = packageData.createJarExportRunnable(shell);
                    try {
                        runnable.run(subProgress);

                        File file = new File(packageData.getJarLocation().toString());
                        if (!file.exists()) {
                            errorHandler.handleApplicationDeploymentFailure();
                        } else {
                            createdFile[0] = file;
                        }

                    } catch (InvocationTargetException e) {
                        throw CloudErrorUtil.toCoreException(e);
                    } catch (InterruptedException ie) {
                        throw CloudErrorUtil.toCoreException(ie);
                    } finally {
                        subProgress.done();
                    }
                } catch (CoreException e) {
                    error[0] = e;
                }
            }

        });
        if (error[0] != null) {
            throw error[0];
        }

        return createdFile[0];
    }
}