package io.pcp.parfait; import java.lang.management.ManagementFactory; import java.util.Collections; import io.pcp.parfait.DynamicMonitoringView; import io.pcp.parfait.dxm.HashingIdentifierSource; import io.pcp.parfait.dxm.IdentifierSource; public class MonitoringViewProperties { public static final String PARFAIT = "parfait"; private static final String NAME = "name"; private static final String CLUSTER = "cluster"; private static final String INTERVAL = "interval"; private static final String STARTUP = "startup"; private static final String CONNECT = "connect"; public static final String PARFAIT_NAME = PARFAIT + "." + NAME; public static final String PARFAIT_CLUSTER = PARFAIT + "." + CLUSTER; public static final String PARFAIT_INTERVAL = PARFAIT + "." + INTERVAL; public static final String PARFAIT_STARTUP = PARFAIT + "." + STARTUP; public static final String PARFAIT_CONNECT = PARFAIT + "." + CONNECT; private static final String DEFAULT_INTERVAL = "1000"; // milliseconds private static final String DEFAULT_CONNECT = "localhost:9875"; public static String getCommandBasename(String command) { // trim away arguments, produce a generally sanitized basename if (command != null && command.length() > 0) { int index; if (Character.isLetter(command.charAt(0)) == false) return null; for (index = 0; index < command.length(); index++) { if (Character.isLetterOrDigit(command.charAt(index)) == false) break; } return command.substring(0, index); } return null; } public static String getDefaultCommand() { return getCommandBasename(System.getProperty("sun.java.command")); } public static String getParfaitName() { return getCommandBasename(System.getProperty(PARFAIT_NAME)); } public static String getRuntimeName() { return ManagementFactory.getRuntimeMXBean().getName(); } public static String getFallbackName(String runtimeName) { String name = PARFAIT; // check for availability of a parsable runtime string name if (runtimeName != null) { String[] pidAndHost = runtimeName.split("@", 2); if (pidAndHost.length == 2) { name += pidAndHost[0]; // append PID, inferred from runtime } } return name; } public static String getDefaultName(String parfaitName, String commandName, String runtimeName) { // check for properties file or command line system property override if (parfaitName != null) { return parfaitName; } // check for availability of a user-friendly default command name if (commandName != null) { return commandName; } // intuit some other valid name, even if it is just "parfait" return getFallbackName(runtimeName); } public static String getDefaultCluster(String name) { String cluster = System.getProperty(PARFAIT_CLUSTER); if (cluster == null) { IdentifierSource clusterSource = new HashingIdentifierSource(1 << 12); Integer id = clusterSource.calculateId(name, Collections.<Integer>emptySet()); return id.toString(); } return cluster; } public static String getDefaultInterval() { String interval = System.getProperty(PARFAIT_INTERVAL); if (interval == null) { return DEFAULT_INTERVAL; } try { Integer.parseInt(interval); // safe verification with fallback } catch (NumberFormatException e) { return DEFAULT_INTERVAL; } return interval; } public static String getDefaultStartup() { String startup = System.getProperty(PARFAIT_STARTUP); if (startup == null) { return Long.toString(DynamicMonitoringView.defaultQuietPeriod()); } try { Long.parseLong(startup); // safe verification with fallback } catch (NumberFormatException e) { return Long.toString(DynamicMonitoringView.defaultQuietPeriod()); } return startup; } public static String getDefaultConnection() { String connect = System.getProperty(PARFAIT_CONNECT); if (connect == null || connect.isEmpty()) { return DEFAULT_CONNECT; } return connect; } public static void setupProperties() { String name = getDefaultName(getParfaitName(), getDefaultCommand(), getRuntimeName()); System.setProperty(PARFAIT_NAME, name); String cluster = getDefaultCluster(name); System.setProperty(PARFAIT_CLUSTER, cluster); String interval = getDefaultInterval(); System.setProperty(PARFAIT_INTERVAL, interval); String startup = getDefaultStartup(); System.setProperty(PARFAIT_STARTUP, startup); String connect = getDefaultConnection(); System.setProperty(PARFAIT_CONNECT, connect); } }