/******************************************************************************* * 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.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Iterator; import java.util.Properties; import javax.websocket.CloseReason; import javax.websocket.CloseReason.CloseCodes; import javax.websocket.Session; import org.apache.commons.lang.StringUtils; import org.eclipse.gef.EditPart; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.ui.parts.GraphicalEditor; import org.eclipse.ui.PlatformUI; import org.slf4j.Logger; import hydrograph.ui.common.util.ConfigFileReader; import hydrograph.ui.common.util.OSValidator; import hydrograph.ui.common.util.PreferenceConstants; import hydrograph.ui.common.util.XMLConfigUtil; import hydrograph.ui.graph.controller.ComponentEditPart; import hydrograph.ui.graph.controller.LinkEditPart; import hydrograph.ui.graph.editor.ELTGraphicalEditor; import hydrograph.ui.graph.job.Job; import hydrograph.ui.graph.job.JobStatus; import hydrograph.ui.graph.model.Component; import hydrograph.ui.graph.model.ComponentExecutionStatus; import hydrograph.ui.logging.factory.LogFactory; /** * The Class TrackingDisplayUtils. */ public class TrackingDisplayUtils { /** The instance. */ public static TrackingDisplayUtils INSTANCE = new TrackingDisplayUtils(); private long DELAY=7000; /** The logger. */ private static Logger logger = LogFactory.INSTANCE.getLogger(TrackingDisplayUtils.class); /** The Constant LOCAL_URL. */ private static final String WEBSOCKET_LOCAL_HOST = "WEBSOCKET_LOCAL_HOST"; /** The Constant WEBSOCKET_ROUTE. */ private static final String WEBSOCKET_UI_ROUTE = "WEBSOCKET_UI_ROUTE"; //Execution tracking config properties private static final String EXECUTION_TRACKING_PORT = "EXECUTION_TRACKING_PORT"; /** The local host. */ private String localHost; /** The websocket route. */ private String websocketRoute; public static final String WEB_SOCKET = "ws://"; private static final String COLON = ":"; /** * Instantiates a new tracking display utils. */ private TrackingDisplayUtils() { } /** * Clears the status of all components. Also Initiates record count to 0. */ public void clearTrackingStatus() { ELTGraphicalEditor editor = (ELTGraphicalEditor) PlatformUI .getWorkbench().getWorkbenchWindows()[0].getActivePage() .getActiveEditor(); if (editor != null && editor instanceof ELTGraphicalEditor) { editor.closeAllSubJobLinkedEditors(); String currentJobName = editor.getActiveProject() + "." + editor.getJobName(); Job job = editor.getJobInstance(currentJobName); if(job!=null){ job.setJobStatus(JobStatus.PENDING); } clearTrackingStatusForEditor(editor); } } /** * Clear tracking status. * * @param jobId * the job id */ public void clearTrackingStatus(String jobId) { ELTGraphicalEditor editor = (ELTGraphicalEditor) PlatformUI .getWorkbench().getWorkbenchWindows()[0].getActivePage() .getActiveEditor(); if (editor != null && editor instanceof ELTGraphicalEditor && (editor.getJobId().equals(jobId))) { editor.closeAllSubJobLinkedEditors(); String currentJobName = editor.getActiveProject() + "." + editor.getJobName(); Job job = editor.getJobInstance(currentJobName); clearTrackingStatusForEditor(editor); } } /** * Clear tracking status for editor. * * @param editor * the editor */ public void clearTrackingStatusForEditor(ELTGraphicalEditor editor) { GraphicalViewer graphicalViewer = (GraphicalViewer) ((GraphicalEditor) editor) .getAdapter(GraphicalViewer.class); for (Iterator<EditPart> ite = graphicalViewer.getEditPartRegistry() .values().iterator(); ite.hasNext();) { EditPart editPart = ite.next(); if (editPart instanceof ComponentEditPart) { Component component = ((ComponentEditPart) editPart) .getCastedModel(); component.updateStatus(ComponentExecutionStatus.BLANK.value()); } else if (editPart instanceof LinkEditPart) { ((LinkEditPart) editPart).clearRecordCountAtPort(); } } } /** * Gets the executiontracking port no. * * @return the executiontracking port no */ public String getExecutiontrackingPortNo() { String portNumber = null; Properties properties = ConfigFileReader.INSTANCE.getCommonConfigurations(); if (StringUtils.isNotBlank(properties.getProperty(EXECUTION_TRACKING_PORT)) && StringUtils.isNotBlank(properties.getProperty(WEBSOCKET_LOCAL_HOST)) && StringUtils.isNotBlank(properties.getProperty(WEBSOCKET_UI_ROUTE))) { portNumber = properties.getProperty(EXECUTION_TRACKING_PORT); localHost = properties.getProperty(WEBSOCKET_LOCAL_HOST); websocketRoute = properties.getProperty(WEBSOCKET_UI_ROUTE); } return portNumber; } /** * Gets the web socket remote url. * * @return the web socket remote url */ public String getWebSocketRemoteUrl(Job job) { String remoteUrl = null; String portNo = getPortFromPreference(); if (job.isRemoteMode()&& PlatformUI.getPreferenceStore().getBoolean(PreferenceConstants.USE_REMOTE_CONFIGURATION)) { portNo = PlatformUI.getPreferenceStore().getString(PreferenceConstants.REMOTE_PORT_NO); if(StringUtils.isBlank(portNo)){ portNo = PreferenceConstants.DEFAULT_PORT_NO; } String remoteHost = PlatformUI.getPreferenceStore().getString(PreferenceConstants.REMOTE_HOST); remoteUrl = WEB_SOCKET + remoteHost + COLON + portNo + websocketRoute; } else { if (job.isRemoteMode()) { portNo = PlatformUI.getPreferenceStore().getString(PreferenceConstants.REMOTE_PORT_NO); if(StringUtils.isBlank(portNo)){ portNo = PreferenceConstants.DEFAULT_PORT_NO; } } remoteUrl = WEB_SOCKET + job.getHost() + COLON + portNo + websocketRoute; } return remoteUrl; } /** * Gets the web socket local host. * * @return the web socket local host */ public String getWebSocketLocalHost() { String portNo = getPortFromPreference(); String localUrl = localHost + portNo + websocketRoute; return localUrl; } /** * Gets the port from preference. * * @return the port from preference */ public String getPortFromPreference() { getExecutiontrackingPortNo(); String portNo = PlatformUI.getPreferenceStore().getString(PreferenceConstants.LOCAL_PORT_NO); if(StringUtils.isBlank(portNo)){ portNo = PreferenceConstants.DEFAULT_PORT_NO;; } return portNo; } /** * @return remote port number */ public String getRemotePortFromPreference(){ String port = PlatformUI.getPreferenceStore().getString(PreferenceConstants.REMOTE_PORT_NO); if(StringUtils.isBlank(port)){ port = PreferenceConstants.DEFAULT_PORT_NO; } return port; } /** * This function will be return process ID which running on defined port. * * @return the service port pid * @throws IOException * Signals that an I/O exception has occurred. */ public String getServicePortPID(Properties properties) throws IOException { int portNumber = Integer.parseInt(properties.getProperty(EXECUTION_TRACKING_PORT)); if (OSValidator.isWindows()) { ProcessBuilder builder = new ProcessBuilder(new String[] { "cmd", "/c", "netstat -a -o -n |findstr :" + portNumber }); Process process = builder.start(); InputStream inputStream = process.getInputStream(); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream)); String str = bufferedReader.readLine(); str = StringUtils.substringAfter(str, "LISTENING"); str = StringUtils.trim(str); return str; } return ""; } /** * * Return tools Installation path * * @return {@link String} */ public String getInstallationPath() { String installationPath = XMLConfigUtil.CONFIG_FILES_PATH + "/logger/JobTrackingLog"; if (OSValidator.isWindows()) { if (installationPath.startsWith("/")) { installationPath = installationPath.replaceFirst("/", "").replace("/", "\\"); } } return installationPath; } /** * * Close websocket client connection. * @param session */ public void closeWebSocketConnection(Session session){ try { Thread.sleep(DELAY); } catch (InterruptedException e1) { } if (session != null && session.isOpen()) { try { CloseReason closeReason = new CloseReason(CloseCodes.NORMAL_CLOSURE,"Closed"); session.close(closeReason); logger.info("Session closed"); } catch (IOException e) { logger.error("Fail to close connection ",e); } } } /** * * @param job */ public void changeStatusForExecTracking(Job job){ if(job!=null){ job.setJobStatus(JobStatus.PENDING); } } }