/*******************************************************************************
* 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.internal.core;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.php.internal.server.core.Server;
import org.zend.php.server.core.utils.ServerUtils;
import org.zend.php.zendserver.deployment.core.targets.TargetsManagerService;
import org.zend.php.zendserver.deployment.debug.core.config.LaunchUtils;
import org.zend.php.zendserver.monitor.core.MonitorManager;
import org.zend.sdklib.monitor.IZendIssue;
import org.zend.sdklib.target.IZendTarget;
import org.zend.webapi.core.connection.data.Issue;
import org.zend.webapi.core.connection.data.values.IssueSeverity;
/**
* Represents job which monitors particular target and notifies user about all
* server events.
*
* @author Wojciech Galanciak, 2012
*
*/
@SuppressWarnings("restriction")
public class TargetMonitor extends AbstractMonitor {
private List<String> filters;
public TargetMonitor(String targetId) {
super(targetId, Messages.TargetMonitor_JobName);
this.filters = getFilters();
}
public void updateFilters() {
setFilters(getFilters());
}
public List<String> getFilters() {
IZendTarget target = getTarget();
Server server = ServerUtils.getServer(target);
String value = server.getAttribute(MonitorManager.FILTERS_ATTRIBUTE,
null);
if (value == null) {
value = MonitorManager.getPreferences().get(
MonitorManager.getFiltersKey(targetId), null);
}
if (value != null) {
return new ArrayList<String>(Arrays.asList(value
.split(MonitorManager.FILTER_SEPARATOR)));
}
return new ArrayList<String>();
}
public String getValue(List<String> list) {
StringBuilder builder = new StringBuilder();
if (list != null && !list.isEmpty()) {
for (String val : list) {
builder.append(val).append(MonitorManager.FILTER_SEPARATOR);
}
return builder.substring(0, builder.length() - 1);
}
return ""; //$NON-NLS-1$
}
protected void handleIssues(List<IZendIssue> issues, IZendTarget target) {
for (int i = issues.size() - 1; i >= 0; i--) {
IZendIssue zendIssue = issues.get(i);
Issue issue = zendIssue.getIssue();
int actionsAvailable = checkActions(zendIssue);
if (!isZS6(target)
&& monitor.getTime(issue.getLastOccurance(), target) < lastTime) {
continue;
}
final String baseURL = issue.getGeneralDetails().getUrl();
IProject project = getProject(baseURL);
String basePath = null;
if (project != null) {
basePath = getBasePath(baseURL, project);
}
if (shouldNotify(issue.getSeverity(), baseURL)) {
// handle case when have not found a corresponding project
if (project != null) {
int delay = 0;
if (MonitorManager.getHide(targetId)) {
delay = MonitorManager.getHideTime(targetId) * 1000;
}
showNonification(zendIssue, project.getName(), basePath,
delay, actionsAvailable);
}
}
}
}
protected IProject getProject(String urlString) {
IProject project = null;
if (urlString != null) {
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
.getProjects();
int maxLength = 0;
for (IProject p : projects) {
String url = LaunchUtils.getURLFromPreferences(p.getName());
if (url != null && urlString.startsWith(url)) {
int length = url.length();
if (maxLength < length) {
project = p;
maxLength = url.length();
}
}
}
}
if (project == null) {
IPath path = new Path(urlString);
IZendTarget target = TargetsManagerService.INSTANCE
.getTargetManager().getTargetById(targetId);
String host = target.getHost().getHost();
String[] segments = path.segments();
for (int i = 0; i < segments.length; i++) {
if (segments[i].startsWith(host)) {
path = path.removeFirstSegments(i + 1);
break;
}
}
if (path.segmentCount() > 0) {
String projectName = path.segment(0);
project = ResourcesPlugin.getWorkspace().getRoot()
.getProject(projectName);
}
}
return project;
}
private String getBasePath(final String baseURL, IProject project) {
String basePath = MonitorManager.SLASH;
String url = LaunchUtils.getURLFromPreferences(project.getName());
if (url != null && url.length() <= baseURL.length()) {
try {
URL base = new URL(baseURL);
URL urlPrefs = new URL(url);
if (base.getHost().equals(urlPrefs.getHost())) {
if (url.endsWith(MonitorManager.SLASH)) {
url = url.substring(0, url.length() - 1);
}
basePath = baseURL.substring(url.length());
}
} catch (MalformedURLException e) {
// should not appear
}
} else {
String toFind = MonitorManager.SLASH + project.getName();
int index = baseURL.indexOf(toFind);
if (index != -1) {
if (index + toFind.length() == baseURL.length()
|| baseURL.endsWith(toFind + MonitorManager.SLASH)) {
basePath = MonitorManager.SLASH;
} else {
basePath = baseURL.substring(index + toFind.length(),
baseURL.length());
}
}
}
return basePath;
}
private boolean shouldNotify(IssueSeverity severity, String baseURL) {
if (checkSeverity(severity.getName())) {
for (String filter : filters) {
if (filter.endsWith(MonitorManager.SLASH)) {
filter = filter.substring(0, filter.length() - 1);
}
if (baseURL.startsWith(filter)) {
baseURL = baseURL.substring(filter.length());
if (!baseURL.isEmpty() && baseURL.startsWith(":")) { //$NON-NLS-1$
int index = baseURL.indexOf(MonitorManager.SLASH);
baseURL = baseURL.substring(index);
}
if (baseURL.startsWith(MonitorManager.SLASH)
|| baseURL.isEmpty()) {
return true;
}
}
}
}
return false;
}
private boolean checkSeverity(String name) {
IZendTarget target = TargetsManagerService.INSTANCE.getTargetManager()
.getTargetById(targetId);
Server server = ServerUtils.getServer(target);
if (server != null) {
String value = server.getAttribute(
MonitorManager.SEVERITY_ATTRIBUTE + name, (String) null);
if (value != null) {
return Boolean.valueOf(value);
}
}
return MonitorManager.getPreferences().getBoolean(
targetId + '.' + name, true);
}
private void setFilters(List<String> filters) {
this.filters = filters;
}
}