org.fusesource.ide.imports.sap.SapToolSuiteInstaller.java Source code

Java tutorial

Introduction

Here is the source code for org.fusesource.ide.imports.sap.SapToolSuiteInstaller.java

Source

/*******************************************************************************
* Copyright (c) 2014 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
* William Collins punkhornsw@gmail.com
******************************************************************************/
package org.fusesource.ide.imports.sap;

import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.engine.IProfileRegistry;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.operations.InstallOperation;
import org.eclipse.equinox.p2.operations.ProvisioningJob;
import org.eclipse.equinox.p2.operations.ProvisioningSession;
import org.eclipse.equinox.p2.publisher.eclipse.FeaturesAndBundlesPublisherApplication;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
import org.eclipse.equinox.p2.ui.ProvisioningUI;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.statushandlers.StatusManager;
import org.fusesource.ide.imports.sap.JCo3Archive.JCoArchiveType;
import org.jboss.tools.foundation.core.properties.IPropertiesProvider;
import org.jboss.tools.foundation.core.properties.PropertiesHelper;

/**
 * SAP Tool Suite Installer
 * 
 * @author William Collins punkhornsw@gmail.com
 *
 */
@SuppressWarnings("restriction")
public class SapToolSuiteInstaller implements IRunnableWithProgress {

    private static final String COMPRESS_FLAG = "-compress"; //$NON-NLS-1$
    private static final String PUBLISH_ARTIFACTS_FLAG = "-publishArtifacts"; //$NON-NLS-1$
    private static final String SOURCE_ARG = "-source"; //$NON-NLS-1$
    private static final String ARTIFACT_REPOSITORY_ARG = "-artifactRepository"; //$NON-NLS-1$
    private static final String METADATA_REPOSITORY_ARG = "-metadataRepository"; //$NON-NLS-1$
    private static final String DOT = "."; //$NON-NLS-1$
    private static final String CONFIGS_ARG = "-configs"; //$NON-NLS-1$
    private static final String APPEND_FLAG = "-append"; //$NON-NLS-1$
    private static final String INTEGRATION_STACK_SAP_URL_PROP = "jboss.discovery.site.integration-stack-sap.url"; //$NON-NLS-1$
    private static final String INTEGRATION_STACK_SAP_FEATURE_PROP = "jboss.discovery.site.integration-stack-sap.feature"; //$NON-NLS-1$
    private SapLibrariesFeatureArchive sapLibrariesFeatureArchive;
    private JCo3ImportSettings jco3ImportSettings;
    private IDoc3ImportSettings idoc3ImportSettings;

    public SapToolSuiteInstaller(SapLibrariesFeatureArchive sapLibrariesFeatureArchive,
            JCo3ImportSettings jco3ImportSettings, IDoc3ImportSettings idoc3ImportSettings) {
        this.sapLibrariesFeatureArchive = sapLibrariesFeatureArchive;
        this.jco3ImportSettings = jco3ImportSettings;
        this.idoc3ImportSettings = idoc3ImportSettings;
    }

    @Override
    public void run(IProgressMonitor progressMonitor) throws InvocationTargetException, InterruptedException {
        SubMonitor monitor = SubMonitor.convert(progressMonitor,
                Messages.SapToolSuiteInstaller_InstallingJBossFuseSapToolSuite, 7);
        try {
            // Deploy JCo3 Jar Bundle to temporary SAP Libraries Repository
            jco3ImportSettings.getJco3Archive().buildJCoPlugin(jco3ImportSettings);
            monitor.worked(1);
            checkCancelled(monitor);

            // Deploy JCo3 Native Library Bundle to temporary SAP Libraries Repository
            jco3ImportSettings.getJco3Archive().buildJCoNativePlugin(jco3ImportSettings);
            monitor.worked(1);
            checkCancelled(monitor);
            if (monitor.isCanceled())
                throw new InterruptedException();

            // Deploy IDoc3 Jar Bundle to temporary SAP Libraries Repository
            idoc3ImportSettings.getIdoc3Archive().buildIDoc3Plugin(idoc3ImportSettings);
            monitor.worked(1);
            checkCancelled(monitor);
            if (monitor.isCanceled())
                throw new InterruptedException();

            // Deploy  Feature Bundle to temporary SAP Libraries Repository
            sapLibrariesFeatureArchive.buildSAPLibrariesFeature();
            monitor.worked(1);
            checkCancelled(monitor);
            if (monitor.isCanceled())
                throw new InterruptedException();

            // Generate P2 Meta Data
            final URI librariesRepositoryURI = ImportUtils.getTemporySapLibrariesRepository().toUri();
            String librariesRepositoryURL = librariesRepositoryURI.toString();
            String librariesRepositoryPath = ImportUtils.getTemporySapLibrariesRepository().toString();
            FeaturesAndBundlesPublisherApplication fabpa = new FeaturesAndBundlesPublisherApplication();
            JCoArchiveType type = jco3ImportSettings.getJco3Archive().getType();
            fabpa.run(new String[] { APPEND_FLAG, CONFIGS_ARG,
                    type.getEclipseWS() + DOT + type.getEclipseOS() + DOT + type.getEclipseArch(),
                    METADATA_REPOSITORY_ARG, librariesRepositoryURL, ARTIFACT_REPOSITORY_ARG,
                    librariesRepositoryURL, SOURCE_ARG, librariesRepositoryPath, PUBLISH_ARTIFACTS_FLAG,
                    COMPRESS_FLAG });
            monitor.worked(1);
            checkCancelled(monitor);

            // Perform Installation
            final IProvisioningAgent provisioningAgent = Activator.getProvisioningAgent();
            final URI sapToolingSuiteRepositoryURI = getSapToolingUpdateSiteUrl();
            String sapToolingSuiteFeature = getSapToolingFeature();

            ProvisioningSession session = new ProvisioningSession(provisioningAgent);

            final ProvisioningUI ui = new ProvisioningUI(session, IProfileRegistry.SELF, new SapToolsPolicy());
            ui.loadArtifactRepository(librariesRepositoryURI, false, monitor);
            ui.loadArtifactRepository(sapToolingSuiteRepositoryURI, false, new NullProgressMonitor());
            IMetadataRepository librariesMetadataRepository = ui.loadMetadataRepository(librariesRepositoryURI,
                    false, monitor);
            IMetadataRepository sapToolingMetadataRepository = ui
                    .loadMetadataRepository(sapToolingSuiteRepositoryURI, false, new NullProgressMonitor());
            final Set<IInstallableUnit> toInstall = new HashSet<IInstallableUnit>();
            toInstall.addAll(
                    librariesMetadataRepository.query(QueryUtil.createIUGroupQuery(), monitor).toUnmodifiableSet());
            toInstall.addAll(sapToolingMetadataRepository
                    .query(QueryUtil.createIUQuery(sapToolingSuiteFeature), monitor).toUnmodifiableSet());
            final InstallOperation installOperation = ui.getInstallOperation(toInstall,
                    new URI[] { librariesRepositoryURI, sapToolingSuiteRepositoryURI });

            IStatus status = installOperation.resolveModal(monitor);
            monitor.worked(1);
            checkCancelled(monitor);
            if (!status.isOK()) {
                ErrorDialog.openError(Display.getDefault().getActiveShell(),
                        Messages.SapToolSuiteInstaller_JBossFuseSAPToolSuiteInstallFailed,
                        Messages.SapToolSuiteInstaller_UnableToPerformInstallationOfJBossFuseSAPToolSuite, status);
                throw new InvocationTargetException(status.getException(),
                        Messages.SapToolSuiteInstaller_JBossFuseSapToolSuiteCouldNotBeInstalled
                                + status.getMessage());
            }

            final ProvisioningJob job = installOperation.getProvisioningJob(new NullProgressMonitor());
            job.addJobChangeListener(new JobChangeAdapter() {
                @Override
                public void done(IJobChangeEvent event) {
                    // Remove Temporary SAP Libraries repository from Repository manager's list of known repositories.
                    IArtifactRepositoryManager artifactRepositoryManager = (IArtifactRepositoryManager) provisioningAgent
                            .getService(IArtifactRepositoryManager.SERVICE_NAME);
                    IMetadataRepositoryManager metadataRepositoryManager = (IMetadataRepositoryManager) provisioningAgent
                            .getService(IMetadataRepositoryManager.SERVICE_NAME);
                    artifactRepositoryManager.removeRepository(librariesRepositoryURI);
                    metadataRepositoryManager.removeRepository(librariesRepositoryURI);

                    // Delete SAP Library repository
                    ImportUtils.deleteTemporarySapLibrariesRepository();

                    final IStatus jobResult = job.getResult();
                    if (IStatus.ERROR == jobResult.getSeverity()) {
                        ErrorDialog.openError(Display.getDefault().getActiveShell(),
                                Messages.SapToolSuiteInstaller_errorDuringInstallationTitle,
                                Messages.SapToolSuiteInstaller_errorDuringInstallationMessage, jobResult);
                    }
                }
            });
            ui.schedule(job, StatusManager.SHOW | StatusManager.LOG);
        } catch (Exception e) {
            throw new InvocationTargetException(e, e.getMessage());
        } finally {
            monitor.done();
        }
    }

    public URI getSapToolingUpdateSiteUrl() throws InterruptedException {
        String sapToolingUpdateSite = System.getProperty(INTEGRATION_STACK_SAP_URL_PROP, null);
        if (sapToolingUpdateSite == null) {
            IPropertiesProvider propertiesProvider = PropertiesHelper.getPropertiesProvider();
            sapToolingUpdateSite = propertiesProvider.getValue(INTEGRATION_STACK_SAP_URL_PROP);
        }
        if (sapToolingUpdateSite == null) {
            throw new InterruptedException(String.format(
                    "No URL set for discovery catalog. Property %s is missing!", INTEGRATION_STACK_SAP_URL_PROP)); //$NON-NLS-1$
        }

        return URI.create(sapToolingUpdateSite);
    }

    public String getSapToolingFeature() throws InterruptedException {
        String sapToolingUpdateSite = System.getProperty(INTEGRATION_STACK_SAP_FEATURE_PROP, null);
        if (sapToolingUpdateSite == null) {
            IPropertiesProvider propertiesProvider = PropertiesHelper.getPropertiesProvider();
            sapToolingUpdateSite = propertiesProvider.getValue(INTEGRATION_STACK_SAP_FEATURE_PROP);
        }
        if (sapToolingUpdateSite == null) {
            throw new InterruptedException(
                    String.format("No feature set for discovery catalog. Property %s is missing!", //$NON-NLS-1$
                            INTEGRATION_STACK_SAP_FEATURE_PROP));
        }

        return sapToolingUpdateSite;
    }

    protected void checkCancelled(IProgressMonitor monitor) throws InterruptedException {
        if (monitor.isCanceled()) {
            throw new InterruptedException();
        }
    }

}