package com.predic8.plugin.membrane.wizards; import java.io.IOException; import java.net.URL; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import com.predic8.membrane.core.Constants; import com.predic8.membrane.core.Router; import com.predic8.membrane.core.interceptor.Interceptor; import com.predic8.membrane.core.interceptor.WSDLInterceptor; import com.predic8.membrane.core.interceptor.schemavalidation.ValidatorInterceptor; import com.predic8.membrane.core.rules.ServiceProxy; import com.predic8.membrane.core.rules.ServiceProxyKey; import com.predic8.plugin.membrane.MembraneUIPlugin; import com.predic8.plugin.membrane.PlatformUtil; import com.predic8.plugin.membrane.contentproviders.WSDLPortTableContentProvider; import com.predic8.plugin.membrane.labelproviders.TableHeaderLabelProvider; import com.predic8.plugin.membrane.labelproviders.WSDLPortTableLabelProvider; import com.predic8.plugin.membrane.listeners.PortVerifyListener; import com.predic8.plugin.membrane.util.SWTUtil; import com.predic8.wsdl.Port; import com.predic8.wsdl.WSDLParser; public class WSDLProxyConfigurationPage extends AbstractProxyWizardPage { public static final String PAGE_NAME = "WSDL Proxy Configuration"; private Text textWSDL; private Button btAnalyze; private Button btRewriteEndpoint; private Button btValidateWSDL; protected CheckboxTableViewer tableViewer; private boolean canFinish; private String wsdl; private Combo comboRewriteWSDLProtocol; private Text textRewriteWSDLHost; private Text textRewriteWSDLPort; protected WSDLProxyConfigurationPage() { super(PAGE_NAME); setTitle("SOAP Proxy"); } @Override public void createControl(Composite parent) { Composite composite = createComposite(parent, 3); createFullDescriptionLabel(composite, "Service Proxy from WSDL"); textWSDL = createTextWSDL(composite); btAnalyze = createButtonAnalyze(composite); tableViewer = createTableViewer(composite); btValidateWSDL = createButtonCheck(composite, "Validate incomming SOAP messages against WSDL and Schema"); btRewriteEndpoint = createButtonCheck(composite, "Rewrite endpoint and schema location in WSDL"); btRewriteEndpoint.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Button bt = (Button)e.widget; comboRewriteWSDLProtocol.setEnabled(bt.getSelection()); textRewriteWSDLHost.setEnabled(bt.getSelection()); textRewriteWSDLPort.setEnabled(bt.getSelection()); } }); createRewriteWSDLDetailsComposite(composite); btRewriteEndpoint.setSelection(true); btRewriteEndpoint.notifyListeners(SWT.Selection, SWTUtil.createSelectionEvent(null, btRewriteEndpoint)); setControl(composite); } private Text createTextWSDL(Composite parent) { Text text = createText(parent, 2); text.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { Text t = (Text)e.getSource(); btAnalyze.setEnabled(t.getText().length() > 0); } }); return text; } private Text createText(Composite parent, int span) { Text text = new Text(parent, SWT.BORDER); GridData gd = SWTUtil.getGreedyHorizontalGridData(); gd.horizontalSpan = span; gd.heightHint = 16; text.setLayoutData(gd); return text; } private Button createButtonAnalyze(Composite parent) { Button bt = new Button(parent, SWT.NONE); bt.setEnabled(false); bt.setText("Analyze"); GridData gd = new GridData(); gd.horizontalSpan = 1; bt.setLayoutData(gd); bt.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { String text = textWSDL.getText(); if (Constants.EMPTY_STRING.equals(text)) return; WSDLParser parser = new WSDLParser(); try { tableViewer.setInput(parser.parse(text)); wsdl = text; } catch (Exception e1) { reset(); ErrorDialog.openError(Display.getCurrent().getActiveShell(), "WSDL Parse Error", "Parsing of specified WSDL failed!", new Status(IStatus.ERROR, MembraneUIPlugin.PLUGIN_ID, e1.getMessage())); } } }); return bt; } private Button createButtonCheck(Composite parent, String text) { Button bt = new Button(parent, SWT.CHECK); bt.setText(text); GridData gd = new GridData(); gd.horizontalSpan = 3; bt.setLayoutData(gd); return bt; } @Override public IWizardPage getNextPage() { return null; } private CheckboxTableViewer createTableViewer(Composite parent) { CheckboxTableViewer viewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); //new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); GridData gData = new GridData(GridData.FILL_BOTH); gData.horizontalSpan = 3; gData.grabExcessVerticalSpace = true; gData.grabExcessHorizontalSpace = true; viewer.getTable().setLayoutData(gData); createColumns(viewer); viewer.setContentProvider(new WSDLPortTableContentProvider()); viewer.setLabelProvider(new WSDLPortTableLabelProvider()); viewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { CheckboxTableViewer source = (CheckboxTableViewer)event.getSource(); // here is a single selection behavior implemented if (event.getChecked()) { source.setCheckedElements(new Object[] {event.getElement()}); } else { source.setAllChecked(false); } canFinish = event.getChecked(); getWizard().getContainer().updateButtons(); } }); return viewer; } protected void createColumns(TableViewer table) { String[] titles = new String[] { " ", "Portname", "Protocol", "Address" }; int[] bounds = new int[] { 30, 150, 60, 170 }; for (int i = 0; i < titles.length; i++) { TableViewerColumn column = new TableViewerColumn(table, SWT.NONE); column.getViewer().setLabelProvider(new TableHeaderLabelProvider()); column.getColumn().setAlignment(i == 0 ? SWT.CENTER : SWT.LEFT ); column.getColumn().setText(titles[i]); column.getColumn().setWidth(bounds[i]); column.getColumn().setResizable(true); column.getColumn().setMoveable(true); } table.getTable().setHeaderVisible(true); table.getTable().setLinesVisible(true); } @Override boolean canFinish() { return canFinish; } private void reset() { wsdl = null; tableViewer.setInput(null); canFinish = false; } @Override boolean performFinish(AddProxyWizard wizard) throws IOException { Port p = (Port)tableViewer.getCheckedElements()[0]; Router router = PlatformUtil.getRouter(); ServiceProxy serviceProxy = createServiceProxy(p); try { serviceProxy.init(router); } catch (Exception e) { throw new RuntimeException(e); } router.getRuleManager().addProxyAndOpenPortIfNew(serviceProxy); return true; } private ServiceProxy createServiceProxy(Port p) throws IOException { ServiceProxy proxy = new ServiceProxy(); ServiceProxyKey key = new ServiceProxyKey(80); key.setMethod("*"); proxy.setKey(key); URL url = new URL(p.getAddress().getLocation()); key.setPath(url.getPath()); proxy.setTargetHost(url.getHost()); proxy.setTargetPort(url.getPort()); if (btRewriteEndpoint.getSelection()) { proxy.getInterceptors().add(createWSDLInterceptor()); } if (btValidateWSDL.getSelection()) { proxy.getInterceptors().add(createValidatorInterceptor()); } return proxy; } private Interceptor createWSDLInterceptor() { WSDLInterceptor interceptor = new WSDLInterceptor(); if (comboRewriteWSDLProtocol.getSelectionIndex() > 0) interceptor.setProtocol(comboRewriteWSDLProtocol.getItem(comboRewriteWSDLProtocol.getSelectionIndex())); if (!Constants.EMPTY_STRING.equals(textRewriteWSDLHost.getText().trim())) interceptor.setHost(textRewriteWSDLHost.getText().trim()); if (!Constants.EMPTY_STRING.equals(textRewriteWSDLPort.getText().trim())) interceptor.setPort(textRewriteWSDLPort.getText().trim()); try { interceptor.init(PlatformUtil.getRouter()); } catch (Exception e) { throw new RuntimeException(e); } return interceptor; } private Interceptor createValidatorInterceptor() { ValidatorInterceptor interceptor = new ValidatorInterceptor(); interceptor.setWsdl(wsdl); try { interceptor.init(PlatformUtil.getRouter()); } catch (Exception e) { throw new RuntimeException(e); } return interceptor; } private Composite createRewriteWSDLDetailsComposite(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); GridLayout layout = SWTUtil.createGridLayout(3, 10); layout.marginTop = 5; comp.setLayout(layout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; comp.setLayoutData(gd); new Label(comp, SWT.NONE).setText("Protocol:"); comboRewriteWSDLProtocol = createRewriteWSDLComboProtocol(comp); new Label(comp, SWT.NONE).setText(""); new Label(comp, SWT.NONE).setText("Host:"); textRewriteWSDLHost = createText(comp, 2); new Label(comp, SWT.NONE).setText("Port:"); textRewriteWSDLPort = createTextRewriteWSDLPort(comp); Label lb = new Label(comp, SWT.NONE); lb.setText(""); lb.setLayoutData(SWTUtil.getGreedyHorizontalGridData()); return comp; } private Combo createRewriteWSDLComboProtocol(Composite parent) { Combo combo = new Combo(parent, SWT.NONE); combo.setItems(new String[] {"From Request", "HTTP", "HTTPS" }); combo.select(0); return combo; } private Text createTextRewriteWSDLPort(Composite parent) { Text text = new Text(parent, SWT.BORDER); text.addVerifyListener(new PortVerifyListener()); GridData gd = new GridData(); gd.horizontalSpan = 1; gd.heightHint = 16; gd.widthHint = 88; text.setLayoutData(gd); return text; } }