/******************************************************************************* * Copyright (c) 2009 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.configuration.editors; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.window.IShellProvider; import org.eclipse.jface.wizard.WizardDialog; 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.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Hyperlink; import org.jboss.tools.smooks.SmooksModelUtils; import org.jboss.tools.smooks.configuration.editors.csv12.CSVDataParser; import org.jboss.tools.smooks.configuration.editors.edireader12.EDIDataParser; import org.jboss.tools.smooks.configuration.editors.input.InputParameter; import org.jboss.tools.smooks.configuration.editors.input.InputType; import org.jboss.tools.smooks.configuration.editors.utils.JsonInputDataParser; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; import org.jboss.tools.smooks.configuration.editors.wizard.StructuredDataSelectionWizard; import org.jboss.tools.smooks.configuration.editors.xml.AbstractXMLObject; import org.jboss.tools.smooks.configuration.editors.xml.TagList; import org.jboss.tools.smooks.configuration.editors.xml.XMLObjectAnalyzer; import org.jboss.tools.smooks.configuration.editors.xml.XSDObjectAnalyzer; import org.jboss.tools.smooks.editor.ISmooksModelProvider; import org.jboss.tools.smooks.launch.JavaGraphBuilder; import org.jboss.tools.smooks.model.smooks.DocumentRoot; import org.jboss.tools.smooks.model.smooks.SmooksResourceListType; import org.milyn.Smooks; import org.milyn.payload.JavaSource; import org.w3c.dom.Document; /** * @author Dart (dpeng@redhat.com) * <p> * Apr 12, 2009 */ public class SelectorCreationDialog extends Dialog { private TreeViewer viewer; private Object currentSelection; private Button onlyNameButton; private Button fullPathButton; private SelectorAttributes selectorAttributes = null; private IEditorPart editorPart = null; private static Throwable currentException = null; private FormToolkit toolkit; public SelectorCreationDialog(IShellProvider parentShell) { super(parentShell); } /** * @return the currentException */ public static Throwable getCurrentException() { return currentException; } public SelectorCreationDialog(Shell parentShell, IEditorPart editorPart) { super(parentShell); selectorAttributes = new SelectorAttributes(); this.editorPart = editorPart; } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets * .Composite) */ @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); GridData gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 500; gd.widthHint = 450; composite.setLayoutData(gd); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 10; layout.marginWidth = 10; layout.makeColumnsEqualWidth = false; composite.setLayout(layout); Label viewerLabel = new Label(composite, SWT.NONE); viewerLabel.setText(Messages.SelectorCreationDialog_InputViewerlabel); toolkit = new FormToolkit(getShell().getDisplay()); Hyperlink link = toolkit .createHyperlink(composite, Messages.SelectorCreationDialog_AddInputLinkLabel, SWT.NONE);// new // Hyperlink(composite,SWT.NONE); link.setBackground(composite.getBackground()); link.addHyperlinkListener(new IHyperlinkListener() { /* * (non-Javadoc) * * @see * org.eclipse.ui.forms.events.IHyperlinkListener#linkActivated( * org.eclipse.ui.forms.events.HyperlinkEvent) */ public void linkActivated(HyperlinkEvent e) { showInputDataWizard(); } /* * (non-Javadoc) * * @see * org.eclipse.ui.forms.events.IHyperlinkListener#linkEntered(org * .eclipse.ui.forms.events.HyperlinkEvent) */ public void linkEntered(HyperlinkEvent e) { } /* * (non-Javadoc) * * @see * org.eclipse.ui.forms.events.IHyperlinkListener#linkExited(org * .eclipse.ui.forms.events.HyperlinkEvent) */ public void linkExited(HyperlinkEvent e) { } }); gd = new GridData(); gd.horizontalAlignment = GridData.END; link.setLayoutData(gd); viewer = new TreeViewer(composite, SWT.BORDER); viewer.setContentProvider(new CompoundStructuredDataContentProvider()); viewer.setLabelProvider(new CompoundStructuredDataLabelProvider()); List<Object> inputList = generateInputData(); viewer.setInput(inputList); viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { okPressed(); } }); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { currentSelection = ((IStructuredSelection) event.getSelection()).getFirstElement(); } }); gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; viewer.getTree().setLayoutData(gd); Label label = new Label(composite, SWT.NONE); label.setText(Messages.SelectorCreationDialog_SperatorCharlabel); final Combo speratorCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY); speratorCombo.add(" "); //$NON-NLS-1$ speratorCombo.add("/"); //$NON-NLS-1$ speratorCombo.select(1); // speratorCombo.setEditable(false); gd = new GridData(GridData.FILL_HORIZONTAL); speratorCombo.setLayoutData(gd); speratorCombo.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { selectorAttributes.setSelectorSperator(speratorCombo.getText()); } }); Label l = new Label(composite, SWT.NONE); l.setText(Messages.SelectorCreationDialog_PolicyLabel); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; l.setLayoutData(gd); Composite com = new Composite(composite, SWT.NONE); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; com.setLayoutData(gd); GridLayout gl = new GridLayout(); gl.numColumns = 2; com.setLayout(gl); fullPathButton = new Button(com, SWT.RADIO); fullPathButton.setText(Messages.SelectorCreationDialog_FullPathPolicy); onlyNameButton = new Button(com, SWT.RADIO); onlyNameButton.setText(Messages.SelectorCreationDialog_OnlyNamePolicy); // Button containtParentButton = new Button(com,SWT.RADIO); // containtParentButton.setText("Containt Parent Name"); fullPathButton.setSelection(true); handleButtons(); getShell().setText(Messages.SelectorCreationDialog_DialogTitle); SmooksUIUtils.expandSelectorViewer(inputList, viewer); return composite; } private void handleButtons() { fullPathButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { selectorAttributes.setSelectorPolicy(SelectorAttributes.FULL_PATH); } }); onlyNameButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { selectorAttributes.setSelectorPolicy(SelectorAttributes.ONLY_NAME); } }); } public static List<Object> generateInputData(SmooksResourceListType smooksResourceListType) { currentException = null; List<Object> list = new ArrayList<Object>(); if (smooksResourceListType != null) { IJavaProject project = SmooksUIUtils.getJavaProject(smooksResourceListType); try { List<InputType> inputLists = SmooksUIUtils.getInputTypeList(smooksResourceListType); for (Iterator<?> iterator = inputLists.iterator(); iterator.hasNext();) { InputType inputType = (InputType) iterator.next(); if (!inputType.isActived()) continue; String type = inputType.getType(); String path = inputType.getPath(); if (type != null && path != null) { path = path.trim(); if (SmooksModelUtils.INPUT_TYPE_EDI_1_1.equals(type) || SmooksModelUtils.INPUT_TYPE_EDI_1_2.equals(type)) { EDIDataParser parser = new EDIDataParser(); try { TagList tl = parser.parseEDIFile(path, smooksResourceListType); if (tl != null) { list.addAll(((TagList) tl).getChildren()); } } catch (Throwable t) { currentException = t; } } if (SmooksModelUtils.INPUT_TYPE_CSV.equals(type) || SmooksModelUtils.INPUT_TYPE_CSV_1_2.equals(type)) { CSVDataParser parser = new CSVDataParser(); try { TagList tl = parser.parseCSV(path, smooksResourceListType); if (tl != null) { list.addAll(((TagList) tl).getChildren()); } } catch (Throwable t) { currentException = t; } } if (SmooksModelUtils.INPUT_TYPE_JSON_1_1.equals(type) || SmooksModelUtils.INPUT_TYPE_JSON_1_2.equals(type)) { try { JsonInputDataParser parser = new JsonInputDataParser(); IXMLStructuredObject tagList = parser.parseJsonFile(SmooksUIUtils.parseFilePath(path), smooksResourceListType); if (tagList instanceof TagList) { list.addAll(((TagList) tagList).getChildren()); } else { list.add(tagList); } } catch (Throwable tt) { currentException = tt; } } if (SmooksModelUtils.INPUT_TYPE_JAVA.equals(type)) { try { Class<?> clazz = SmooksUIUtils.loadClass(path, project); Document newmodel = getModel(clazz); if (newmodel != null) { TagList tagList = new XMLObjectAnalyzer().analyze(newmodel, null , null); list.addAll(tagList.getChildren()); } } catch (Throwable t) { currentException = t; } } if (SmooksModelUtils.INPUT_TYPE_XSD.equals(type)) { try { path = SmooksUIUtils.parseFilePath(path); String rootElementName = null; List<InputParameter> paramers = inputType.getParameters(); for (Iterator<?> iterator2 = paramers.iterator(); iterator2.hasNext();) { InputParameter paramType = (InputParameter) iterator2.next(); String pn = paramType.getName(); if ("rootElement".equals(pn)) { //$NON-NLS-1$ rootElementName = paramType.getValue(); break; } } if (rootElementName != null) { rootElementName = rootElementName.trim(); list.add(new XSDObjectAnalyzer().loadElement(path, rootElementName)); } } catch (Throwable tt) { currentException = tt; } } if (SmooksModelUtils.INPUT_TYPE_XML.equals(type)) { try { path = SmooksUIUtils.parseFilePath(path); // XMLObjectAnalyzer analyzer = new // XMLObjectAnalyzer(); // TagList doc = analyzer.analyze(path, null); AbstractXMLObject model = new XMLObjectAnalyzer().analyze(path, null , null); if (model != null) { if (model instanceof TagList) { list.addAll(((TagList) model).getChildren()); } else { list.add(model); } } } catch (Throwable e) { currentException = e; } } } } } catch (Exception e) { currentException = e; // SmooksConfigurationActivator.getDefault().log(e); } } return list; } public static List<Object> generateInputDataForSmooks10() { List<Object> list = new ArrayList<Object>(); // if (extType != null) { // IJavaProject project = SmooksUIUtils.getJavaProject(extType); // try { // List<InputType> inputLists = extType.getInput(); // for (Iterator<?> iterator = inputLists.iterator(); // iterator.hasNext();) { // InputType inputType = (InputType) iterator.next(); // if (!SmooksUIUtils.isActivedInput(inputType)) // continue; // String type = inputType.getType(); // String path = SmooksModelUtils.getInputPath(inputType); // if (type != null && path != null) { // path = path.trim(); // if (SmooksModelUtils.INPUT_TYPE_EDI_1_1.equals(type) // || SmooksModelUtils.INPUT_TYPE_EDI_1_2.equals(type)) { // } // if (SmooksModelUtils.INPUT_TYPE_CSV.equals(type) // || SmooksModelUtils.INPUT_TYPE_CSV_1_2.equals(type)) { // } // if (SmooksModelUtils.INPUT_TYPE_JSON_1_1.equals(type) // || SmooksModelUtils.INPUT_TYPE_JSON_1_2.equals(type)) { // } // if (SmooksModelUtils.INPUT_TYPE_JAVA.equals(type)) { // try { // Class<?> clazz = SmooksUIUtils.loadClass(path, project); // JavaBeanModel model = // JavaBeanModelFactory.getJavaBeanModelWithLazyLoad(clazz); // if (model != null) { // list.add(model); // } // } catch (Throwable t) { // // ignore // } // } // if (SmooksModelUtils.INPUT_TYPE_XSD.equals(type)) { // try { // path = SmooksUIUtils.parseFilePath(path); // String rootElementName = null; // List<ParamType> paramers = inputType.getParam(); // for (Iterator<?> iterator2 = paramers.iterator(); // iterator2.hasNext();) { // ParamType paramType = (ParamType) iterator2.next(); // if ("rootElement".equals(paramType.getName())) { // rootElementName = paramType.getValue(); // break; // } // } // if (rootElementName != null) { // rootElementName = rootElementName.trim(); // list.add(new XSDObjectAnalyzer().loadElement(path, rootElementName)); // } // } catch (Throwable tt) { // // ingore // } // } // if (SmooksModelUtils.INPUT_TYPE_XML.equals(type)) { // try { // path = SmooksUIUtils.parseFilePath(path); // // // XMLObjectAnalyzer analyzer = new // // XMLObjectAnalyzer(); // // TagList doc = analyzer.analyze(path, null); // // AbstractXMLObject model = new XMLObjectAnalyzer().analyze(path, // null); // if (model != null) { // if (model instanceof TagList) { // list.addAll(((TagList) model).getChildren()); // } else { // list.add(model); // } // } // } catch (Throwable e) { // // } // } // } // } // } catch (Exception e) { // // SmooksConfigurationActivator.getDefault().log(e); // } // } return list; } protected List<Object> generateInputData() { Object obj = null; if (editorPart instanceof ISmooksModelProvider) { obj = ((ISmooksModelProvider) editorPart).getSmooksModel(); } else { ISmooksModelProvider provider = (ISmooksModelProvider) editorPart.getAdapter(ISmooksModelProvider.class); if (provider != null) { obj = provider.getSmooksModel(); } } if (obj == null) { List<Object> ll = Collections.emptyList(); return ll; } SmooksResourceListType resourceList = null; if (obj instanceof DocumentRoot) { resourceList = ((DocumentRoot) obj).getSmooksResourceList(); } return generateInputData(resourceList); } protected void showInputDataWizard() { StructuredDataSelectionWizard wizard = new StructuredDataSelectionWizard(); if (this.editorPart != null) { wizard.setInput(editorPart.getEditorInput()); wizard.setSite(editorPart.getEditorSite()); } wizard.setForcePreviousAndNextButtons(true); StructuredDataSelectionWizardDailog dialog = new StructuredDataSelectionWizardDailog(this.getShell(), wizard); if (dialog.show() == WizardDialog.OK) { List<Object> input = this.generateInputData(); this.viewer.setInput(input); SmooksUIUtils.expandSelectorViewer(input, viewer); } } /** * @return the currentSelection */ public Object getCurrentSelection() { return currentSelection; } public SelectorAttributes getSelectorAttributes() { return selectorAttributes; } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.Dialog#close() */ @Override public boolean close() { if (toolkit != null) { toolkit.dispose(); } return super.close(); } public static Document getModel(Class<?> theModelClass) throws Exception { try { Object objectGraph = graphBuilder.buildGraph(theModelClass); DOMResult domResult = new DOMResult(); // Filter a populated object model through an actual smooks runtime instance. // this ensures that the generated model will be exactly the same as that seen // by the smooks instance at runtime... smooksRuntime.filterSource(new JavaSource(objectGraph), domResult); return (Document) domResult.getNode(); } catch (Exception e) { throw new Exception("Error build project classpath.", e); //$NON-NLS-1$ } } private static JavaGraphBuilder graphBuilder = new JavaGraphBuilder(); private static Smooks smooksRuntime = new Smooks(); private static void printDocumentAsXML ( Document document ) { // Use a Transformer for output TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer; try { transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(document); StreamResult result = new StreamResult(System.out); transformer.transform(source, result); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } } }