/*******************************************************************************
* Copyright (c) 2009 Fraunhofer IWU 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:
* Fraunhofer IWU - initial API and implementation
*******************************************************************************/
package net.enilink.komma.edit.ui.wizards;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.widgets.Composite;
import org.parboiled.Parboiled;
import org.parboiled.parserunners.ReportingParseRunner;
import org.parboiled.support.ParsingResult;
import net.enilink.komma.model.IModel;
import net.enilink.komma.parser.manchester.ManchesterSyntaxParser;
import net.enilink.komma.parser.sparql.tree.IriRef;
import net.enilink.komma.parser.sparql.tree.QName;
import net.enilink.komma.core.URI;
import net.enilink.komma.core.URIs;
abstract public class NewObjectWizard extends Wizard {
protected ObjectTypeSelectionPage selectionPage;
protected ObjectNamePage objectNamePage;
protected Composite containerComposite;
protected Object treeInput;
protected ILabelProvider treeLabelProvider;
protected ITreeContentProvider treeContentProvider;
protected IModel model;
@Override
public void createPageControls(Composite pageContainer) {
super.createPageControls(pageContainer);
containerComposite = pageContainer;
}
public NewObjectWizard(IModel model) {
this(model, null, null, null);
}
public NewObjectWizard(IModel model, Object treeInput,
ILabelProvider treeLabelProvider,
ITreeContentProvider treeContentProvider) {
this.model = model;
this.treeInput = treeInput;
this.treeLabelProvider = treeLabelProvider;
this.treeContentProvider = treeContentProvider;
createPages();
}
protected boolean showTypePage() {
return treeContentProvider != null;
}
protected boolean showNamePage() {
return true;
}
protected void createPages() {
if (showTypePage()) {
selectionPage = new ObjectTypeSelectionPage("Select Resource Type",
treeInput, treeLabelProvider, treeContentProvider);
}
if (showNamePage()) {
objectNamePage = new ObjectNamePage() {
ManchesterSyntaxParser rdfParser = Parboiled
.createParser(ManchesterSyntaxParser.class);
@Override
protected URI validate(String nameText) {
URI name = null;
String errorMsg = null;
if (nameText.length() == 0) {
errorMsg = "Name may not be empty.";
} else {
ParsingResult<Object> result = new ReportingParseRunner<Object>(
rdfParser.IriRef()).run(nameText);
if (result.hasErrors()) {
errorMsg = "Invalid name.";
} else {
if (result.resultValue instanceof IriRef) {
try {
name = URIs
.createURI(((IriRef) result.resultValue)
.getIri());
if (name.isRelative()) {
URI ns = model.getManager()
.getNamespace("");
if (ns != null) {
if (ns.fragment() != null) {
name = ns.appendLocalPart(name
.toString());
} else {
name = name.resolve(ns);
}
} else {
throw new IllegalArgumentException(
"Relative IRIs are not supported.");
}
}
} catch (IllegalArgumentException e) {
errorMsg = "Invalid IRI.";
}
} else {
String prefix = ((QName) result.resultValue)
.getPrefix();
String localPart = ((QName) result.resultValue)
.getLocalPart();
if (prefix == null
|| prefix.trim().length() == 0) {
prefix = "";
}
URI ns = model.getManager()
.getNamespace(prefix);
if (ns != null) {
name = ns.appendLocalPart(localPart);
} else {
errorMsg = "Unknown prefix";
}
}
if (name != null
&& model.getManager()
.createQuery(
"ASK { ?subj ?pred ?obj }",
false)
.setParameter("subj", name)
.getBooleanResult()) {
errorMsg = "An entity with the same name is already present in this model.";
}
}
}
setPageComplete(errorMsg == null);
setErrorMessage(errorMsg);
return name;
}
};
}
}
public void addPages() {
if (selectionPage != null) {
addPage(selectionPage);
}
if (objectNamePage != null) {
addPage(objectNamePage);
}
}
public boolean canFinish() {
if (objectNamePage == null) {
return selectionPage.isPageComplete();
}
return objectNamePage.isPageComplete()
&& getContainer().getCurrentPage() == objectNamePage;
}
public IWizardPage getNextPage(IWizardPage page) {
if (page == selectionPage) {
return objectNamePage;
}
return null;
}
public IWizardPage getPreviousPage(IWizardPage page) {
if (page != null) {
if (page == objectNamePage) {
return selectionPage;
}
return objectNamePage;
}
return null;
}
public Object[] getObjectTypes() {
return selectionPage.getTypes();
}
public URI getObjectName() {
return objectNamePage.getObjectName();
}
public void setObjectTypes(Object[] types) {
if (selectionPage != null) {
selectionPage.setTypes(types);
}
}
}