com.centurylink.mdw.plugin.designer.wizards.ImportPackageWizard.java Source code

Java tutorial

Introduction

Here is the source code for com.centurylink.mdw.plugin.designer.wizards.ImportPackageWizard.java

Source

/*
 * Copyright (C) 2017 CenturyLink, Inc.
 *
 * 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 com.centurylink.mdw.plugin.designer.wizards;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.IImportWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;

import com.centurylink.mdw.common.utilities.CryptUtil;
import com.centurylink.mdw.common.utilities.FileHelper;
import com.centurylink.mdw.common.utilities.HttpHelper;
import com.centurylink.mdw.common.utilities.StringHelper;
import com.centurylink.mdw.common.utilities.timer.ActionCancelledException;
import com.centurylink.mdw.common.utilities.timer.ProgressMonitor;
import com.centurylink.mdw.plugin.MdwPlugin;
import com.centurylink.mdw.plugin.PluginMessages;
import com.centurylink.mdw.plugin.designer.DesignerPerspective;
import com.centurylink.mdw.plugin.designer.DesignerProxy;
import com.centurylink.mdw.plugin.designer.Importer;
import com.centurylink.mdw.plugin.designer.SwtProgressMonitor;
import com.centurylink.mdw.plugin.designer.model.ActivityImpl;
import com.centurylink.mdw.plugin.designer.model.ElementChangeEvent.ChangeType;
import com.centurylink.mdw.plugin.designer.model.ExternalEvent;
import com.centurylink.mdw.plugin.designer.model.File;
import com.centurylink.mdw.plugin.designer.model.Folder;
import com.centurylink.mdw.plugin.designer.model.WorkflowPackage;
import com.centurylink.mdw.plugin.designer.model.WorkflowProcess;
import com.centurylink.mdw.plugin.designer.model.WorkflowAsset;
import com.centurylink.mdw.plugin.designer.model.WorkflowElement;
import com.centurylink.mdw.plugin.project.WorkflowProjectManager;
import com.centurylink.mdw.plugin.project.model.WorkflowProject;

public class ImportPackageWizard extends Wizard implements IImportWizard {
    private ImportPackagePage importPackagePage;
    private ImportPackageSelectPage importPackageSelectPage;

    ImportPackageSelectPage getImportPackageSelectPage() {
        return importPackageSelectPage;
    }

    private IWorkbench workbench;

    public IWorkbench getWorkbench() {
        return workbench;
    }

    private Folder topFolder;

    public Folder getTopFolder() {
        return topFolder;
    }

    public Folder getFolder() {
        return (Folder) topFolder.getChildren().get(0);
    }

    void setFolder(Folder folder) {
        if (topFolder.getChildren() != null)
            topFolder.getChildren().clear();
        topFolder.addChild(folder);
    }

    private boolean discovery;

    public boolean isDiscovery() {
        return discovery;
    }

    void setDiscovery(boolean disc) {
        this.discovery = disc;
    }

    boolean upgradeAssets;

    public void init(IWorkbench workbench, IStructuredSelection selection) {
        setDefaultPageImageDescriptor(MdwPlugin.getImageDescriptor("icons/mdw_wiz.png"));
        setNeedsProgressMonitor(true);
        setWindowTitle("MDW Import");

        importPackagePage = new ImportPackagePage();
        importPackageSelectPage = new ImportPackageSelectPage();

        topFolder = new Folder("assets");

        if (selection != null && selection.getFirstElement() instanceof WorkflowProject) {
            WorkflowProject workflowProject = (WorkflowProject) selection.getFirstElement();
            topFolder.setProject(workflowProject);
        } else if (selection != null && selection.getFirstElement() instanceof WorkflowPackage) {
            WorkflowPackage packageVersion = (WorkflowPackage) selection.getFirstElement();
            topFolder.setProject(packageVersion.getProject());
        } else {
            WorkflowProject workflowProject = WorkflowProjectManager.getInstance().findWorkflowProject(selection);
            if (workflowProject != null)
                topFolder.setProject(workflowProject);
        }
    }

    @Override
    public boolean performFinish() {
        final List<WorkflowPackage> importedPackages = new ArrayList<WorkflowPackage>();
        IRunnableWithProgress op = new IRunnableWithProgress() {
            public void run(IProgressMonitor monitor) throws InvocationTargetException {
                try {
                    WorkflowProject wfp = topFolder.getProject();
                    DesignerProxy designerProxy = wfp.getDesignerProxy();

                    monitor.beginTask("Import Packages",
                            100 * importPackageSelectPage.getSelectedPackages().size());
                    monitor.subTask("Importing selected packages...");
                    monitor.worked(10);

                    for (File pkgFile : importPackageSelectPage.getSelectedPackages()) {
                        ProgressMonitor progressMonitor = new SwtProgressMonitor(
                                new SubProgressMonitor(monitor, 100));
                        if (pkgFile.getContent() == null && pkgFile.getUrl() != null) { // download
                                                                                        // postponed
                                                                                        // for
                                                                                        // discovered
                                                                                        // assets
                            HttpHelper httpHelper = new HttpHelper(pkgFile.getUrl());
                            httpHelper.setConnectTimeout(MdwPlugin.getSettings().getHttpConnectTimeout());
                            httpHelper.setReadTimeout(MdwPlugin.getSettings().getHttpReadTimeout());
                            pkgFile.setContent(httpHelper.get());
                        }
                        String pkgFileContent = pkgFile.getContent();

                        Importer importer = new Importer(designerProxy.getPluginDataAccess(),
                                wfp.isFilePersist() && wfp.isRemote() ? null : getShell());
                        WorkflowPackage importedPackage = importer.importPackage(wfp, pkgFileContent,
                                progressMonitor);
                        if (importedPackage == null) // canceled
                        {
                            progressMonitor.done();
                            break;
                        } else {
                            if (upgradeAssets) {
                                progressMonitor.subTask("Upgrading activity implementors and other assets...");
                                designerProxy.upgradeAssets(importedPackage);
                            }

                            if (wfp.isFilePersist()) // file system eclipse sync
                                wfp.getSourceProject().refreshLocal(2, null);
                            // TODO refresh Archive in case existing package was
                            // moved there

                            importedPackage.addElementChangeListener(wfp);
                            for (WorkflowProcess pv : importedPackage.getProcesses())
                                pv.addElementChangeListener(wfp);
                            for (ExternalEvent ee : importedPackage.getExternalEvents())
                                ee.addElementChangeListener(wfp);
                            for (ActivityImpl ai : importedPackage.getActivityImpls())
                                ai.addElementChangeListener(wfp);
                            for (WorkflowAsset wa : importedPackage.getAssets())
                                wa.addElementChangeListener(wfp);
                            importedPackages.add(importedPackage);

                            if (wfp.isRemote() && wfp.isFilePersist()) {
                                // zip and upload imported packages to server
                                java.io.File tempDir = wfp.getTempDir();
                                if (!tempDir.exists()) {
                                    if (!tempDir.mkdirs())
                                        throw new IOException("Unable to create temp directory: " + tempDir);
                                }
                                java.io.File zipFile = new java.io.File(tempDir + "/packages"
                                        + StringHelper.filenameDateToString(new Date()) + ".zip");
                                java.io.File assetDir = wfp.getAssetDir();
                                List<java.io.File> includes = new ArrayList<java.io.File>();
                                for (WorkflowPackage pkg : importedPackages)
                                    includes.add(
                                            new java.io.File(assetDir + "/" + pkg.getName().replace('.', '/')));
                                // TODO populate excludes with non-imported
                                // package dirs (why, since these are not in
                                // includes?)
                                FileHelper.createZipFileWith(assetDir, zipFile, includes);
                                String uploadUrl = wfp.getServiceUrl()
                                        + "/upload?overwrite=true&assetZip=true&user="
                                        + importPackagePage.getProject().getUser().getUsername();
                                InputStream is = new FileInputStream(zipFile);
                                try {
                                    ByteArrayOutputStream os = new ByteArrayOutputStream();
                                    int read = 0;
                                    byte[] bytes = new byte[1024];
                                    while ((read = is.read(bytes)) != -1)
                                        os.write(bytes, 0, read);

                                    String encryptedPassword = CryptUtil
                                            .encrypt(wfp.getMdwDataSource().getDbPassword());
                                    HttpHelper httpHelper = new HttpHelper(new URL(uploadUrl),
                                            wfp.getMdwDataSource().getDbUser(), encryptedPassword);
                                    byte[] resp = httpHelper.postBytes(os.toByteArray());
                                    PluginMessages.log("Asset download respose: " + new String(resp));
                                } finally {
                                    is.close();
                                }
                            }
                        }
                        progressMonitor.done();
                    }

                    wfp.getDesignerProxy().getCacheRefresh().doRefresh(true);
                } catch (ActionCancelledException ex) {
                    throw new OperationCanceledException();
                } catch (Exception ex) {
                    PluginMessages.log(ex);
                    throw new InvocationTargetException(ex);
                }
            }
        };

        try {
            getContainer().run(true, true, op);
            for (WorkflowPackage importedPackage : importedPackages)
                importedPackage.fireElementChangeEvent(ChangeType.ELEMENT_CREATE, importedPackage);
            if (importedPackages.size() > 0)
                DesignerPerspective.promptForShowPerspective(PlatformUI.getWorkbench().getActiveWorkbenchWindow(),
                        importedPackages.get(0));
            return true;
        } catch (InterruptedException ex) {
            MessageDialog.openInformation(getShell(), "Import Package", "Import Cancelled");
            return true;
        } catch (Exception ex) {
            PluginMessages.uiError(getShell(), ex, "Import Package", importPackagePage.getProject());
            return false;
        }
    }

    @Override
    public void addPages() {
        addPage(importPackagePage);
        addPage(importPackageSelectPage);
    }

    void initializePackageSelectPage(WorkflowElement preselected) {
        importPackageSelectPage.initialize(preselected);
    }

    void setHasOldImplementors(boolean hasOldImplementors) {
        importPackageSelectPage.showUpgradeAssetsComposite(hasOldImplementors);
    }
}