/*******************************************************************************
* Copyright (c) 2008 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.xml;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.xsd.XSDElementDeclaration;
import org.jboss.tools.smooks.SmooksModelUtils;
import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils;
import org.jboss.tools.smooks.templating.model.ModelBuilderException;
import org.jboss.tools.smooks.templating.model.xml.XSDModelBuilder;
import org.xml.sax.SAXException;
/**
* @author Dart (dpeng@redhat.com)
*
*/
public class XMLTemplateCreationWizardPage extends AbstractFileSelectionWizardPage {
private Throwable parsingError = null;
protected Combo createFromDropdown = null;
protected CheckboxTableViewer tableViewer = null;
protected Label tableViewerLabel;
private boolean fireEvent = true;
private String rootElementName = null;
protected Button loadXSDButton;
private TemplateSourceType templateSourceType = TemplateSourceType.xsd;
public static enum TemplateSourceType {
// Template from XML Schema
xsd,
// Template from an XML Sample
xml
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.configuration.editors.xml.
* AbstractFileSelectionWizardPage#loadedTheObject(java.lang.String)
*/
@Override
protected Object loadedTheObject(String path) throws Exception {
// TODO Auto-generated method stub
return null;
}
public XMLTemplateCreationWizardPage(String pageName) {
super(pageName, new String[] { "xsd" }); //$NON-NLS-1$
this.setTitle(Messages.XMLTemplateCreationWizardPage_Page_Title);
this.setDescription(Messages.XMLTemplateCreationWizardPage_page_description);
this.templateSourceType = TemplateSourceType.xsd;
}
public TemplateSourceType getTemplateSourceType() {
return templateSourceType;
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.configuration.editors.xml.
* AbstractFileSelectionWizardPage#changeWizardPageStatus()
*/
@Override
protected void changeWizardPageStatus() {
super.changeWizardPageStatus();
String errorMessage = this.getErrorMessage();
if (errorMessage == null && templateSourceType == TemplateSourceType.xsd) {
if (reasourceLoaded) {
if (tableViewer.getCheckedElements() == null || tableViewer.getCheckedElements().length == 0) {
errorMessage = Messages.XMLTemplateCreationWizardPage_Error_Must_Select_Root;
}
} else {
errorMessage = Messages.XMLTemplateCreationWizardPage_Error_Must_Click_Load;
}
if(parsingError != null){
errorMessage = parsingError.getLocalizedMessage();
}
setErrorMessage(errorMessage);
setPageComplete(errorMessage == null);
}
}
/**
* @return the rootElementName
*/
public String getRootElementName() {
return rootElementName;
}
/**
* @param rootElementName
* the rootElementName to set
*/
public void setRootElementName(String rootElementName) {
this.rootElementName = rootElementName;
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.configuration.editors.xml.
* AbstractFileSelectionWizardPage
* #createFilePathText(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Text createFilePathText(Composite parent) {
fileTextComposite = new Composite(parent, SWT.NONE);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.grabExcessHorizontalSpace = true;
fileTextComposite.setLayoutData(gd);
GridLayout xsdtgl = new GridLayout();
xsdtgl.marginWidth = 0;
xsdtgl.marginHeight = 0;
xsdtgl.numColumns = 2;
fileTextComposite.setLayout(xsdtgl);
final Text fileText = new Text(fileTextComposite, SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
fileText.setLayoutData(gd);
fileText.addModifyListener(new ModifyListener() {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.
* swt.events.ModifyEvent)
*/
public void modifyText(ModifyEvent e) {
reasourceLoaded = false;
if (tableViewer != null) {
tableViewer.setInput(Collections.emptyList());
}
}
});
gd.grabExcessHorizontalSpace = true;
loadXSDButton = new Button(fileTextComposite, SWT.NONE);
loadXSDButton.setText(Messages.XMLTemplateCreationWizardPage_Button_Load);
loadXSDButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
super.widgetSelected(e);
parsingError = null;
reasourceLoaded = false;
if (fileText.getText() == null || fileText.getText().length() == 0) {
changeWizardPageStatus();
return;
}
List<String> list;
try {
list = loadElement(fileText.getText());
if (list == null || list.isEmpty()) {
setErrorMessage(Messages.XMLTemplateCreationWizardPage_XSDParsingError1);
} else {
tableViewer.setInput(list);
reasourceLoaded = true;
}
} catch (InvocationTargetException e1) {
parsingError = e1.getTargetException();
while(parsingError instanceof InvocationTargetException){
parsingError = ((InvocationTargetException)parsingError).getTargetException();
}
} catch (IOException e1) {
parsingError = e1;
} catch (ModelBuilderException e1) {
parsingError = e1;
}
changeWizardPageStatus();
}
});
return fileText;
}
private List<String> loadElement(String path) throws InvocationTargetException, IOException, ModelBuilderException {
List<String> elements = new ArrayList<String>();
if (path == null)
return null;
String pp = path.toLowerCase();
if (pp.endsWith(".wsdl")) { //$NON-NLS-1$
try {
List<XSDElementDeclaration> xsdDec = WSDLObjectAnalyzer.loadAllElement(path);
for (Iterator<?> iterator = xsdDec.iterator(); iterator.hasNext();) {
XSDElementDeclaration xsdElementDeclaration = (XSDElementDeclaration) iterator.next();
elements.add(xsdElementDeclaration.getAliasName());
}
} catch (ParserConfigurationException e) {
throw new InvocationTargetException(e);
} catch (SAXException e) {
throw new InvocationTargetException(e);
}
}
String file = null;
file = SmooksUIUtils.parseFilePath(path);
XSDModelBuilder xsdModelBuilder = new XSDModelBuilder(URI.createFileURI(file));
Set<String> elementNames = xsdModelBuilder.getRootElementNames();
Iterator<String> it = elementNames.iterator();
while (it.hasNext()) {
String name = it.next();
elements.add(name);
}
return elements;
}
public void createControl(Composite parent) {
Composite mainComposite = new Composite(parent, SWT.NONE);
GridLayout gl = new GridLayout();
mainComposite.setLayout(gl);
GridData gd = new GridData(GridData.FILL_BOTH);
mainComposite.setLayoutData(gd);
Label fileTypeLabel = new Label(mainComposite, SWT.NONE);
fileTypeLabel.setText(Messages.XMLTemplateCreationWizardPage_FileLabel);
createFromDropdown = new Combo(mainComposite, SWT.READ_ONLY | SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
initCombo(createFromDropdown);
createFromDropdown.setLayoutData(gd);
createFromDropdown.select(0);
createFromDropdown.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateTemplateSourceType();
}
});
Label separator = new Label(mainComposite, SWT.SEPARATOR | SWT.HORIZONTAL);
separator.setLayoutData(gd);
super.createControl(mainComposite);
mainComposite = (Composite) getControl();
gd = new GridData(GridData.FILL_HORIZONTAL);
tableViewerLabel = new Label(mainComposite, SWT.NONE);
tableViewerLabel.setLayoutData(gd);
tableViewerLabel.setText(Messages.XMLTemplateCreationWizardPage_Label_Select_Root);
tableViewer = CheckboxTableViewer.newCheckList(mainComposite, SWT.BORDER);
gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 250;
tableViewer.getControl().setLayoutData(gd);
tableViewer.setContentProvider(new XSDListContentProvider());
tableViewer.setLabelProvider(new XSDListLabelProvider());
tableViewer.addCheckStateListener(new ICheckStateListener() {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged
* (org.eclipse.jface.viewers.CheckStateChangedEvent)
*/
public void checkStateChanged(CheckStateChangedEvent event) {
if (!fireEvent)
return;
rootElementName = null;
fireEvent = false;
tableViewer.setAllChecked(false);
if (event.getChecked()) {
tableViewer.setChecked(event.getElement(), true);
Object checkElement = event.getElement();
if (checkElement instanceof String) {
rootElementName = (String) checkElement;
}
}
fireEvent = true;
changeWizardPageStatus();
}
});
this.setControl(mainComposite);
}
public Combo getCombo() {
return createFromDropdown;
}
protected void updateTemplateSourceType() {
switch (createFromDropdown.getSelectionIndex()) {
case 0 :
templateSourceType = TemplateSourceType.xsd;
break;
case 1 :
templateSourceType = TemplateSourceType.xml;
break;
default :
throw new IllegalStateException(Messages.XMLTemplateCreationWizardPage_XMLTemplateLoadError);
}
// Table should only be visible for XSD template sources...
tableViewer.getTable().setVisible(templateSourceType == TemplateSourceType.xsd);
tableViewerLabel.setVisible(templateSourceType == TemplateSourceType.xsd);
loadXSDButton.setEnabled(templateSourceType == TemplateSourceType.xsd);
// Reset the file browse filter...
setFileExtensionNames(new String[] {templateSourceType.toString()});
}
private void initCombo(Combo combo2) {
combo2.add(Messages.XMLTemplateCreationWizardPage_XSDType);
combo2.add(Messages.XMLTemplateCreationWizardPage_XMLSampleType);
}
public String getInputType(){
if(createFromDropdown.getSelectionIndex() == 0){
return SmooksModelUtils.KEY_XML_FILE_TYPE_XSD;
}
if(createFromDropdown.getSelectionIndex() == 1){
return SmooksModelUtils.KEY_XML_FILE_TYPE_XML;
}
return null;
}
}