Java tutorial
/******************************************************************************* * 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.intercept.config; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnLayoutData; import org.eclipse.jface.viewers.ColumnPixelData; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import com.subgraph.vega.api.events.IEvent; import com.subgraph.vega.api.events.IEventHandler; import com.subgraph.vega.api.http.proxy.HttpInterceptorLevel; import com.subgraph.vega.api.http.proxy.IHttpInterceptor; import com.subgraph.vega.api.http.proxy.IProxyTransaction.TransactionDirection; import com.subgraph.vega.api.model.IModel; import com.subgraph.vega.api.model.IWorkspace; import com.subgraph.vega.api.model.conditions.ConditionSetChanged; import com.subgraph.vega.api.model.conditions.IHttpCondition; import com.subgraph.vega.api.model.conditions.IHttpConditionManager; import com.subgraph.vega.api.model.conditions.IHttpConditionSet; import com.subgraph.vega.ui.http.Activator; import com.subgraph.vega.ui.http.conditions.ConditionInput; import com.subgraph.vega.ui.http.dialogs.IConfigDialogContent; public class ConfigureInterceptionContent implements IConfigDialogContent { private static final Image IMAGE_CHECKED = Activator.getImageDescriptor("icons/checked.png").createImage(); private static final Image IMAGE_UNCHECKED = Activator.getImageDescriptor("icons/unchecked.png").createImage(); private final IModel model; private final TransactionDirection direction; private final IEventHandler conditionSetEventHandler; private ComboViewer comboViewerInterceptorLevel; private TableViewer tableViewerBreakpoints; private ConditionInput conditionInput; private IHttpInterceptor interceptor; private IHttpConditionSet conditionSet; private Composite composite; public ConfigureInterceptionContent(IModel model, TransactionDirection direction) { this.model = model; final IWorkspace workspace = model.getCurrentWorkspace(); final IHttpConditionManager conditionManager = (workspace == null) ? (null) : (workspace.getHttpConditionMananger()); this.conditionInput = new ConditionInput(conditionManager); this.direction = direction; this.conditionSetEventHandler = createConditionSetEventHandler(); this.conditionSet = model.addConditionSetTracker(getConditionSetName(), conditionSetEventHandler); } private IEventHandler createConditionSetEventHandler() { return new IEventHandler() { @Override public void handleEvent(IEvent event) { if (event instanceof ConditionSetChanged) onConditionSetChanged((ConditionSetChanged) event); } }; } @Override public Composite createContents(Composite parent) { composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout(1, true)); createInterceptorOptions(composite).setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); createBreakpointsEditor(composite).setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); interceptor = Activator.getDefault().getProxyService().getInterceptor(); comboViewerInterceptorLevel.setSelection(new StructuredSelection(interceptor.getInterceptLevel(direction))); setConditionSetInput(); return composite; } @Override public String getTitle() { return "Interceptor Options"; } @Override public String getMessage() { return "Set up breakpoint for interceptor"; } @Override public Control getFocusControl() { return composite; } @Override public void onClose() { model.removeConditionSetTracker(getConditionSetName(), conditionSetEventHandler); } @Override public void onOk() { } private String getConditionSetName() { switch (direction) { case DIRECTION_REQUEST: return IHttpConditionManager.CONDITION_SET_BREAKPOINTS_REQUEST; case DIRECTION_RESPONSE: return IHttpConditionManager.CONDITION_SET_BREAKPOINTS_RESPONSE; } return null; } private void setConditionSetInput() { if (tableViewerBreakpoints == null || tableViewerBreakpoints.getContentProvider() == null) return; if (conditionSet == null) tableViewerBreakpoints.setInput(null); else tableViewerBreakpoints.setInput(conditionSet.getAllConditions()); } private void onConditionSetChanged(ConditionSetChanged event) { conditionSet = event.getConditionSet(); setConditionSetInput(); } protected Control createDialogArea(Composite parent) { parent.setLayout(new GridLayout(1, true)); createInterceptorOptions(parent).setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); createBreakpointsEditor(parent).setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); interceptor = Activator.getDefault().getProxyService().getInterceptor(); comboViewerInterceptorLevel.setSelection(new StructuredSelection(interceptor.getInterceptLevel(direction))); setConditionSetInput(); return parent; } void dispose() { model.removeConditionSetTracker(getConditionSetName(), conditionSetEventHandler); } public TransactionDirection getDirection() { return direction; } private Composite createInterceptorOptions(Composite parent) { final Group rootControl = new Group(parent, SWT.NONE); rootControl.setText("Interceptor Options"); rootControl.setLayout(new GridLayout(2, false)); final Label label = new Label(rootControl, SWT.NONE); label.setText("Intercept for:"); comboViewerInterceptorLevel = new ComboViewer(rootControl, SWT.READ_ONLY); comboViewerInterceptorLevel.setContentProvider(new ArrayContentProvider()); comboViewerInterceptorLevel.setLabelProvider(new LabelProvider() { public String getText(Object element) { return ((HttpInterceptorLevel) element).getName(); } }); comboViewerInterceptorLevel.setInput(HttpInterceptorLevel.values()); comboViewerInterceptorLevel .addSelectionChangedListener(createSelectionChangedListenerComboViewerInterceptorLevel()); return rootControl; } private ISelectionChangedListener createSelectionChangedListenerComboViewerInterceptorLevel() { return new ISelectionChangedListener() { public void selectionChanged(final SelectionChangedEvent e) { HttpInterceptorLevel level = (HttpInterceptorLevel) ((IStructuredSelection) comboViewerInterceptorLevel .getSelection()).getFirstElement(); if (level != null) { interceptor.setInterceptLevel(direction, level); } } }; } private Composite createBreakpointsEditor(Composite parent) { final Group rootControl = new Group(parent, SWT.NONE); rootControl.setText("Breakpoints"); rootControl.setLayout(new GridLayout(2, false)); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1); final Composite compTable = createTableBreakpoints(rootControl, gd, 7); compTable.setLayoutData(gd); final Composite compTableButtons = createTableBreakpointsButtons(rootControl); compTableButtons.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); final Composite compCreate = createCreatorBreakpoints(rootControl); compCreate.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); final Composite compCreateButtons = createCreatorBreakpointsButtons(rootControl); compCreateButtons.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); return rootControl; } private Composite createTableBreakpoints(Composite parent, GridData gd, int heightInRows) { final Composite rootControl = new Composite(parent, SWT.NONE); final TableColumnLayout tcl = new TableColumnLayout(); rootControl.setLayout(tcl); tableViewerBreakpoints = new TableViewer(rootControl, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); createTableBreakpointsColumns(tableViewerBreakpoints, tcl); tableViewerBreakpoints.setContentProvider(new ArrayContentProvider()); final Table table = tableViewerBreakpoints.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); gd.heightHint = table.getItemHeight() * heightInRows; return rootControl; } private void createTableBreakpointsColumns(TableViewer viewer, TableColumnLayout layout) { final String[] titles = { "", "Type", "Matches", "Pattern", }; final ColumnLayoutData[] layoutData = { new ColumnPixelData(16, false, true), new ColumnPixelData(150, true, true), new ColumnPixelData(150, true, true), new ColumnWeightData(100, 100, true), }; final EditingSupport editorList[] = { new BreakpointEnabledEditingSupport(viewer), new BreakpointTypeEditingSupport(viewer), new BreakpointMatchTypeEditingSupport(viewer), new BreakpointPatternEditingSupport(viewer), }; final ColumnLabelProvider providerList[] = { new ColumnLabelProvider() { @Override public String getText(Object element) { return null; } @Override public Image getImage(Object element) { if (((IHttpCondition) element).isEnabled()) { return IMAGE_CHECKED; } else { return IMAGE_UNCHECKED; } } }, new ColumnLabelProvider() { @Override public String getText(Object element) { return ((IHttpCondition) element).getType().getName(); } }, new ColumnLabelProvider() { @Override public String getText(Object element) { IHttpCondition condition = (IHttpCondition) element; return condition.getMatchAction().getLabel(); } }, new ColumnLabelProvider() { @Override public String getText(Object element) { IHttpCondition condition = (IHttpCondition) element; return condition.getMatchAction().getArgumentAsString(); } }, }; for (int i = 0; i < titles.length; i++) { final TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); final TableColumn c = column.getColumn(); layout.setColumnData(c, layoutData[i]); c.setText(titles[i]); c.setMoveable(true); column.setEditingSupport(editorList[i]); column.setLabelProvider(providerList[i]); } } private Composite createTableBreakpointsButtons(Composite parent) { final Composite rootControl = new Composite(parent, SWT.NONE); rootControl.setLayout(new GridLayout(1, true)); Button button = new Button(rootControl, SWT.PUSH); button.setText("remove"); button.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); button.addSelectionListener(createSelectionListenerButtonRemove()); return rootControl; } private SelectionListener createSelectionListenerButtonRemove() { return new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) tableViewerBreakpoints.getSelection(); for (Object ob : selection.toList()) { if ((ob instanceof IHttpCondition) && (conditionSet != null)) conditionSet.removeCondition((IHttpCondition) ob); } tableViewerBreakpoints.refresh(true); } }; } private Composite createCreatorBreakpoints(Composite parent) { final Composite rootControl = new Composite(parent, SWT.NONE); rootControl.setLayout(new GridLayout(3, false)); conditionInput.createConditionTypeCombo(rootControl); conditionInput.createConditionMatchCombo(rootControl); conditionInput.createInputPanel(rootControl); return rootControl; } private Composite createCreatorBreakpointsButtons(Composite parent) { final Composite rootControl = new Composite(parent, SWT.NONE); rootControl.setLayout(new GridLayout(1, true)); Button button = new Button(rootControl, SWT.PUSH); button.setText("create"); button.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); button.addSelectionListener(createSelectionListenerButtonCreateBreakpoint()); return rootControl; } private SelectionListener createSelectionListenerButtonCreateBreakpoint() { return new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { final IHttpCondition breakpoint = conditionInput.createConditionFromData(); if (breakpoint == null) return; if (conditionSet != null) conditionSet.appendCondition(breakpoint); conditionInput.reset(); tableViewerBreakpoints.refresh(true); } }; } }