/*******************************************************************************
* Copyright (c) 2011 Subgraph.
* 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
*
* Contributors:
* Subgraph - initial API and implementation
******************************************************************************/
package com.subgraph.vega.ui.http.requesteditviewer;
import java.net.URISyntaxException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.protocol.BasicHttpContext;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.part.ViewPart;
import com.subgraph.vega.api.analysis.IContentAnalyzer;
import com.subgraph.vega.api.analysis.IContentAnalyzerFactory;
import com.subgraph.vega.api.http.requests.IHttpRequestBuilder;
import com.subgraph.vega.api.http.requests.IHttpRequestEngine;
import com.subgraph.vega.api.http.requests.IHttpRequestEngineFactory;
import com.subgraph.vega.api.http.requests.IHttpResponse;
import com.subgraph.vega.api.model.IWorkspace;
import com.subgraph.vega.api.model.requests.IRequestLogRecord;
import com.subgraph.vega.ui.http.Activator;
import com.subgraph.vega.ui.http.builder.HeaderEditor;
import com.subgraph.vega.ui.http.builder.IHttpBuilderPart;
import com.subgraph.vega.ui.http.builder.RequestEditor;
import com.subgraph.vega.ui.httpviewer.HttpMessageViewer;
public class RequestEditView extends ViewPart {
public final static String VIEW_ID = "com.subgraph.vega.views.requestEdit";
private IHttpRequestEngine requestEngine;
private IHttpRequestBuilder requestBuilder;
private IContentAnalyzer contentAnalyzer;
private SashForm parentComposite;
private IHttpBuilderPart requestBuilderPartCurr;
private RequestEditor requestEditor;
private HeaderEditor requestHeaderEditor;
private TabFolder requestTabFolder;
private TabItem requestTabItem;
private TabItem requestHeaderTabItem;
private TabItem requestTabFolderItem;
private HttpMessageViewer responseViewer;
public RequestEditView() {
super();
if (requestEngine == null) {
IHttpRequestEngineFactory requestEngineFactory = Activator.getDefault().getHttpRequestEngineFactoryService();
final HttpClient httpClient = requestEngineFactory.createBasicClient();
requestEngine = requestEngineFactory.createRequestEngine(httpClient, requestEngineFactory.createConfig());
}
requestBuilder = requestEngine.createRequestBuilder();
}
@Override
public void createPartControl(Composite parent) {
parentComposite = new SashForm(parent, SWT.VERTICAL);
createRequestEditor(parentComposite);
createResponseViewer(parentComposite);
parentComposite.setWeights(new int[] {50, 50});
parentComposite.pack();
final IContentAnalyzerFactory contentAnalyzerFactory = Activator.getDefault().getContentAnalyzerFactoryService();
final IWorkspace workspace = Activator.getDefault().getModel().getCurrentWorkspace();
if(workspace != null) {
contentAnalyzer = contentAnalyzerFactory.createContentAnalyzer(workspace.getScanAlertRepository().getProxyScanInstance());
contentAnalyzer.setDefaultAddToRequestLog(true);
contentAnalyzer.setAddLinksToModel(true);
}
}
@Override
public void setFocus() {
if (parentComposite != null) {
parentComposite.setFocus();
}
}
public void setRequest(IRequestLogRecord record) throws URISyntaxException {
if (record != null) {
requestBuilder.setFromRequest(record);
} else {
requestBuilder.clear();
}
if (requestBuilderPartCurr != null) {
requestBuilderPartCurr.refresh();
}
}
private void displayError(String text) {
MessageBox messageDialog = new MessageBox(parentComposite.getShell(), SWT.ICON_WARNING | SWT.OK);
messageDialog.setText("Error");
if (text == null) {
text = "Unexpected error occurred";
}
messageDialog.setMessage(text);
messageDialog.open();
}
private void displayExceptionError(Exception e) {
if (e.getMessage() != null) {
displayError(e.getMessage());
} else {
displayError(e.getCause().getMessage());
}
}
public void sendRequest() {
if (requestBuilderPartCurr != null) {
try {
requestBuilderPartCurr.processContents();
} catch (Exception e) {
displayExceptionError(e);
return;
}
}
HttpUriRequest uriRequest;
try {
uriRequest = requestBuilder.buildRequest();
} catch (Exception e) {
displayExceptionError(e);
return;
}
BasicHttpContext ctx = new BasicHttpContext();
IHttpResponse response;
try {
response = requestEngine.sendRequest(uriRequest, ctx);
responseViewer.displayHttpResponse(response.getRawResponse());
} catch (Exception e) {
displayExceptionError(e);
return;
}
if(contentAnalyzer != null) {
contentAnalyzer.processResponse(response);
}
if (requestBuilderPartCurr != null) {
requestBuilderPartCurr.refresh();
}
}
private Composite createRequestEditor(Composite parent) {
final Composite rootControl = new Composite(parent, SWT.NONE);
rootControl.setLayout(new FillLayout());
requestTabFolder = new TabFolder(rootControl, SWT.TOP);
requestTabItem = new TabItem(requestTabFolder, SWT.NONE);
requestTabItem.setText("Request");
requestEditor = new RequestEditor(requestTabFolder, requestBuilder);
requestTabItem.setControl(requestEditor);
requestTabItem.setData(requestEditor);
requestHeaderTabItem = new TabItem(requestTabFolder, SWT.NONE);
requestHeaderTabItem.setText("Headers");
requestHeaderEditor = new HeaderEditor(requestTabFolder, requestBuilder, 0);
requestHeaderTabItem.setControl(requestHeaderEditor);
requestHeaderTabItem.setData(requestHeaderEditor);
requestTabFolder.addSelectionListener(createRequestTabFolderSelectionListener());
requestTabFolderItem = requestTabFolder.getSelection()[0];
requestBuilderPartCurr = (IHttpBuilderPart) requestTabFolderItem.getData();
return rootControl;
}
private SelectionListener createRequestTabFolderSelectionListener() {
return new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
TabItem[] selection = requestTabFolder.getSelection();
if (selection != null) {
if (requestBuilderPartCurr != null) {
try {
requestBuilderPartCurr.processContents();
} catch (Exception ex) {
requestTabFolder.setSelection(requestTabFolderItem);
displayExceptionError(ex);
return;
}
}
requestTabFolderItem = selection[0];
requestBuilderPartCurr = (IHttpBuilderPart) requestTabFolderItem.getData();
requestBuilderPartCurr.refresh();
}
}
};
}
private Composite createResponseViewer(Composite parent) {
final Group rootControl = new Group(parent, SWT.NONE);
rootControl.setText("Response");
rootControl.setLayout(new FillLayout());
responseViewer = new HttpMessageViewer(rootControl);
responseViewer.setEditable(false);
return rootControl;
}
}