package org.jbpm.gd.jpdl.wizard;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.core.JavaProject;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.jbpm.gd.jpdl.Logger;
public class NewActionWizard extends NewClassWizard implements INewWizard {
static String ACTION_HANDLER_CLASS = "org.jbpm.graph.def.ActionHandler";
boolean openCreatedType = false;
public NewActionWizard() {
setDialogSettings(JavaPlugin.getDefault().getDialogSettings());
setWindowTitle("New jBPM Action");
setDefaultPageImageDescriptor(JavaPluginImages.DESC_WIZBAN_NEWCLASS);
}
public void addPages() {
super.addPages();
mainPage.setTitle("jBPM Action");
}
protected void finishPage(IProgressMonitor monitor) throws InterruptedException, CoreException {
mainPage.createType(monitor);
if(mainPage.getCreatedType() != null) {
modifyJavaSource();
}
}
@Override
public boolean performFinish() {
boolean b = super.performFinish();
if(b) {
if(openCreatedType) {
Display.getDefault().asyncExec(new Runnable(){
public void run() {
try {
JavaUI.openInEditor(mainPage.getCreatedType());
} catch (CoreException e) {
Logger.logError(e);
}
}
});
}
}
return b;
}
public void init(IWorkbench workbench, IStructuredSelection selection) {
IProject p = getProject(selection);
adapter = new NewTypeWizardAdapter(p);
adapter.addRawInterfaceName(ACTION_HANDLER_CLASS);
IPackageFragment f = getPackageFragment(selection);
if(f != null) {
String name = "";
IPackageFragment cf = f;
while(cf != null) {
if(name.length() == 0) {
name = cf.getElementName();
} else {
name = cf.getElementName() + "." + name;
}
cf = (cf.getParent() instanceof IPackageFragment) ? (IPackageFragment)cf.getParent() : null;
}
adapter.setRawPackageName(name);
}
adapter.setRawClassName("");
openCreatedType = true;
}
IProject getProject(IStructuredSelection selection) {
if(selection.isEmpty() || !(selection instanceof IStructuredSelection)) {
return null;
}
Object o = ((IStructuredSelection)selection).getFirstElement();
if(o instanceof IProject) {
return (IProject)o;
} else if(o instanceof IJavaElement) {
IJavaElement e = (IJavaElement)o;
return e.getJavaProject().getProject();
} else if(o instanceof IAdaptable) {
IResource r = (IResource)((IAdaptable)o).getAdapter(IResource.class);
return r != null ? r.getProject() : null;
}
return null;
}
IPackageFragment getPackageFragment(IStructuredSelection selection) {
if(selection.isEmpty() || !(selection instanceof IStructuredSelection)) {
return null;
}
Object o = ((IStructuredSelection)selection).getFirstElement();
if(o instanceof IPackageFragment) {
return (IPackageFragment)o;
} else if(o instanceof IFolder) {
IFolder f = (IFolder)o;
IJavaElement jp = JavaCore.create(f);
if(jp instanceof IPackageFragment) {
return (IPackageFragment)jp;
}
}
return null;
}
void modifyJavaSource() {
// String newValue = getQualifiedClassName();
try {
IType type = mainPage.getCreatedType();
if(type == null) {
return;
}
String name = type.getElementName();
String sc = type.getSuperclassTypeSignature();
ICompilationUnit w = type.getCompilationUnit().getWorkingCopy(new NullProgressMonitor());
IBuffer b = w.getBuffer();
String s = b.getContents();
String lineDelimiter = "\r\n";
String IMPORT = "import " + ACTION_HANDLER_CLASS + ";";
int i1 = s.indexOf(IMPORT);
if(i1 >= 0) {
if(i1 >= 0) {
String content = "";
String[] imports = {
"import org.jbpm.graph.exe.ExecutionContext;",
};
for (String is: imports) {
if(s.indexOf(is) < 0) {
content += lineDelimiter + is;
}
}
if(content.length() > 0) {
b.replace(i1 + IMPORT.length(), 0, content);
}
}
s = b.getContents();
int i = s.indexOf('{');
int j = s.lastIndexOf('}');
if(i > 0 && j > i) {
String tab = "\t";
String content = lineDelimiter
+ lineDelimiter
+ tab + "private static final long serialVersionUID = 1L;" + lineDelimiter
+ lineDelimiter
+ tab + "/**" + lineDelimiter
+ tab + "* The message member gets its value from the configuration in the" + lineDelimiter
+ tab + "* processdefinition. The value is injected directly by the engine." + lineDelimiter
+ tab + "*/" + lineDelimiter
+ tab + "String message;" + lineDelimiter
+ lineDelimiter
+ tab + "/**" + lineDelimiter
+ tab + "* A message process variable is assigned the value of the message" + lineDelimiter
+ tab + "* member. The process variable is created if it doesn't exist yet." + lineDelimiter
+ tab + "*/" + lineDelimiter
+ tab + "public void execute(ExecutionContext context) throws Exception {" + lineDelimiter
+ tab + tab + "//ADD CUSTOM ACTION CODE HERE" + lineDelimiter
+ tab + tab + "//context.getContextInstance().setVariable(\"message\", message);" + lineDelimiter
+ tab + "}" + lineDelimiter
+ lineDelimiter;
b.replace(i + 1, j - i - 1, content);
w.commitWorkingCopy(true, new NullProgressMonitor());
}
}
} catch (CoreException e) {
Logger.logError(e);
}
}
}