blob: 03944143d9ac62e875178527263077bd20f60fea [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2008 IBM Corporation and others.
* 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:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.wst.internet.monitor.ui.internal.view;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.wst.internet.monitor.core.internal.IContentFilter;
import org.eclipse.wst.internet.monitor.core.internal.http.ResendHTTPRequest;
import org.eclipse.wst.internet.monitor.core.internal.provisional.Request;
import org.eclipse.wst.internet.monitor.ui.internal.MonitorUIPlugin;
import org.eclipse.wst.internet.monitor.ui.internal.Trace;
import org.eclipse.wst.internet.monitor.ui.internal.custom.SashForm;
import org.eclipse.wst.internet.monitor.ui.internal.provisional.ContentViewer;
import org.eclipse.wst.internet.monitor.ui.internal.viewers.ByteViewer;
import org.eclipse.wst.internet.monitor.ui.internal.viewers.HeaderViewer;
/**
*
*/
public class ViewerManager {
private boolean displayHeaderInf;
protected ContentViewer reqViewer;
protected ContentViewer respViewer;
protected Viewer requestViewer;
protected Viewer responseViewer;
protected HeaderViewer reqHeader;
protected HeaderViewer respHeader;
protected Composite reqComp;
protected Composite respComp;
protected List<Viewer> viewers;
protected Request request;
protected SashForm reqSash;
protected SashForm respSash;
protected List<IContentFilter> filters = new ArrayList<IContentFilter>();
public ViewerManager(Composite reqParent, Composite respParent) {
reqSash = new SashForm(reqParent, SWT.VERTICAL);
GridLayout layout = new GridLayout();
layout.numColumns = 1;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
layout.marginWidth = 0;
reqSash.setLayout(layout);
reqSash.setLayoutData(new GridData(GridData.FILL_BOTH));
respSash = new SashForm(respParent, SWT.VERTICAL);
layout = new GridLayout();
layout.numColumns = 1;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
layout.marginWidth = 0;
respSash.setLayout(layout);
respSash.setLayoutData(new GridData(GridData.FILL_BOTH));
reqComp = reqSash;
respComp = respSash;
reqHeader = new HeaderViewer(reqSash, HeaderViewer.REQUEST_HEADER);
respHeader = new HeaderViewer(respSash, HeaderViewer.RESPONSE_HEADER);
reqViewer = new ByteViewer();
reqViewer.init(reqSash);
respViewer = new ByteViewer();
respViewer.init(respSash);
reqSash.setWeights(new int[] { 10, 90 });
respSash.setWeights(new int[] { 10, 90 });
setDisplayHeaderInfo(MonitorUIPlugin.getShowHeaderPreference());
loadAvailableViewers();
}
protected Viewer getDefaultViewer(String name) {
if (name == null)
return null;
String name2 = name.toLowerCase();
if (name2.endsWith(".xml"))
return findViewer("org.eclipse.wst.internet.monitor.viewers.xml");
else if (name2.endsWith(".html"))
return findViewer("org.eclipse.wst.internet.monitor.viewers.browser");
else if (name2.endsWith(".gif") || name2.endsWith(".jpg") ||
name2.endsWith(".jpeg") || name2.endsWith(".png"))
return findViewer("org.eclipse.wst.internet.monitor.viewers.image");
else
return findViewer("org.eclipse.wst.internet.monitor.viewers.byte");
}
protected Viewer findViewer(String id) {
if (id == null)
return null;
Iterator iterator = viewers.iterator();
while (iterator.hasNext()) {
Viewer viewer = (Viewer) iterator.next();
if (id.equals(viewer.getId()))
return viewer;
}
return null;
}
private void loadAvailableViewers() {
IExtensionRegistry registry = Platform.getExtensionRegistry();
IConfigurationElement[] cf = registry.getConfigurationElementsFor(MonitorUIPlugin.PLUGIN_ID, "viewers");
int size = cf.length;
viewers = new ArrayList<Viewer>(size);
for (IConfigurationElement ce : cf)
viewers.add(new Viewer(ce));
}
/* (non-Javadoc)
* @see org.eclipse.wst.internet.monitor.internal.view.IViewerManager#setDisplayHeaderInfo(boolean)
*/
public void setDisplayHeaderInfo(boolean b) {
displayHeaderInf = b;
reqHeader.setDisplayHeader(b);
respHeader.setDisplayHeader(b);
reqSash.setSimpleLayout(b);
respSash.setSimpleLayout(b);
reqSash.layout(true);
respSash.layout(true);
MonitorUIPlugin.setShowHeaderPreference(b);
if (b) {
reqHeader.setEditable(false);
if (request instanceof ResendHTTPRequest && request.getResponse(Request.TRANSPORT) == null) {
reqHeader.setEditable(true);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.wst.internet.monitor.internal.view.IViewerManager#getDisplayHeaderInfo()
*/
public boolean getDisplayHeaderInfo() {
return displayHeaderInf;
}
public void setRequest(Request rr) {
// maintain the state of the request and request header if they've been modified.
if (request instanceof ResendHTTPRequest && request.getResponse(Request.ALL) == null) {
ResendHTTPRequest resRequest = (ResendHTTPRequest) request;
//EditableContentViewer editViewer = (ContentViewer) reqViewer;
byte[] content = reqViewer.getContent();
byte[] b = resRequest.getRequest(Request.CONTENT);
if (content != null && b != null && !MonitorUIPlugin.parse(b).equals(MonitorUIPlugin.parse(content))) {
resRequest.setRequest(content, Request.CONTENT);
}
byte[] header = reqHeader.getContent();
b = resRequest.getRequest(Request.TRANSPORT);
if (header != null && b != null && !MonitorUIPlugin.parse(b).equals(MonitorUIPlugin.parse(header))) {
resRequest.setRequest(header, Request.TRANSPORT);
}
}
reqHeader.setRequestResponse(rr);
respHeader.setRequestResponse(rr);
byte[] b = null;
if (rr != null)
b = filter(rr.getRequest(Request.CONTENT));
reqViewer.setContent(b);
b = null;
if (rr != null)
b = filter(rr.getResponse(Request.CONTENT));
respViewer.setContent(b);
request = rr;
// set the editor to editable if the request hasn't been sent and the
// editor can be set as editable
if (request instanceof ResendHTTPRequest && request.getResponse(Request.ALL) == null) {
if (displayHeaderInf)
reqHeader.setEditable(true);
reqViewer.setEditable(true);
} else {
if (displayHeaderInf)
reqHeader.setEditable(false);
reqViewer.setEditable(false);
}
}
public void addFilter(IContentFilter filter) {
filters.add(filter);
setRequest(request);
}
public void removeFilter(IContentFilter filter) {
filters.remove(filter);
setRequest(request);
}
protected byte[] filter(byte[] b) {
if (b == null)
return null;
Iterator iterator = filters.iterator();
while (iterator.hasNext()) {
IContentFilter filter = (IContentFilter) iterator.next();
try {
b = filter.filter(request, false, b);
} catch (Exception e) {
Trace.trace(Trace.SEVERE, "Error while filtering with " + filter.getId(), e);
}
}
return b;
}
/* (non-Javadoc)
* @see org.eclipse.tcpip.monitor.internal.view.IViewerManager#getRequestViewers()
*/
public List getRequestViewers() {
Iterator iterator = viewers.iterator();
List<Viewer> temp = new ArrayList<Viewer>();
while (iterator.hasNext()) {
Viewer viewer = (Viewer) iterator.next();
if (viewer.isRequestViewer())
temp.add(viewer);
}
return temp;
}
/* (non-Javadoc)
* @see org.eclipse.tcpip.monitor.internal.view.IViewerManager#getResponseViewers()
*/
public List getResponseViewers() {
Iterator iterator = viewers.iterator();
List<Viewer> temp = new ArrayList<Viewer>();
while (iterator.hasNext()) {
Viewer viewer = (Viewer) iterator.next();
if (viewer.isResponseViewer())
temp.add(viewer);
}
return temp;
}
/* (non-Javadoc)
* @see org.eclipse.tcpip.monitor.internal.view.IViewerManager#setRequestViewer(java.lang.String)
*/
public void setRequestViewer(Viewer viewer) {
if (viewer != null && viewer.equals(requestViewer))
return;
// call set request to save and reset the request
setRequest(request);
reqViewer.dispose();
requestViewer = viewer;
if (viewer != null)
reqViewer = viewer.createViewer();
else
reqViewer = null;
if (reqViewer == null)
return;
reqViewer.init(reqComp);
//reqViewer.setRequestResponse(rr);
byte[] b = null;
if (request != null) {
b = filter(request.getRequest(Request.CONTENT));
// set the editor to editable if the request hasn't been sent and the
// editor can be set as editable
if (request instanceof ResendHTTPRequest && request.getResponse(Request.TRANSPORT) == null) {
reqViewer.setEditable(true);
} else {
reqViewer.setEditable(false);
}
}
reqViewer.setContent(b);
reqComp.layout(true);
}
/* (non-Javadoc)
* @see org.eclipse.tcpip.monitor.internal.view.IViewerManager#setResponseViewer(java.lang.String)
*/
public void setResponseViewer(Viewer viewer) {
if (viewer != null && viewer.equals(responseViewer))
return;
respViewer.dispose();
responseViewer = viewer;
if (viewer != null)
respViewer = viewer.createViewer();
else
respViewer = null;
if (respViewer == null)
return;
respViewer.init(respComp);
//respViewer.setRequestResponse(rr);
byte[] b = null;
if (request != null)
b = filter(request.getResponse(Request.CONTENT));
respViewer.setContent(b);
respComp.layout(true);
}
/* (non-Javadoc)
* @see org.eclipse.wst.internet.monitor.ui.internal.view.IViewerManager#getCurrentRequestViewer()
*/
public ContentViewer getCurrentRequestViewer() {
return reqViewer;
}
/* (non-Javadoc)
* @see org.eclipse.wst.internet.monitor.ui.internal.view.IViewerManager#getCurrentRequestHeaderViewer()
*/
public HeaderViewer getCurrentRequestHeaderViewer() {
return reqHeader;
}
}