/******************************************************************************* * 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.perspective; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Map.Entry; import java.util.Properties; import org.apache.commons.lang.StringUtils; import org.eclipse.core.runtime.Platform; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.application.ActionBarAdvisor; import org.eclipse.ui.application.IActionBarConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchWindowAdvisor; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; import org.slf4j.Logger; import hydrograph.ui.common.debug.service.IDebugService; import hydrograph.ui.common.util.ConfigFileReader; import hydrograph.ui.common.util.OSValidator; import hydrograph.ui.common.util.XMLConfigUtil; import hydrograph.ui.graph.job.Job; import hydrograph.ui.graph.job.JobManager; import hydrograph.ui.logging.factory.LogFactory; import hydrograph.ui.perspective.config.ELTPerspectiveConfig; // TODO: Auto-generated Javadoc /** * The Class ApplicationWorkbenchWindowAdvisor. * * @author Bitwise */ public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { private static final Logger logger = LogFactory.INSTANCE.getLogger(ApplicationWorkbenchWindowAdvisor.class); //private static final String CURRENT_THEME_ID = "hydrograph.ui.custom.ui.theme"; //$NON-NLS-1$ private static final String WARNING_TITLE="Warning"; //$NON-NLS-1$ private static final String WARNING_MESSAGE="Current DPI setting is other than 100%. Recommended 100%.\nUpdate it from Control Panel -> Display settings.\n\nNote: DPI setting other than 100% may cause alignment issues."; //$NON-NLS-1$ private static final int DPI_COORDINATE=96; // View Data config properties private static final String DRIVER_CLASS = "DRIVER_CLASS"; public static final String SERVICE_JAR = "SERVICE_JAR"; public static final String PORT_NUMBER = "PORT_NO"; /** * Instantiates a new application workbench window advisor. * * @param configurer * the configurer */ public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { super(configurer); } public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) { return new ApplicationActionBarAdvisor(configurer); } public void preWindowOpen() { IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); ELTPerspectiveConfig eltPerspectiveConfig = new ELTPerspectiveConfig(configurer); eltPerspectiveConfig.setDefaultELTPrespectiveConfigurations(); //PlatformUI.getWorkbench().getThemeManager().setCurrentTheme(CURRENT_THEME_ID); } @Override public void createWindowContents(Shell shell) { super.createWindowContents(shell); } @Override public void postWindowOpen() { super.postWindowOpen(); getWindowConfigurer().getWindow().getShell().setMaximized(true); getWindowConfigurer().getWindow().getActivePage().resetPerspective(); if (OSValidator.isWindows()) { Point dpiCoordinates = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell().getDisplay() .getDPI(); if (dpiCoordinates.x != DPI_COORDINATE && dpiCoordinates.y != DPI_COORDINATE) { MessageBox messageBox = new MessageBox(new Shell(),SWT.ICON_WARNING| SWT.OK); messageBox.setText(WARNING_TITLE); messageBox.setMessage(WARNING_MESSAGE); int response = messageBox.open(); if (response == SWT.OK) { } } } Properties properties = ConfigFileReader.INSTANCE.getCommonConfigurations(); try { serviceInitiator(properties); } catch (IOException exception) { logger.error("Failure in IO", exception); } } private void serviceInitiator(Properties properties) throws IOException{ if(OSValidator.isWindows()){ String command = "java -cp " + getInstallationConfigPath().trim() + ";"+Platform.getInstallLocation().getURL().getPath()+properties.getProperty(SERVICE_JAR) + " " +properties.getProperty(DRIVER_CLASS); ProcessBuilder builder = new ProcessBuilder(new String[]{"cmd", "/c", command}); builder.start(); } else if(OSValidator.isMac()){ logger.debug("On Mac Operating System...."); String command="java -cp " + getInstallationConfigPath().trim() + ":" +Platform.getInstallLocation().getURL().getPath()+ properties.getProperty(SERVICE_JAR) + " " +properties.getProperty(DRIVER_CLASS); logger.debug("command{}", command); ProcessBuilder builder = new ProcessBuilder(new String[]{"bash", "-c", command}); builder.start(); } else if(OSValidator.isUnix()){ new ProcessBuilder(new String[]{"java", "-jar", properties.getProperty(SERVICE_JAR)}).start(); } else if(OSValidator.isSolaris()){ } } @Override public boolean preWindowShellClose() { for (Entry<String, Job> entry : JobManager.INSTANCE.getRunningJobsMap().entrySet()) { if (entry.getValue().isRemoteMode()) { MessageBox box = new MessageBox(Display.getCurrent().getActiveShell(), SWT.ICON_QUESTION | SWT.YES | SWT.CANCEL | SWT.NO); box.setMessage(Messages.TOOL_EXT_MESSAGE); box.setText(Messages.TOOL_EXIT_MESSAGE_BOX_TITLE); int returCode = box.open(); if (returCode == SWT.YES) { JobManager.INSTANCE.killALLRemoteProcess(); }else return false; break; } } return true; } @Override public void dispose() { super.dispose(); BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); ServiceReference<IDebugService> serviceReference = (ServiceReference<IDebugService>) bundleContext.getServiceReference(IDebugService.class.getName()); if(serviceReference != null){ IDebugService debugService = (IDebugService)bundleContext.getService(serviceReference); debugService.deleteDebugFiles(); } Properties properties = ConfigFileReader.INSTANCE.getCommonConfigurations(); try { killPortProcess(properties); } catch (IOException e) { logger.debug("Socket is not closed."); } } public void killPortProcess(Properties properties) throws IOException{ if(OSValidator.isWindows()){ String pid =getServicePortPID(properties.getProperty(PORT_NUMBER)); if(StringUtils.isNotBlank(pid)){ int portPID = Integer.parseInt(pid); ProcessBuilder builder = new ProcessBuilder(new String[]{"cmd", "/c", "taskkill /F /PID " + portPID}); builder.start(); } } else if(OSValidator.isMac()){ int portNumber = Integer.parseInt(properties.getProperty(PORT_NUMBER)); ProcessBuilder builder = new ProcessBuilder(new String[]{"bash", "-c", "lsof -P | grep :" + portNumber + " | awk '{print $2}' | xargs kill -9"}); builder.start(); } } /** * This function will be return process ID which running on defined port * */ public String getServicePortPID(String portNumber) throws IOException{ 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 ""; } /** * This function used to return Rest Service port Number which running on local * */ public String getServicePortFromPropFile(String propertyFile,String portNo,String serviceJar){ String portNumber = null; try(FileReader fileReader = new FileReader(XMLConfigUtil.CONFIG_FILES_PATH + propertyFile);) { Properties properties = new Properties(); properties.load(fileReader); if(StringUtils.isNotBlank(properties.getProperty(serviceJar))){ portNumber = properties.getProperty(portNo); } } catch (FileNotFoundException e) { logger.error("File not exists", e); } catch (IOException e) { logger.error(e.getMessage(), e); } return portNumber; } private static String getInstallationConfigPath() { String path = Platform.getInstallLocation().getURL().getPath(); if(StringUtils.isNotBlank(path) && StringUtils.startsWith(path, "/") && OSValidator.isWindows()){ path = StringUtils.substring(path, 1); } return path + "config/service/config" ; } }