/******************************************************************************* * 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.execution.tracking.replay; import java.io.FileNotFoundException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.eclipse.gef.ui.parts.GraphicalEditor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import hydrograph.ui.graph.Messages; import hydrograph.ui.graph.editor.ELTGraphicalEditor; import hydrograph.ui.graph.execution.tracking.datastructure.ExecutionStatus; import hydrograph.ui.graph.handler.ViewExecutionHistoryHandler; import hydrograph.ui.graph.job.Job; import hydrograph.ui.graph.job.JobManager; /** * * The Class ViewExecutionHistoryDataDialog used to show execution tracking view history. * @author Bitwise * */ public class ViewExecutionHistoryDataDialog extends Dialog { private static final String VIEW_TRACKING_HISTORY = "View Execution Tracking History"; private static final String EXECUTION_HISTORY_DIALOG="Execution History Dialog"; private static final String BROWSE_TRACKING_FILE="Browse Tracking File"; private static final String EXECUTION_TRACKING_LOG_FILE_EXTENTION = "*.track.log"; private static final String REMOTE_MODE = "Remote"; private static final String LOCAL_MODE = "Local"; private Text trackingFileText; private Table table; private String filePath; private String selectedUniqueJobId; private List<Job> jobDetails; private ViewExecutionHistoryHandler viewExecutionHistoryHandler; /** * Create the dialog. * @param parentShell */ public ViewExecutionHistoryDataDialog(Shell parentShell, ViewExecutionHistoryHandler viewExecutionHistoryHandler, List<Job> jobDetails) { super(parentShell); setShellStyle(SWT.CLOSE | SWT.RESIZE | SWT.TITLE); this.jobDetails = jobDetails; this.viewExecutionHistoryHandler=viewExecutionHistoryHandler; } /** * Create contents of the dialog. * @param parent */ @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); container.setLayout(new GridLayout(1, false)); container.getShell().setText(VIEW_TRACKING_HISTORY); Composite composite = new Composite(container, SWT.NONE); composite.setLayout(new GridLayout(1, false)); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); Composite composite_1 = new Composite(composite, SWT.NONE); composite_1.setLayout(new GridLayout(1, false)); composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); TableViewer tableViewer = new TableViewer(composite_1, SWT.BORDER | SWT.FULL_SELECTION); table = tableViewer.getTable(); table.setLinesVisible(true); table.setHeaderVisible(true); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tblclmnNewColumn = tableViewerColumn.getColumn(); tblclmnNewColumn.setWidth(263); tblclmnNewColumn.setText("Job Id"); TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tblclmnNewColumn_1 = tableViewerColumn_1.getColumn(); tblclmnNewColumn_1.setWidth(207); tblclmnNewColumn_1.setText("Time Stamp"); TableViewerColumn tableViewerColumn_2 = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tblclmnNewColumn_2 = tableViewerColumn_2.getColumn(); tblclmnNewColumn_2.setWidth(154); tblclmnNewColumn_2.setText("Execution Mode"); TableViewerColumn tableViewerColumn_3 = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tblclmnNewColumn_3 = tableViewerColumn_3.getColumn(); tblclmnNewColumn_3.setWidth(119); tblclmnNewColumn_3.setText("Job Status"); setTableColumnValues(tableViewer, jobDetails); tableViewer.getTable().addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { TableItem[] item = table.getSelection(); for (int i = 0; i < item.length; i++){ TableItem selectedItem = item[i]; selectedUniqueJobId = selectedItem.getText(); } } }); Composite composite_2 = new Composite(composite, SWT.NONE); composite_2.setLayout(new GridLayout(3, false)); composite_2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); Label lblNewLabel = new Label(composite_2, SWT.NONE); lblNewLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblNewLabel.setText(BROWSE_TRACKING_FILE); trackingFileText = new Text(composite_2, SWT.BORDER); trackingFileText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Button browseButton = new Button(composite_2, SWT.NONE); browseButton.setText("..."); browseButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { FileDialog fileDialog = new FileDialog(composite.getShell(), SWT.OPEN ); fileDialog.setText(EXECUTION_HISTORY_DIALOG); String[] filterExt = { EXECUTION_TRACKING_LOG_FILE_EXTENTION }; fileDialog.setFilterExtensions(filterExt); fileDialog.setFilterPath(ViewExecutionHistoryUtility.INSTANCE.getLogPath()); String path = fileDialog.open(); if (path == null) return; trackingFileText.setText(path); trackingFileText.setToolTipText(path); } }); trackingFileText.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { filePath = ((Text)event.widget).getText(); } }); return container; } /** * The Function will set Table column values * @param tableViewer * @param jobDetails */ private void setTableColumnValues(TableViewer tableViewer, List<Job> jobDetails){ jobDetails.sort((job1, job2)-> job2.getUniqueJobId().compareTo(job1.getUniqueJobId())); jobDetails.forEach(job -> { String timeStamp = getTimeStamp(job.getUniqueJobId()); TableItem items = new TableItem(table, SWT.None); items.setText(0, job.getUniqueJobId()); items.setText(1, timeStamp); String mode = getJobExecutionMode(job.isRemoteMode()); items.setText(2, mode); items.setText(3, job.getJobStatus()); }); } /** * @param executionMode * @return Job Execution Mode */ private String getJobExecutionMode(boolean executionMode){ String runningMode = ""; if(executionMode){ runningMode = REMOTE_MODE; }else{ runningMode = LOCAL_MODE; } return runningMode; } /** * Create contents of the button bar. * @param parent */ @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /** * The function will return selected unique job id *@return String */ public String getSelectedUniqueJobId(){ return selectedUniqueJobId; } /** * The function will return selected tracking log file path *@return String */ public String getTrackingFilePath(){ return filePath; } @Override protected void okPressed() { filePath=trackingFileText.getText(); if(filePath != null){ }else{ selectedUniqueJobId = jobDetails.get(0).getUniqueJobId(); } try { ExecutionStatus executionStatus = null; if(getTrackingFilePath().trim().isEmpty()){ if(!StringUtils.isEmpty(getSelectedUniqueJobId())){ executionStatus= ViewExecutionHistoryUtility.INSTANCE.readJsonLogFile(getSelectedUniqueJobId(), JobManager.INSTANCE.isLocalMode(), ViewExecutionHistoryUtility.INSTANCE.getLogPath()); }else{ super.okPressed(); } } else{ executionStatus= ViewExecutionHistoryUtility.INSTANCE.readBrowsedJsonLogFile(getTrackingFilePath().trim()); } /*Return from this method if replay not working for old history, so that the view history window will not be closed and * proper error message will be displayed over the view history window.*/ if(executionStatus!=null){ boolean status = viewExecutionHistoryHandler.replayExecutionTracking(executionStatus); if(!status){ return; } }else return; } catch (FileNotFoundException e) { ViewExecutionHistoryUtility.INSTANCE.getMessageDialog(Messages.FILE_DOES_NOT_EXIST); return; }catch(Exception e){ ViewExecutionHistoryUtility.INSTANCE.getMessageDialog(Messages.INVALID_FILE_FORMAT+" " + getUniqueJobId()); return; } super.okPressed(); } /** * @return job id for current open job */ private String getUniqueJobId(){ String jobId = ""; ELTGraphicalEditor eltGraphicalEditor=(ELTGraphicalEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); if(!(eltGraphicalEditor.getEditorInput() instanceof GraphicalEditor)){ jobId = eltGraphicalEditor.getContainer().getUniqueJobId(); return jobId; } return jobId; } /** * Return the initial size of the dialog. */ @Override protected Point getInitialSize() { return new Point(800, 346); } /** * @param jobId * @return Time Stamp */ private String getTimeStamp(String jobId){ String timeStamp; String jobUniqueId = jobId; String[] s1 = jobUniqueId.split("_"); timeStamp = s1[s1.length-1]; long times = Long.parseLong(timeStamp); SimpleDateFormat dateFormat=new SimpleDateFormat("dd MMM yyyy HH:mm:ss z"); timeStamp = dateFormat.format(new Date(times)); return timeStamp; } }