/*******************************************************************************
* 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.ui;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import java.util.List;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Display;
import org.zend.core.notifications.NotificationManager;
import org.zend.sdklib.monitor.IZendIssue;
import org.zend.webapi.core.WebApiException;
import org.zend.webapi.core.connection.data.Event;
import org.zend.webapi.core.connection.data.EventsGroupDetails;
import org.zend.webapi.core.connection.data.Parameter;
import org.zend.webapi.core.connection.data.ParameterList;
import org.zend.webapi.core.connection.data.SuperGlobals;
import org.zend.webapi.internal.core.connection.exception.InvalidResponseException;
/**
* Recreate and execute HTTP request based on provided request parameters.
*
* @author Wojciech Galanciak, 2012
*
*/
public class RequestGeneratorJob extends Job {
private IZendIssue zendIssue;
public RequestGeneratorJob(IZendIssue zendIssue) {
super(Messages.RequestGeneratorJob_RepeatTaskTitle);
this.zendIssue = zendIssue;
}
@Override
protected IStatus run(IProgressMonitor monitor) {
NotificationManager.registerProgress(
Messages.RequestGeneratorJob_NotificationTitle,
Messages.RequestGeneratorJob_RepeatTaskTitle,
new IRunnableWithProgress() {
public void run(IProgressMonitor monitor)
throws InvocationTargetException,
InterruptedException {
monitor.beginTask(
Messages.RequestGeneratorJob_RepeatTaskTitle,
IProgressMonitor.UNKNOWN);
final int result = generate();
switch (result) {
case 200:
NotificationManager
.registerInfo(
Messages.RequestGeneratorJob_MessageTitle,
MessageFormat
.format(Messages.RequestGeneratorJob_MessageBody,
result), 3000);
break;
case -1:
NotificationManager
.registerInfo(
Messages.RequestGeneratorJob_MessageTitle,
Messages.RequestGeneratorJob_RepeatFailedMessage,
3000);
default:
break;
}
monitor.done();
}
}, false);
return Status.OK_STATUS;
}
/**
* Create and execute HTTP request based on provided issue.
*
* @param zendIssue
* @return HTTP response code
* @throws IOException
*/
private int generate() {
String url = zendIssue.getIssue().getGeneralDetails().getUrl();
List<EventsGroupDetails> groups = null;
try {
groups = zendIssue.getGroupDetails();
} catch (InvalidResponseException e) {
showMessage(
Messages.RequestGeneratorJob_RepeatActionTitle,
Messages.RequestGeneratorJob_RepeatActionNotSupportedMessage);
return -1;
} catch (WebApiException e) {
showMessage(Messages.RequestGeneratorJob_RepeatActionTitle,
Messages.RequestGeneratorJob_RepeatActionFailedMessage);
return -1;
}
if (groups != null && groups.size() > 0) {
HttpClient client = new HttpClient();
HttpMethodBase method = null;
Event event = groups.get(0).getEvent();
SuperGlobals globals = event.getSuperGlobals();
if (globals != null) {
ParameterList params = globals.getPost();
if (params != null) {
List<Parameter> parameters = params.getParameters();
if (parameters != null && parameters.size() > 0) {
method = createPostRequest(url, parameters);
}
}
params = globals.getGet();
if (params != null) {
if (method != null) {
setGetParams(method, params);
} else {
method = createGetRequest(url, params);
}
}
params = globals.getCookie();
if (method != null && params != null) {
setCookies(method, params);
}
}
if (method != null) {
int statusCode = -1;
try {
statusCode = client.executeMethod(method);
} catch (IOException e) {
Activator.log(e);
} finally {
method.releaseConnection();
}
return statusCode;
}
}
return -1;
}
private HttpMethodBase createGetRequest(String url, ParameterList paramsList) {
GetMethod method = new GetMethod(url);
setGetParams(method, paramsList);
return method;
}
private HttpMethodBase createPostRequest(String url,
List<Parameter> parameters) {
PostMethod method = new PostMethod(url);
NameValuePair[] query = new NameValuePair[parameters.size()];
for (int i = 0; i < query.length; i++) {
Parameter param = parameters.get(i);
method.addParameter(param.getName(), param.getValue());
}
return method;
}
private void setGetParams(HttpMethodBase method, ParameterList paramsList) {
List<Parameter> params = paramsList.getParameters();
if (params != null) {
NameValuePair[] query = new NameValuePair[params.size()];
for (int i = 0; i < query.length; i++) {
Parameter param = params.get(i);
query[i] = new NameValuePair(param.getName(), param.getValue());
}
method.setQueryString(query);
}
}
private HttpMethodBase setCookies(HttpMethodBase method,
ParameterList paramsList) {
List<Parameter> params = paramsList.getParameters();
if (params != null) {
StringBuilder builder = new StringBuilder();
for (Parameter parameter : params) {
builder.append(parameter.getName());
builder.append("="); //$NON-NLS-1$
builder.append(parameter.getValue());
builder.append(";"); //$NON-NLS-1$
}
String value = builder.toString();
if (value.length() > 0) {
value = value.substring(0, value.length() - 1);
method.setRequestHeader("Cookie", value); //$NON-NLS-1$
}
}
return method;
}
private void showMessage(final String title, final String message) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
MessageDialog.openInformation(
org.zend.core.notifications.Activator.getDefault()
.getParent(), title, message);
}
});
}
}