Fixed netconf monitoring.
[controller.git] / opendaylight / commons / controller-maven-plugin / src / main / java / org / opendaylight / controller / maven / plugin / util / ProcessMonitor.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.controller.maven.plugin.util;
10
11 import java.io.File;
12 import java.util.ArrayList;
13 import java.util.Collections;
14 import java.util.List;
15
16 public class ProcessMonitor {
17     public static final String SEP = File.pathSeparator;
18     public static final boolean WIN =
19             System.getProperty("os.name").toLowerCase().indexOf("windows") > -1;
20
21
22
23     public void log(String msg) {
24         System.out.println("" + msg);
25     }
26
27     public List<JavaProcess> getProcesses() {
28         return Collections.emptyList();
29     }
30
31     public List<JavaProcess> getProcesses(String mainClass, String systemPropertyKey) {
32         List<JavaProcess> result = new ArrayList<JavaProcess>();
33          for (JavaProcess info : getProcesses()) {
34             if (info.getMainClass().equals(mainClass)) {
35                 if (info.getSystemProperties().containsKey(systemPropertyKey)) {
36                     result.add(info);
37                 }
38             }
39         }
40         return result;
41     }
42
43     public int kill(String mainClass) {
44         for (JavaProcess info : getProcesses()) {
45             if (info.getMainClass().equals(mainClass)) {
46                 log("Killing process matching class: " + mainClass);
47                 return kill(info.getPid());
48             }
49         }
50         return -1;
51     }
52
53     public static int kill(int pid)  {
54         String cmd = WIN ? "TASKKILL /F /PID " + pid : "kill -SIGTERM " + pid;
55         try {
56             Process p = Runtime.getRuntime().exec(cmd);
57             p.waitFor();
58             return p.exitValue();
59         } catch (Exception e) {
60             e.printStackTrace();
61             return -1;
62         }
63     }
64
65     public static ProcessMonitor load() {
66         // load the providers dynamically to allow error handling
67         ProcessMonitor pm = load("org.opendaylight.controller.maven.plugin.util.VMProcessMonitor");
68         if (pm == null) {
69             pm = load("org.opendaylight.controller.maven.plugin.util.JpsProcessMonitor");
70         }
71         return (pm == null ? new ProcessMonitor() : pm);
72     }
73
74     private static ProcessMonitor load(String clz) {
75         try {
76             Class c = Class.forName(clz);
77             return (ProcessMonitor) c.newInstance();
78         } catch (Exception e) {
79             e.printStackTrace();
80             return null;
81         }
82     }
83
84     // simple driver for basic manual testing
85     public static void main(String[] args) throws Exception {
86         ProcessMonitor pm = ProcessMonitor.load();
87         System.out.println("==== " + pm);
88         for (JavaProcess info : pm.getProcesses()) {
89             System.out.println(info.toString());
90         }
91         pm.kill("Foo");
92         System.out.println("==== controller processses ");
93         for (JavaProcess info : pm.getProcesses(
94                 "org.eclipse.equinox.launcher.Main", "opendaylight.controller"))
95         {
96             System.out.println(info.toString());
97             pm.kill(info.getPid());
98         }
99     }
100
101 }