/******************************************************************************* * Copyright (c) 2012 Zend Technologies Ltd. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.zend.php.zendserver.monitor.core; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.php.internal.server.core.Server; import org.eclipse.php.internal.server.core.manager.ServersManager; import org.zend.php.server.core.utils.ServerUtils; import org.zend.php.zendserver.deployment.core.targets.TargetsManagerService; import org.zend.php.zendserver.monitor.internal.core.AbstractMonitor; import org.zend.php.zendserver.monitor.internal.core.TargetMonitor; import org.zend.sdklib.target.IZendTarget; /** * Represents management service for application monitoring. * * @author Wojciech Galanciak, 2012 * */ @SuppressWarnings("restriction") public class MonitorManager { public static final String FILTERS_ATTRIBUTE = "monitoringFilters"; //$NON-NLS-1$ public static final String HIDE_ATTRIBUTE = "monitoringHide"; //$NON-NLS-1$ public static final String HIDE_TIME_ATTRIBUTE = "monitoringHideTime"; //$NON-NLS-1$ public static final String SEVERITY_ATTRIBUTE = "monitoringSeverity"; //$NON-NLS-1$ public static final String SLASH = "/"; //$NON-NLS-1$ public static final String FILTER_SEPARATOR = ","; //$NON-NLS-1$ public static final int DELAY_DEFAULT = 10; public static final int CODE_TRACE = 0x01; public static final int REPEAT = 0x10; public static final String HIDE_KEY = "hide"; //$NON-NLS-1$ public static final String HIDE_TIME_KEY = "hide_time"; //$NON-NLS-1$ public static final String FILTERS_PREF = "filters"; //$NON-NLS-1$ private static Map<String, TargetMonitor> targetMonitors; static { targetMonitors = Collections .synchronizedMap(new HashMap<String, TargetMonitor>()); } /** * Create and start target monitor for specified target id. * * @param targetId * target id */ public static boolean createTargetMonitor(String targetId) { TargetMonitor monitor = targetMonitors.get(targetId); if (monitor == null) { TargetMonitor m = new TargetMonitor(targetId); m.start(); targetMonitors.put(targetId, m); } return true; } /** * Remove concrete monitor. * * @param monitor */ public static void removeMonitor(AbstractMonitor monitor) { Set<String> keys = targetMonitors.keySet(); for (String key : keys) { TargetMonitor m = targetMonitors.get(key); if (m == monitor) { removeTargetMonitor(key); return; } } } /** * Remove target monitor for specified target id. If there is no monitor for * that target, nothing happens. * * @param targetId * target id * @return <code>true</code> if monitor was available; otherwise return * <code>false</code> */ public static boolean removeTargetMonitor(String targetId) { TargetMonitor monitor = targetMonitors.get(targetId); if (monitor != null) { monitor.stop(); targetMonitors.remove(targetId); return true; } return false; } /** * Disable all target monitors. * */ public static void removeAllTargetMonitors() { Set<String> keys = targetMonitors.keySet(); for (String key : keys) { TargetMonitor monitor = targetMonitors.get(key); monitor.stop(); targetMonitors.remove(key); } } /** * Update filters list for active target monitor. * * @param targetId */ public static void updateFilters(String targetId) { TargetMonitor monitor = targetMonitors.get(targetId); if (monitor != null) { monitor.updateFilters(); } } /** * Check if monitor for particular target is started. * * @param targetId * @return <code>true</code> if monitor is started; otherwise return * <code>false</code> */ public static boolean isMonitorStarted(String targetId) { return targetMonitors.get(targetId) != null; } /** * Returns list of filters for specified target. * * @param targetId * @return */ public static List<String> getFilters(String targetId) { TargetMonitor monitor = targetMonitors.get(targetId); if (monitor == null) { monitor = new TargetMonitor(targetId); } return monitor.getFilters(); } public static boolean getHide(String targetId) { IZendTarget target = TargetsManagerService.INSTANCE.getTargetManager() .getTargetById(targetId); Server server = ServerUtils.getServer(target); String value = server.getAttribute(MonitorManager.HIDE_ATTRIBUTE, null); if (value == null) { IEclipsePreferences prefs = MonitorManager.getPreferences(); prefs.get(HIDE_KEY, null); } return value != null ? Boolean.valueOf(value) : false; } public static int getHideTime(String targetId) { IZendTarget target = TargetsManagerService.INSTANCE.getTargetManager() .getTargetById(targetId); Server server = ServerUtils.getServer(target); String value = server.getAttribute(MonitorManager.HIDE_TIME_ATTRIBUTE, null); if (value == null) { IEclipsePreferences prefs = MonitorManager.getPreferences(); prefs.get(HIDE_TIME_KEY, null); } return value != null ? Integer.valueOf(value) : DELAY_DEFAULT; } public static boolean getServerity(String targetId, String severityName) { IZendTarget target = TargetsManagerService.INSTANCE.getTargetManager() .getTargetById(targetId); Server server = ServerUtils.getServer(target); String value = server.getAttribute(MonitorManager.SEVERITY_ATTRIBUTE + severityName, null); if (value == null) { IEclipsePreferences prefs = MonitorManager.getPreferences(); prefs.get(targetId + '.' + severityName, null); } return value != null ? Boolean.valueOf(value) : true; } public static String getFiltersKey(String targetId) { return targetId + '.' + FILTERS_PREF; } public static IEclipsePreferences getPreferences() { return InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID); } public static void addFilter(String targetId, String baseURL) { if (!baseURL.endsWith(SLASH)) { baseURL += SLASH; } TargetMonitor monitor = targetMonitors.get(targetId); if (monitor == null) { monitor = new TargetMonitor(targetId); } List<String> filters = monitor.getFilters(); if (!filters.contains(baseURL)) { filters.add(baseURL); } if (!filters.isEmpty() && !isMonitorStarted(targetId)) { createTargetMonitor(targetId); } String newValue = monitor.getValue(filters); IZendTarget target = TargetsManagerService.INSTANCE.getTargetManager() .getTargetById(targetId); Server server = ServerUtils.getServer(target); if (server != null) { server.setAttribute(MonitorManager.FILTERS_ATTRIBUTE, newValue); ServersManager.save(); } updateFilters(targetId); } public static void removeFilter(String targetId, String baseURL) { if (!baseURL.endsWith(SLASH)) { baseURL += SLASH; } TargetMonitor monitor = targetMonitors.get(targetId); if (monitor == null) { monitor = new TargetMonitor(targetId); } List<String> filters = monitor.getFilters(); filters.remove(baseURL); if (filters.isEmpty() && isMonitorStarted(targetId)) { removeTargetMonitor(targetId); } String newValue = monitor.getValue(filters); IZendTarget target = TargetsManagerService.INSTANCE.getTargetManager() .getTargetById(targetId); Server server = ServerUtils.getServer(target); if (server != null) { server.setAttribute(MonitorManager.FILTERS_ATTRIBUTE, newValue); ServersManager.save(); } updateFilters(targetId); } }