hydrograph.ui.graph.action.debug.ViewDataCurrentJobAction.java Source code

Java tutorial

Introduction

Here is the source code for hydrograph.ui.graph.action.debug.ViewDataCurrentJobAction.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.graph.action.debug;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang.StringUtils;
import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;

import hydrograph.ui.common.datastructures.dataviewer.JobDetails;
import hydrograph.ui.common.interfaces.parametergrid.DefaultGEFCanvas;
import hydrograph.ui.common.util.Constants;
import hydrograph.ui.dataviewer.constants.MessageBoxText;
import hydrograph.ui.dataviewer.filter.FilterConditions;
import hydrograph.ui.dataviewer.window.DebugDataViewer;
import hydrograph.ui.graph.Messages;
import hydrograph.ui.graph.controller.ComponentEditPart;
import hydrograph.ui.graph.controller.LinkEditPart;
import hydrograph.ui.graph.editor.ELTGraphicalEditor;
import hydrograph.ui.graph.execution.tracking.datastructure.SubjobDetails;
import hydrograph.ui.graph.job.Job;
import hydrograph.ui.graph.job.JobManager;
import hydrograph.ui.graph.model.Component;
import hydrograph.ui.graph.model.Container;
import hydrograph.ui.graph.model.Link;
import hydrograph.ui.graph.utility.MessageBox;
import hydrograph.ui.graph.utility.ViewDataUtils;

/**
 * The Class WatchRecordAction used to view data at watch points after job execution
 * 
 * @author Bitwise
 * 
 */
public class ViewDataCurrentJobAction extends SelectionAction {
    private WatchRecordInner watchRecordInner = new WatchRecordInner();
    private static Map<String, DebugDataViewer> dataViewerMap;
    private Map<String, FilterConditions> watcherAndConditon = new LinkedHashMap<String, FilterConditions>();

    public ViewDataCurrentJobAction(IWorkbenchPart part) {
        super(part);
        setLazyEnablementCalculation(true);
    }

    @Override
    protected void init() {
        super.init();
        setText(Messages.VIEW_DATA_CURRENT_RUN_TEXT);
        setId(Constants.CURRENT_VIEW_DATA_ID);
        setEnabled(true);

        dataViewerMap = new HashMap<>();
        JobManager.INSTANCE.setDataViewerMap(dataViewerMap);
    }

    @Override
    protected boolean calculateEnabled() {
        Map<String, SubjobDetails> componentNameAndLink = new HashMap();
        int count = 0;
        boolean isWatcher = false;
        List<Object> selectedObject = getSelectedObjects();
        for (Object obj : selectedObject) {
            if (obj instanceof LinkEditPart) {
                Link link = (Link) ((LinkEditPart) obj).getModel();
                String componentId = link.getSource().getComponentId();
                Component component = link.getSource();
                if (StringUtils.equalsIgnoreCase(component.getComponentName(), Constants.SUBJOB_COMPONENT)) {
                    String componenet_Id = "";
                    String socket_Id = "";
                    ViewDataUtils.getInstance().subjobParams(componentNameAndLink, component, new StringBuilder(),
                            link.getSourceTerminal());
                    for (Entry<String, SubjobDetails> entry : componentNameAndLink.entrySet()) {
                        String comp_soc = entry.getKey();
                        String[] split = StringUtils.split(comp_soc, "/.");
                        componenet_Id = split[0];
                        for (int i = 1; i < split.length - 1; i++) {
                            componenet_Id = componenet_Id + "." + split[i];
                        }
                        socket_Id = split[split.length - 1];
                    }

                    watchRecordInner.setComponentId(componenet_Id);
                    watchRecordInner.setSocketId(socket_Id);
                } else {
                    watchRecordInner.setComponentId(componentId);
                    String socketId = link.getSourceTerminal();
                    watchRecordInner.setSocketId(socketId);
                }
                ViewDataUtils dataUtils = ViewDataUtils.getInstance();
                isWatcher = dataUtils.checkWatcher(link.getSource(), link.getSourceTerminal());
            }
        }

        if (!selectedObject.isEmpty() && isWatcher) {
            for (Object obj : selectedObject) {
                if (obj instanceof LinkEditPart) {
                    count++;
                }
            }
        }

        if (count == 1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Gets the component canvas.
     *
     * @return the component canvas
     */
    private DefaultGEFCanvas getComponentCanvas() {
        if (PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
                .getActiveEditor() instanceof DefaultGEFCanvas)
            return (DefaultGEFCanvas) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
                    .getActiveEditor();
        else
            return null;
    }

    @Override
    public void run() {
        // Check if job is executed in debug mode
        Job job = JobManager.INSTANCE.getPreviouslyExecutedJobs()
                .get(getComponentCanvas().getActiveProject() + "." + getComponentCanvas().getJobName());
        if (job == null) {
            String jobName = StringUtils.split(getComponentCanvas().getJobName(), ".")[0];
            Job mainJob = JobManager.INSTANCE.getPreviouslyExecutedJobs()
                    .get(getComponentCanvas().getActiveProject() + "." + jobName);
            if (mainJob != null && mainJob.isDebugMode() && mainJob.isExecutionTrack() == true) {
                String previousComponentId = getPreviousComponentId();
                String componentId = ViewDataUtils.getInstance().getComponentId();
                JobDetails jobDetails = getJobDetails(mainJob);
                componentId = getComponentId(previousComponentId, componentId, jobDetails);
                jobDetails.setComponentID(componentId);

                String dataViewerWindowName = mainJob.getLocalJobID().replace(".", "_") + "_"
                        + watchRecordInner.getComponentId() + "_" + watchRecordInner.getSocketId();
                if (dataViewerMap.keySet().contains(dataViewerWindowName)) {
                    Point originalWindowSize = dataViewerMap.get(dataViewerWindowName).getShell().getSize();
                    setShellProperties(dataViewerWindowName, originalWindowSize);
                    return;
                }

                final String dataViewerWindowTitle = dataViewerWindowName;

                DebugDataViewer window = new DebugDataViewer(jobDetails, dataViewerWindowTitle);
                String watcherId = getWatcherId(dataViewerWindowTitle, window);

                window.open();
                setWatcherAndConditionMap(window, watcherId);
            } else {
                showErrorMessage(mainJob);
                return;
            }
        } else if (!job.isDebugMode()) {
            showErrorMessage(job);
        } else {
            // Create data viewer window name, if window exist reopen same
            // window
            String dataViewerWindowName = job.getLocalJobID().replace(".", "_") + "_"
                    + watchRecordInner.getComponentId() + "_" + watchRecordInner.getSocketId();
            if (dataViewerMap.keySet().contains(dataViewerWindowName)) {
                Point originalWindowSize = dataViewerMap.get(dataViewerWindowName).getShell().getSize();
                setShellProperties(dataViewerWindowName, originalWindowSize);
                return;
            }

            final JobDetails jobDetails = getJobDetails(job);

            final String dataViewerWindowTitle = dataViewerWindowName;

            DebugDataViewer window = new DebugDataViewer(jobDetails, dataViewerWindowTitle);
            String watcherId = getWatcherId(dataViewerWindowTitle, window);

            window.open();
            setWatcherAndConditionMap(window, watcherId);
        }

    }

    private void setWatcherAndConditionMap(DebugDataViewer window, String watcherId) {
        if (window.getConditions() != null) {
            if (!window.getConditions().getRetainLocal()) {
                ViewDataUtils.getInstance().clearLocalFilterConditions(window);
            }
            if (!window.getConditions().getRetainRemote()) {
                ViewDataUtils.getInstance().clearRemoteFilterConditions(window);
            }
            watcherAndConditon.put(watcherId, window.getConditions());
        }
    }

    private void showErrorMessage(Job mainJob) {
        if (mainJob == null) {
            MessageBox.INSTANCE.showMessage(MessageBoxText.INFO,
                    Messages.RUN_JOB_IN_DEBUG_OR_OPEN_SUBJOB_THROUGH_TRACKSUBJOB);
        } else {
            if (!mainJob.isDebugMode()) {
                MessageBox.INSTANCE.showMessage(MessageBoxText.INFO, Messages.RUN_THE_JOB_IN_DEBUG_MODE);
            } else {
                if (!mainJob.isExecutionTrack()) {
                    MessageBox.INSTANCE.showMessage(MessageBoxText.INFO, Messages.OPEN_SUBJOB_THROUGH_TRACK_SUBJOB);
                }
            }
        }
    }

    private void setShellProperties(String dataViewerWindowName, Point originalWindowSize) {
        dataViewerMap.get(dataViewerWindowName).getShell().setActive();
        dataViewerMap.get(dataViewerWindowName).getShell().setMaximized(true);
        dataViewerMap.get(dataViewerWindowName).getShell()
                .setSize(new Point(originalWindowSize.x, originalWindowSize.y));
    }

    private String getPreviousComponentId() {
        Container mainContainer = ((ELTGraphicalEditor) getComponentCanvas()).getContainer();
        ComponentEditPart componentEditPart = (ComponentEditPart) mainContainer.getSubjobComponentEditPart();
        LinkEditPart linkEditPart = (LinkEditPart) componentEditPart.getTargetConnections().get(0);
        Link link = (Link) linkEditPart.getModel();
        String previousComponentId = link.getSource().getComponentId();
        return previousComponentId;
    }

    private String getComponentId(String previousComponentId, String componentId, JobDetails jobDetails) {
        if (jobDetails.getComponentID().equalsIgnoreCase(Constants.INPUT_SUBJOB)) {
            componentId = componentId.substring(componentId.indexOf(".") + 1) + previousComponentId;
        } else {
            componentId = componentId + jobDetails.getComponentID();
        }
        return componentId;
    }

    private String getWatcherId(final String dataViewerWindowTitle, DebugDataViewer window) {
        String watcherId = watchRecordInner.getComponentId() + watchRecordInner.getComponentId();
        dataViewerMap.put(dataViewerWindowTitle, window);
        window.setBlockOnOpen(true);
        window.setDataViewerMap(dataViewerMap);
        if (watcherAndConditon.containsKey(watcherId)) {
            window.setConditions(watcherAndConditon.get(watcherId));
            if (watcherAndConditon.get(watcherId).isOverWritten()) {
                window.setOverWritten(watcherAndConditon.get(watcherId).isOverWritten());
            }
        }
        return watcherId;
    }

    private JobDetails getJobDetails(Job job) {
        final JobDetails jobDetails = new JobDetails(job.getHost(), job.getPortNumber(), job.getUserId(),
                job.getPassword(), job.getBasePath(), job.getUniqueJobId(), watchRecordInner.getComponentId(),
                watchRecordInner.getSocketId(), job.isRemoteMode(), job.getJobStatus());
        return jobDetails;
    }
}