/******************************************************************************* * Copyright (c) Feb 20, 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.sdklib.monitor; import java.net.MalformedURLException; import java.text.MessageFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.zend.sdklib.internal.application.ZendConnection; import org.zend.sdklib.internal.monitor.ZendIssue; import org.zend.sdklib.manager.TargetsManager; import org.zend.sdklib.mapping.IMappingLoader; import org.zend.sdklib.target.ITargetLoader; import org.zend.sdklib.target.IZendTarget; import org.zend.webapi.core.WebApiClient; import org.zend.webapi.core.WebApiException; import org.zend.webapi.core.connection.data.Issue; import org.zend.webapi.core.connection.data.IssueList; import org.zend.webapi.core.connection.data.values.ZendServerVersion; import org.zend.webapi.core.progress.BasicStatus; import org.zend.webapi.core.progress.StatusCode; /** * Utility class which provides methods to perform operation related to code * monitor feature provided by Zend Server. * * @author Wojciech Galanciak, 2012 */ public class ZendMonitor extends ZendConnection { /** * Predefined filters. */ public enum Filter { ALL_OPEN_EVENTS("All Open Events"), ALL_EVENTS("All Events"), PERFORMANCE_ISSUES("Performance Issues"), CRITICAL_ERRORS("Critical Errors"); private String name; private Filter(String name) { this.name = name; } public String getName() { return name; } } private String targetId; public ZendMonitor(String targetId) { super(); this.targetId = targetId; } public ZendMonitor(String targetId, IMappingLoader mappingLoader) { super(mappingLoader); this.targetId = targetId; } public ZendMonitor(String targetId, ITargetLoader loader) { super(loader); this.targetId = targetId; } public ZendMonitor(String targetId, ITargetLoader loader, IMappingLoader mappingLoader) { super(loader, mappingLoader); this.targetId = targetId; } /** * Provides list of issues by using {@link Filter#ALL_EVENTS} filter. * * @return list of issues */ public List<IZendIssue> getAllIssues() { try { List<Issue> issues = doGetIssues(Filter.ALL_EVENTS); if (issues != null) { return ZendIssue.create(issues, this); } } catch (WebApiException e) { String message = MessageFormat.format( "Error during retrieving all issues from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving All Issues", message, e)); log.error(message + "':"); log.error("\tpossible error: " + e.getMessage()); } catch (MalformedURLException e) { String message = MessageFormat.format( "Error during retrieving all issues from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving All Issues", message, e)); log.error(e); } return null; } /** * Provides issue instance based on specified id. * * @return concrete issue */ public IZendIssue get(int issueId) { try { List<Issue> issues = doGetIssues(Filter.ALL_EVENTS); if (issues != null) { for (Issue issue : issues) { if (issue.getId() == issueId) { return new ZendIssue(issue, this); } } } } catch (WebApiException e) { String message = MessageFormat.format( "Error during retrieving issue with id {0}", issueId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving Issue", message, e)); log.error(message + "':"); log.error("\tpossible error: " + e.getMessage()); } catch (MalformedURLException e) { String message = MessageFormat.format( "Error during retrieving issue with id {0}", issueId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving Issue", message, e)); log.error(e); } return null; } /** * Provides list of issues by using {@link Filter#ALL_OPEN_EVENTS} filter. * * @return list of issues */ public List<IZendIssue> getOpenIssues() { try { List<Issue> issues = doGetIssues(Filter.ALL_OPEN_EVENTS); if (issues != null) { return ZendIssue.create(issues, this); } } catch (WebApiException e) { String message = MessageFormat.format( "Error during retrieving all open issues from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving All Open Issues", message, e)); log.error(message + "':"); log.error("\tpossible error: " + e.getMessage()); } catch (MalformedURLException e) { String message = MessageFormat.format( "Error during retrieving all open issues from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving All Open Issues", message, e)); log.error(e); } return null; } /** * Provides list of issues by using specified filter. * * @return list of issues */ public List<IZendIssue> getIssues(Filter filter, int offset) { try { List<Issue> issues = doGetIssues(filter, offset); if (issues != null) { return ZendIssue.create(issues, this); } } catch (WebApiException e) { String message = MessageFormat.format( "Error during retrieving all open issues from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving All Open Issues", message, e)); log.error(message + "':"); log.error("\tpossible error: " + e.getMessage()); } catch (MalformedURLException e) { String message = MessageFormat.format( "Error during retrieving all open issues from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving All Open Issues", message, e)); log.error(e); } return null; } public List<IZendIssue> getIssues(Filter filter, long lastTime, IZendTarget target) { List<IZendIssue> result = new ArrayList<IZendIssue>(); int offset = 0; try { WebApiClient client = getClient(); while (true) { IssueList list = client.monitorGetIssuesListPredefinedFilter( filter.getName(), 20, offset, "id", "DESC"); if (list != null && list.getIssues() != null) { List<IZendIssue> issues = ZendIssue.create( list.getIssues(), this); if (issues != null && issues.size() > 0) { for (IZendIssue issue : issues) { long time = getTime(issue.getIssue() .getLastOccurance(), target); if (time > lastTime) { result.add(issue); } else { return result; } } offset += 20; } else { break; } } else { break; } } } catch (WebApiException e) { String message = MessageFormat.format( "Error during retrieving open issues from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving Open Issues", message, e)); log.error(message + "':"); log.error("\tpossible error: " + e.getMessage()); } catch (MalformedURLException e) { String message = MessageFormat.format( "Error during retrieving open issues from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving Open Issues", message, e)); log.error(e); } return result; } /** * Provides list of issues by using {@link Filter#CRITICAL_ERRORS} filter. * * @return list of issues */ public List<IZendIssue> getCriticalErrors() { try { List<Issue> issues = doGetIssues(Filter.CRITICAL_ERRORS); if (issues != null) { return ZendIssue.create(issues, this); } } catch (WebApiException e) { String message = MessageFormat.format( "Error during retrieving critical errors from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving Critical Errors", message, e)); log.error(message + "':"); log.error("\tpossible error: " + e.getMessage()); } catch (MalformedURLException e) { String message = MessageFormat.format( "Error during retrieving critical errors from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving Critical Errors", message, e)); log.error(e); } return null; } /** * Provides list of issues by using {@link Filter#PERFORMANCE_ISSUES} * filter. * * @return list of issues */ public List<IZendIssue> getPerformanceIssues() { try { List<Issue> issues = doGetIssues(Filter.PERFORMANCE_ISSUES); if (issues != null) { return ZendIssue.create(issues, this); } } catch (WebApiException e) { String message = MessageFormat.format( "Error during retrieving performance issues from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving Performance Issues", message, e)); log.error(message + "':"); log.error("\tpossible error: " + e.getMessage()); } catch (MalformedURLException e) { String message = MessageFormat.format( "Error during retrieving performance issues from '{0}'", targetId); notifier.statusChanged(new BasicStatus(StatusCode.ERROR, "Retrieving Performance Issues", message, e)); log.error(e); } return null; } public long getLastEventTime(IZendIssue issue, IZendTarget target) { return getTime(issue.getIssue().getLastOccurance(), target); } public WebApiClient getClient() throws MalformedURLException { return getClient(targetId); } public long getTime(String time, IZendTarget target) { Date date = null; try { if (TargetsManager .checkMinVersion(target, ZendServerVersion.v6_0_0)) { date = parseISO8601(time); } else { SimpleDateFormat formatter = new SimpleDateFormat( "dd-MMM-yyyy HH:mm"); //$NON-NLS-1$ date = formatter.parse(time); } } catch (ParseException e) { return 0; } return date.getTime(); } private Date parseISO8601(String input) throws ParseException { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"); if (input.endsWith("Z")) { input = input.substring(0, input.length() - 1) + "GMT-00:00"; } else { int position = 6; String begin = input.substring(0, input.length() - position); String end = input.substring(input.length() - position, input.length()); input = begin + "GMT" + end; } return df.parse(input); } private List<Issue> doGetIssues(Filter filter) throws MalformedURLException, WebApiException { List<Issue> result = new ArrayList<Issue>(); int offset = 0; while (true) { List<Issue> list = doGetIssues(filter, offset); if (list != null) { result.addAll(list); offset += list.size(); } else { return result; } } } private List<Issue> doGetIssues(Filter filter, int offset) throws MalformedURLException, WebApiException { WebApiClient client = getClient(); while (true) { IssueList list = client.monitorGetIssuesListPredefinedFilter( filter.getName(), 100, offset, "id", "ASC"); if (list != null) { return list.getIssues(); } } } }