hydrograph.ui.menus.handlers.PasteHandler.java Source code

Java tutorial

Introduction

Here is the source code for hydrograph.ui.menus.handlers.PasteHandler.java

Source

/*******************************************************************************
 * Copyright 2017 Capital One Services, LLC and Bitwise, 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 hydrograph.ui.menus.handlers;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.ListUtils;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
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.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.internal.ui.refactoring.reorg.PasteAction;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.navigator.CommonNavigator;
import org.slf4j.Logger;

import hydrograph.ui.engine.util.ConverterUtil;
import hydrograph.ui.graph.editor.ELTGraphicalEditor;
import hydrograph.ui.graph.editor.JobCopyParticipant;
import hydrograph.ui.graph.model.Container;
import hydrograph.ui.graph.model.utils.GenerateUniqueJobIdUtil;
import hydrograph.ui.graph.utility.CanvasUtils;
import hydrograph.ui.logging.factory.LogFactory;

/**
 * The Class PasteHandler.
 * <p>
 * Handler to Paste component on canvas and Project Explorer 
 * 
 * @author Bitwise
 */
public class PasteHandler extends AbstractHandler implements IHandler {

    private static final Logger logger = LogFactory.INSTANCE.getLogger(PasteHandler.class);
    private static final String ERROR = "Error";
    private static final String JOB_EXTENSION = ".job";
    private static final String PROPERTIES_EXTENSION = ".properties";
    private static final String XML = "xml";
    private static final String JOB = "job";
    private static final String PARAMETER_FOLDER_NAME = "param";

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        List<IFile> jobFiles = new ArrayList<>();
        List<IFile> pastedFileList = new ArrayList<>();
        IWorkbenchPart part = HandlerUtil.getActivePart(event);
        if (part instanceof CommonNavigator) {
            PasteAction action = new PasteAction(
                    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart().getSite());
            action.run();
            IWorkspaceRoot workSpaceRoot = ResourcesPlugin.getWorkspace().getRoot();
            IProject project = workSpaceRoot.getProject(JobCopyParticipant.getCopyToPath().split("/")[1]);
            IFolder jobFolder = project.getFolder(JobCopyParticipant.getCopyToPath()
                    .substring(JobCopyParticipant.getCopyToPath().indexOf('/', 2)));
            IFolder paramFolder = project.getFolder(PARAMETER_FOLDER_NAME);
            try {
                createCurrentJobFileList(jobFolder, jobFiles);
                pastedFileList = getPastedFileList(jobFiles);
                generateUniqueJobIdForPastedFiles(pastedFileList);
                createXmlFilesForPastedJobFiles(pastedFileList);
                List<String> copiedPropertiesList = getCopiedPropertiesList();
                createPropertiesFilesForPastedFiles(paramFolder, pastedFileList, copiedPropertiesList);
                JobCopyParticipant.cleanUpStaticResourcesAfterPasteOperation();

            } catch (CoreException coreException) {
                logger.warn("Error while copy paste jobFiles", coreException.getMessage());
            }

        }

        else if (part instanceof ELTGraphicalEditor) {
            IEditorPart editor = HandlerUtil.getActiveEditor(event);
            ((ELTGraphicalEditor) editor).pasteSelection();
        }

        return null;
    }

    private void generateUniqueJobIdForPastedFiles(List<IFile> pastedFileList) {
        for (IFile file : pastedFileList) {
            try (ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                    InputStream inputStream = file.getContents()) {
                Container container = (Container) CanvasUtils.INSTANCE.fromXMLToObject(inputStream);
                container.setUniqueJobId(GenerateUniqueJobIdUtil.INSTANCE.generateUniqueJobId());
                CanvasUtils.INSTANCE.fromObjectToXML(container, outStream);
                file.setContents(new ByteArrayInputStream(outStream.toByteArray()), true, false, null);

            } catch (CoreException | NoSuchAlgorithmException | IOException exception) {
                logger.warn("Exception while generating unique job id for pasted files.");

            }
        }

    }

    private void createPropertiesFilesForPastedFiles(IFolder paramFolder, List<IFile> pastedFileList,
            List<String> copiedPropertiesList) {
        for (int i = 0; i < copiedPropertiesList.size(); i++) {
            try (InputStream inputStream = paramFolder.getFile(copiedPropertiesList.get(i)).getContents()) {
                IFile file = paramFolder
                        .getFile(pastedFileList.get(i).getName().replace(JOB_EXTENSION, PROPERTIES_EXTENSION));
                if (!file.exists()) {
                    file.create(inputStream, true, null);
                } else {
                    int userInput = showErrorMessage(file,
                            file.getName() + " already exists.Do you want to replace it?");
                    if (userInput == SWT.YES) {
                        file.setContents(inputStream, true, false, null);
                    }
                }
            } catch (CoreException | IOException coreException) {
                logger.error("Error while creating properties files for pasted files ::{}",
                        coreException.getMessage());

            }
        }
    }

    private List<String> getCopiedPropertiesList() {
        List<String> copiedPropertiesList = new ArrayList<>();
        List<IFile> copiedFileList = JobCopyParticipant.getCopiedFileList();
        for (IFile iFile : copiedFileList) {
            copiedPropertiesList.add((iFile.getName().replace(JOB_EXTENSION, PROPERTIES_EXTENSION)));
        }
        return copiedPropertiesList;
    }

    private void createXmlFilesForPastedJobFiles(List<IFile> pastedFileList) {
        for (IFile file : pastedFileList) {
            try (InputStream inputStream = file.getContents()) {
                Container container = (Container) CanvasUtils.INSTANCE.fromXMLToObject(inputStream);
                IPath path = file.getFullPath().removeFileExtension().addFileExtension(XML);
                IFile xmlFile = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
                if (xmlFile.exists()) {
                    int userInput = showErrorMessage(xmlFile,
                            xmlFile.getName() + " already exists.Do you want to replace it?");
                    if (userInput == SWT.YES) {
                        ConverterUtil.INSTANCE.convertToXML(container, true, xmlFile, null);
                    }
                } else {
                    ConverterUtil.INSTANCE.convertToXML(container, true, xmlFile, null);
                }

            } catch (CoreException | InstantiationException | IllegalAccessException | InvocationTargetException
                    | NoSuchMethodException | IOException exception) {
                logger.error("Error while generating xml files for pasted job files", exception);

            }
        }
    }

    private int showErrorMessage(IFile xmlFile, String message) {
        MessageBox messageBox = new MessageBox(Display.getCurrent().getActiveShell(), SWT.ERROR | SWT.YES | SWT.NO);
        messageBox.setText(ERROR);
        messageBox.setMessage(message);
        int returnCode = messageBox.open();
        return returnCode;
    }

    private void createCurrentJobFileList(IFolder jobFolder, List<IFile> jobFiles) throws CoreException {
        for (IResource iResource : jobFolder.members()) {
            if (!(iResource instanceof IFolder)) {
                IFile iFile = (IFile) iResource;
                if (iFile.getFileExtension().equalsIgnoreCase(JOB)) {
                    jobFiles.add(iFile);
                }
            }
        }

    }

    private List<IFile> getPastedFileList(List<IFile> jobFiles) {
        List<IFile> newJobFilesList = ListUtils.subtract(jobFiles, JobCopyParticipant.getPreviousJobFiles());
        jobFiles.clear();
        jobFiles.addAll(newJobFilesList);
        return jobFiles;
    }

}