001: package org.drools.eclipse.dsl.editor;
002:
003: import java.io.Reader;
004:
005: import org.drools.eclipse.DroolsEclipsePlugin;
006: import org.drools.lang.dsl.DSLMappingFile;
007: import org.drools.lang.dsl.DefaultExpander;
008: import org.eclipse.core.runtime.IProgressMonitor;
009: import org.eclipse.core.runtime.IStatus;
010: import org.eclipse.core.runtime.Status;
011: import org.eclipse.jface.dialogs.ErrorDialog;
012: import org.eclipse.ui.IEditorInput;
013: import org.eclipse.ui.IEditorSite;
014: import org.eclipse.ui.PartInitException;
015: import org.eclipse.ui.forms.editor.FormEditor;
016:
017: /**
018: * Editor for rules using a domain-specific language.
019: *
020: * @author <a href="mailto:kris_verlaenen@hotmail.com">Kris Verlaenen</a>
021: */
022: public class DSLRuleEditor2 extends FormEditor {
023:
024: private DSLRuleEditor dslRuleEditor;
025: private DSLtoDRLRuleViewer drlRuleViewer;
026:
027: public void init(IEditorSite site, IEditorInput input)
028: throws PartInitException {
029: super .init(site, input);
030: setPartName(input.getName());
031: }
032:
033: protected void addPages() {
034: try {
035: dslRuleEditor = new DSLRuleEditor() {
036: public void close(boolean save) {
037: super .close(save);
038: DSLRuleEditor2.this .close(save);
039: }
040:
041: protected void setPartName(String partName) {
042: super .setPartName(partName);
043: DSLRuleEditor2.this .setPartName(partName);
044: }
045: };
046: int text = addPage(dslRuleEditor, getEditorInput());
047: setPageText(text, "Text Editor");
048: drlRuleViewer = new DSLtoDRLRuleViewer(dslRuleEditor);
049: text = addPage(drlRuleViewer, getEditorInput());
050: setPageText(text, "DRL Viewer");
051: } catch (PartInitException e) {
052: DroolsEclipsePlugin.log(e);
053: }
054: }
055:
056: public void doSave(IProgressMonitor monitor) {
057: dslRuleEditor.doSave(monitor);
058: setInput(getEditorInput());
059: }
060:
061: public void doSaveAs() {
062: dslRuleEditor.doSaveAs();
063: }
064:
065: public boolean isSaveAsAllowed() {
066: return dslRuleEditor.isSaveAsAllowed();
067: }
068:
069: public Object getAdapter(Class adapter) {
070: return dslRuleEditor.getAdapter(adapter);
071: }
072:
073: public void setFocus() {
074: if (getActivePage() == 1) {
075: // check if translation does succeed
076: try {
077: DefaultExpander expander = new DefaultExpander();
078: String content = dslRuleEditor.getContent();
079: Reader reader = DSLAdapter.getDSLContent(content,
080: dslRuleEditor.getResource());
081: if (reader == null) {
082: throw new IllegalArgumentException(
083: "Could not find dsl definition.");
084: }
085: DSLMappingFile mapping = new DSLMappingFile();
086: mapping.parseAndLoad(reader);
087: reader.close();
088: expander.addDSLMapping(mapping.getMapping());
089: expander.expand(content);
090: // if translation succeeds, change to drl viewer
091: drlRuleViewer.setInput(getEditorInput());
092: } catch (Throwable t) {
093: // if translation fails, show error and go to first page
094: handleError(t);
095: setActivePage(0);
096: }
097: }
098: super .setFocus();
099: }
100:
101: private void handleError(Throwable t) {
102: DroolsEclipsePlugin.log(t);
103: Throwable cause = t.getCause();
104: if (cause == null) {
105: cause = t;
106: }
107: String message = cause.getClass().getName() + ": "
108: + cause.getMessage();
109: if (message == null || message.length() == 0) {
110: message = "Uncategorized Error!";
111: }
112: IStatus status = new Status(IStatus.ERROR, DroolsEclipsePlugin
113: .getUniqueIdentifier(), -1, message, null);
114: ErrorDialog.openError(getSite().getShell(),
115: "DSL Rule Translation Error!",
116: "DSL Rule Translation Error!", status);
117:
118: }
119: }
|