001: package org.drools.eclipse.flow.ruleflow.editor;
002:
003: /*
004: * Copyright 2005 JBoss Inc
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: */
018:
019: import java.io.ByteArrayInputStream;
020: import java.io.ByteArrayOutputStream;
021: import java.io.IOException;
022: import java.io.InputStream;
023: import java.io.InputStreamReader;
024: import java.io.OutputStream;
025: import java.io.OutputStreamWriter;
026:
027: import org.drools.eclipse.DroolsEclipsePlugin;
028: import org.drools.eclipse.flow.common.editor.GenericModelEditor;
029: import org.drools.eclipse.flow.ruleflow.core.RuleFlowProcessWrapper;
030: import org.drools.eclipse.flow.ruleflow.core.StartNodeWrapper;
031: import org.drools.eclipse.flow.ruleflow.editor.editpart.RuleFlowEditPartFactory;
032: import org.eclipse.core.resources.IFile;
033: import org.eclipse.core.resources.IProject;
034: import org.eclipse.core.runtime.CoreException;
035: import org.eclipse.core.runtime.IPath;
036: import org.eclipse.core.runtime.IProgressMonitor;
037: import org.eclipse.draw2d.geometry.Rectangle;
038: import org.eclipse.gef.EditPartFactory;
039: import org.eclipse.gef.palette.PaletteRoot;
040: import org.eclipse.jface.dialogs.ProgressMonitorDialog;
041: import org.eclipse.ui.IFileEditorInput;
042: import org.eclipse.ui.actions.WorkspaceModifyOperation;
043: import org.eclipse.ui.part.FileEditorInput;
044:
045: import com.thoughtworks.xstream.XStream;
046:
047: /**
048: * Graphical editor for a RuleFlow.
049: *
050: * @author <a href="mailto:kris_verlaenen@hotmail.com">Kris Verlaenen</a>
051: */
052: public class RuleFlowModelEditor extends GenericModelEditor {
053:
054: protected EditPartFactory createEditPartFactory() {
055: return new RuleFlowEditPartFactory();
056: }
057:
058: protected PaletteRoot createPalette() {
059: return RuleFlowPaletteFactory.createPalette();
060: }
061:
062: protected Object createModel() {
063: RuleFlowProcessWrapper result = new RuleFlowProcessWrapper();
064: StartNodeWrapper start = new StartNodeWrapper();
065: start.setConstraint(new Rectangle(100, 100, -1, -1));
066: result.addElement(start);
067: IFile file = ((IFileEditorInput) getEditorInput()).getFile();
068: String name = file.getName();
069: result.setName(name.substring(0, name.length() - 3));
070: return result;
071: }
072:
073: public RuleFlowProcessWrapper getRuleFlowModel() {
074: return (RuleFlowProcessWrapper) getModel();
075: }
076:
077: protected void createOutputStream(OutputStream os)
078: throws IOException {
079: createOutputStream(os, true);
080: }
081:
082: protected void createOutputStream(OutputStream os,
083: boolean includeGraphics) throws IOException {
084: OutputStreamWriter writer = new OutputStreamWriter(os);
085: try {
086: XStream stream = new XStream();
087: stream.setMode(XStream.ID_REFERENCES);
088: if (includeGraphics) {
089: stream.toXML(getRuleFlowModel(), writer);
090: } else {
091: stream.toXML(getRuleFlowModel().getProcess(), writer);
092: }
093: writer.close();
094: } catch (Throwable t) {
095: DroolsEclipsePlugin.log(t);
096: }
097: }
098:
099: public void doSave(IProgressMonitor monitor) {
100: super .doSave(monitor);
101: // save process as separate model file as well
102: IFile file = ((IFileEditorInput) getEditorInput()).getFile();
103: final IFile modelFile = getModelFile(file);
104:
105: if (!modelFile.exists()) {
106: WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
107: public void execute(final IProgressMonitor monitor)
108: throws CoreException {
109: try {
110: ByteArrayOutputStream out = new ByteArrayOutputStream();
111: createOutputStream(out, false);
112: modelFile.create(new ByteArrayInputStream(out
113: .toByteArray()), true, monitor);
114: out.close();
115: } catch (Exception e) {
116: e.printStackTrace();
117: }
118: }
119: };
120:
121: try {
122: new ProgressMonitorDialog(getSite()
123: .getWorkbenchWindow().getShell()).run(false,
124: true, op);
125: setInput(new FileEditorInput(file));
126: getCommandStack().markSaveLocation();
127: } catch (Exception e) {
128: e.printStackTrace();
129: }
130: } else {
131: ByteArrayOutputStream out = new ByteArrayOutputStream();
132: try {
133: createOutputStream(out, false);
134: modelFile.setContents(new ByteArrayInputStream(out
135: .toByteArray()), true, false, monitor);
136: out.close();
137: } catch (Throwable t) {
138: DroolsEclipsePlugin.log(t);
139: }
140: }
141: }
142:
143: private IFile getModelFile(IFile file) {
144: IProject project = file.getProject();
145: IPath path = file.getProjectRelativePath();
146: String fileName = file.getName().substring(0,
147: file.getName().length() - 2)
148: + "rfm";
149: IPath modelPath = path.removeLastSegments(1).append(fileName);
150: IFile modelFile = project.getFile(modelPath);
151: return modelFile;
152: }
153:
154: protected void createInputStream(InputStream is) throws Exception {
155: InputStreamReader reader = new InputStreamReader(is);
156: XStream stream = new XStream();
157: stream.setMode(XStream.ID_REFERENCES);
158:
159: ClassLoader oldLoader = Thread.currentThread()
160: .getContextClassLoader();
161: ClassLoader newLoader = this.getClass().getClassLoader();
162: try {
163: Thread.currentThread().setContextClassLoader(newLoader);
164: setModel(stream.fromXML(reader));
165: } finally {
166: Thread.currentThread().setContextClassLoader(oldLoader);
167: }
168: reader.close();
169: }
170: }
|