/* * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.eclipse.wizard.project; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.drools.eclipse.DroolsEclipsePlugin; import org.drools.eclipse.preferences.DroolsProjectPreferencePage; import org.drools.eclipse.util.DroolsRuntime; import org.drools.eclipse.util.DroolsRuntimeManager; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; 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.Composite; import org.eclipse.ui.dialogs.PreferencesUtil; import org.kie.eclipse.runtime.AbstractRuntime.Version; import org.kie.eclipse.runtime.IRuntime; import org.kie.eclipse.runtime.IRuntimeManager; import org.kie.eclipse.utils.FileUtils; import org.kie.eclipse.wizard.project.AbstractKieEmptyProjectWizardPage; import org.kie.eclipse.wizard.project.AbstractKieOnlineExampleProjectWizardPage; import org.kie.eclipse.wizard.project.AbstractKieProjectStartWizardPage; import org.kie.eclipse.wizard.project.AbstractKieProjectWizard; import org.kie.eclipse.wizard.project.IKieProjectWizardPage; import org.kie.eclipse.wizard.project.IKieSampleFilesProjectWizardPage; /** * A wizard to create a new Drools project. */ public class NewDroolsProjectWizard extends AbstractKieProjectWizard { private EmptyDroolsProjectWizardPage emptyProjectPage; private SampleDroolsProjectWizardPage sampleFilesProjectPage; @Override protected void initializeDefaultPageImageDescriptor() { ImageDescriptor desc = DroolsEclipsePlugin.getImageDescriptor("icons/drools-large.PNG"); setDefaultPageImageDescriptor(desc); } @Override protected void createOutputLocation(IJavaProject project, IProgressMonitor monitor) throws JavaModelException, CoreException { IFolder folder = FileUtils.createFolder(project, "target/classes", monitor); IPath path = folder.getFullPath(); project.setOutputLocation(path, null); } @Override protected void createInitialContent(IJavaProject javaProject, IProgressMonitor monitor) throws CoreException, JavaModelException, IOException { if (startPage.getInitialProjectContent() == IKieProjectWizardPage.SAMPLE_FILES_PROJECT) { if (sampleFilesProjectPage.shouldCreateJavaRuleFile()) { createRuleSampleLauncher(javaProject); } if (sampleFilesProjectPage.shouldCreateRuleFile()) { createRule(javaProject, monitor); } if (sampleFilesProjectPage.shouldCreateDecisionTableFile()) { createDecisionTable(javaProject, monitor); } if (sampleFilesProjectPage.shouldCreateJavaDecisionTableFile()) { createDecisionTableSampleLauncher(javaProject); } if (sampleFilesProjectPage.shouldCreateRuleFlowFile()) { createRuleFlow(javaProject, monitor); } if (sampleFilesProjectPage.shouldCreateJavaRuleFlowFile()) { createRuleFlowSampleLauncher(javaProject); } createKJarArtifacts(javaProject, monitor); createMavenArtifacts(javaProject, monitor); } else if (startPage.getInitialProjectContent() == IKieProjectWizardPage.EMPTY_PROJECT) { createDefaultPackages(javaProject, monitor); createKJarArtifacts(javaProject, monitor); createMavenArtifacts(javaProject, monitor); } else { super.createInitialContent(javaProject, monitor); } createLoggerFile(javaProject, monitor); } protected void addSourceFolders(IJavaProject project, IProgressMonitor monitor) throws JavaModelException, CoreException { if (startPage.getInitialProjectContent()!=IKieProjectWizardPage.ONLINE_EXAMPLE_PROJECT) { List<IClasspathEntry> list = new ArrayList<IClasspathEntry>(); list.addAll(Arrays.asList(project.getRawClasspath())); addSourceFolder(project, list, "src/main/java", monitor); if (startPage.getRuntime().getVersion().getMajor()==6) { addSourceFolder(project, list, "src/main/resources", monitor); } else { addSourceFolder(project, list, "src/main/rules", monitor); } project.setRawClasspath((IClasspathEntry[]) list.toArray(new IClasspathEntry[list.size()]), null); } } private void createDefaultPackages(IJavaProject project, IProgressMonitor monitor) throws CoreException { IFolder folder = project.getProject().getFolder("src/main/java/com/sample"); FileUtils.createFolder(folder, monitor); folder = project.getProject().getFolder("src/main/resources/rules"); FileUtils.createFolder(folder, monitor); folder = project.getProject().getFolder("src/main/resources/dtables"); FileUtils.createFolder(folder, monitor); folder = project.getProject().getFolder("src/main/resources/process"); FileUtils.createFolder(folder, monitor); } private void createLoggerFile(IJavaProject project, IProgressMonitor monitor) throws CoreException { String fileName = "org/drools/eclipse/wizard/project/logback-test.xml.template"; IFolder folder = project.getProject().getFolder("src/main/resources"); FileUtils.createFolder(folder, monitor); IFile file = folder.getFile("logback-test.xml"); InputStream inputstream = getClass().getClassLoader().getResourceAsStream(fileName); if (!file.exists()) { file.create(inputstream, true, monitor); } else { file.setContents(inputstream, true, false, monitor); } } @Override protected void createMavenArtifacts(IJavaProject project, IProgressMonitor monitor) { try { String projectName = project.getProject().getName(); String runtimeVersion = startPage.getRuntime().getVersion().toString(); String groupId = "com.sample"; String artifactId = projectName; String version = "1.0.0-SNAPSHOT"; boolean shouldCreateMavenProject = false; if (startPage.getInitialProjectContent() == IKieProjectWizardPage.SAMPLE_FILES_PROJECT) { groupId = sampleFilesProjectPage.getPomGroupId(); artifactId = sampleFilesProjectPage.getPomArtifactId(); version = sampleFilesProjectPage.getPomVersion(); shouldCreateMavenProject = sampleFilesProjectPage.shouldCreateMavenProject(); } else if (startPage.getInitialProjectContent() == IKieProjectWizardPage.EMPTY_PROJECT) { groupId = emptyProjectPage.getPomGroupId(); artifactId = emptyProjectPage.getPomArtifactId(); version = emptyProjectPage.getPomVersion(); shouldCreateMavenProject = emptyProjectPage.shouldCreateMavenProject(); } FileUtils.createProjectFile(project, monitor, FileUtils.generatePomProperties(groupId, artifactId, version), "src/main/resources/META-INF/maven", "pom.properties"); if (shouldCreateMavenProject) { String fileName = "org/drools/eclipse/wizard/project/maven-pom.xml.template"; InputStream inputstream = getClass().getClassLoader().getResourceAsStream(fileName); FileUtils.createProjectFile(project, monitor, FileUtils.generatePom(inputstream, runtimeVersion, groupId, artifactId, version), null, "pom.xml"); } } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override protected void createKJarArtifacts(IJavaProject project, IProgressMonitor monitor) { try { if (startPage.getRuntime().getVersion().getMajor()>=6) { FileUtils.createProjectFile(project, monitor, generateKModule(), "src/main/resources/META-INF", "kmodule.xml"); String projectName = project.getProject().getName(); String groupId = "com.sample"; String artifactId = projectName; String version = "1.0.0-SNAPSHOT"; FileUtils.createProjectFile(project, monitor, FileUtils.generatePomProperties(groupId, artifactId, version), "src/main/resources/META-INF/maven", "pom.properties"); } } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private InputStream generateKModule() { StringBuilder sb = new StringBuilder(); sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); sb.append("<kmodule xmlns=\"http://jboss.org/kie/6.0.0/kmodule\">\n"); if (sampleFilesProjectPage.shouldCreateRuleFile() || sampleFilesProjectPage.shouldCreateJavaRuleFile()) { sb.append(" <kbase name=\"rules\" packages=\"rules\">\n"); sb.append(" <ksession name=\"ksession-rules\"/>\n"); sb.append(" </kbase>\n"); } if (sampleFilesProjectPage.shouldCreateDecisionTableFile() || sampleFilesProjectPage.shouldCreateJavaDecisionTableFile()) { sb.append(" <kbase name=\"dtables\" packages=\"dtables\">\n"); sb.append(" <ksession name=\"ksession-dtables\"/>\n"); sb.append(" </kbase>\n"); } if (sampleFilesProjectPage.shouldCreateRuleFlowFile() || sampleFilesProjectPage.shouldCreateJavaRuleFlowFile()) { sb.append(" <kbase name=\"process\" packages=\"process\">\n"); sb.append(" <ksession name=\"ksession-process\"/>\n"); sb.append(" </kbase>\n"); } sb.append("</kmodule>\n"); return new ByteArrayInputStream(sb.toString().getBytes()); } /** * Create the sample rule launcher file. */ private void createRuleSampleLauncher(IJavaProject project) throws JavaModelException, IOException { Version version = startPage.getRuntime().getVersion(); if (version.getMajor()==4) { createProjectJavaFile(project, "org/drools/eclipse/wizard/project/RuleLauncherSample_4.java.template", "DroolsTest.java"); } else if (version.getMajor()==5) { createProjectJavaFile(project, "org/drools/eclipse/wizard/project/RuleLauncherSample_5.java.template", "DroolsTest.java"); } else if (version.getMajor()>=6) { createProjectJavaFile(project, "org/drools/eclipse/wizard/project/RuleLauncherSample_6.java.template", "DroolsTest.java"); } } /** * Create the sample decision table launcher file. */ private void createDecisionTableSampleLauncher(IJavaProject project) throws JavaModelException, IOException { Version version = startPage.getRuntime().getVersion(); if (version.getMajor()==4) { createProjectJavaFile(project, "org/drools/eclipse/wizard/project/DecisionTableLauncherSample_4.java.template", "DecisionTableTest.java"); } else if (version.getMajor()==5) { createProjectJavaFile(project, "org/drools/eclipse/wizard/project/DecisionTableLauncherSample_5.java.template", "DecisionTableTest.java"); } else if (version.getMajor()>=6) { createProjectJavaFile(project, "org/drools/eclipse/wizard/project/DecisionTableLauncherSample_6.java.template", "DecisionTableTest.java"); } } private void createProjectJavaFile(IJavaProject project, String templateFile, String javaFile) throws JavaModelException, IOException { IFolder folder = project.getProject().getFolder("src/main/java"); IPackageFragmentRoot packageFragmentRoot = project.getPackageFragmentRoot(folder); IPackageFragment packageFragment = packageFragmentRoot.createPackageFragment("com.sample", true, null); InputStream inputstream = getClass().getClassLoader().getResourceAsStream(templateFile); packageFragment.createCompilationUnit(javaFile, new String(FileUtils.readStream(inputstream)), true, null); } private void createProjectFile(IJavaProject project, IProgressMonitor monitor, String templateFile, String folderName, String fileName) throws CoreException { InputStream inputstream = getClass().getClassLoader().getResourceAsStream(templateFile); FileUtils.createProjectFile(project, monitor, inputstream, folderName, fileName); } /** * Create the sample rule file. */ private void createRule(IJavaProject project, IProgressMonitor monitor) throws CoreException { if (startPage.getRuntime().getVersion().getMajor()>=6) { FileUtils.createFolder(project, "src/main/resources/rules", monitor); createProjectFile(project, monitor, "org/drools/eclipse/wizard/project/Sample.drl.template", "src/main/resources/rules", "Sample.drl"); } else { createProjectFile(project, monitor, "org/drools/eclipse/wizard/project/Sample.drl.template", "src/main/rules", "Sample.drl"); } } /** * Create the sample decision table file. */ private void createDecisionTable(IJavaProject project, IProgressMonitor monitor) throws CoreException { if (startPage.getRuntime().getVersion().getMajor()>=6) { FileUtils.createFolder(project, "src/main/resources/dtables", monitor); createProjectFile(project, monitor, "org/drools/eclipse/wizard/project/Sample.xls.template", "src/main/resources/dtables", "Sample.xls"); } else { createProjectFile(project, monitor, "org/drools/eclipse/wizard/project/Sample.xls.template", "src/main/rules", "Sample.xls"); } } /** * Create the sample RuleFlow file. */ private void createRuleFlow(IJavaProject project, IProgressMonitor monitor) throws CoreException { Version version = startPage.getRuntime().getVersion(); if (version.getMajor()==4) { createProjectFile(project, monitor, "org/drools/eclipse/wizard/project/ruleflow_4.rf.template", "src/main/rules", "ruleflow.rf"); createProjectFile(project, monitor, "org/drools/eclipse/wizard/project/ruleflow_4.rfm.template", "src/main/rules", "ruleflow.rfm"); createProjectFile(project, monitor, "org/drools/eclipse/wizard/project/ruleflow_4.drl.template", "src/main/rules", "ruleflow.drl"); } else if (version.getMajor()==5 && version.getMinor()==0) { createProjectFile(project, monitor, "org/drools/eclipse/wizard/project/ruleflow.rf.template", "src/main/rules", "ruleflow.rf"); } else if (version.getMajor()==5) { createProjectFile(project, monitor, "org/drools/eclipse/wizard/project/sample.bpmn.template", "src/main/rules", "sample.bpmn"); } else { FileUtils.createFolder(project, "src/main/resources/process", monitor); createProjectFile(project, monitor, "org/drools/eclipse/wizard/project/sample.bpmn.template", "src/main/resources/process", "sample.bpmn"); } } /** * Create the sample RuleFlow launcher file. */ private void createRuleFlowSampleLauncher(IJavaProject project) throws JavaModelException, IOException { String s; Version version = startPage.getRuntime().getVersion(); if (version.getMajor()==4) { s = "org/drools/eclipse/wizard/project/RuleFlowLauncherSample_4.java.template"; } else if (version.getMajor()==5 && version.getMinor()==0) { s = "org/drools/eclipse/wizard/project/RuleFlowLauncherSample.java.template"; } else if (version.getMajor()==5) { s = "org/drools/eclipse/wizard/project/ProcessLauncherSample_bpmn_5.java.template"; } else { s = "org/drools/eclipse/wizard/project/ProcessLauncherSample_bpmn_6.java.template"; } createProjectJavaFile(project, s, "ProcessTest.java"); } /* (non-Javadoc) * @see org.kie.eclipse.wizard.project.AbstractKieProjectWizard#createStartPage(java.lang.String) * Create the Wizard Start Page */ @Override protected IKieProjectWizardPage createStartPage(String pageId) { return new AbstractKieProjectStartWizardPage(pageId) { @Override public String getTitle() { return "Create New Drools Project"; } }; } /* (non-Javadoc) * @see org.kie.eclipse.wizard.project.AbstractKieProjectWizard#createEmptyProjectPage(java.lang.String) * Create the Empty Project Wizard Page */ @Override protected IKieProjectWizardPage createEmptyProjectPage(String pageId) { emptyProjectPage = new EmptyDroolsProjectWizardPage(EMPTY_PROJECT_PAGE); return emptyProjectPage; } /* (non-Javadoc) * @see org.kie.eclipse.wizard.project.AbstractKieProjectWizard#createSampleFilesProjectPage(java.lang.String) * Create the Sample Files Project Wizard Page */ @Override protected IKieProjectWizardPage createSampleFilesProjectPage(String pageId) { sampleFilesProjectPage = new SampleDroolsProjectWizardPage(SAMPLE_FILES_PROJECT_PAGE); return sampleFilesProjectPage; } /* (non-Javadoc) * @see org.kie.eclipse.wizard.project.AbstractKieProjectWizard#createOnlineExampleProjectPage(java.lang.String) * Create the Online Example Project Wizard Page */ @Override protected IKieProjectWizardPage createOnlineExampleProjectPage(String pageId) { return new AbstractKieOnlineExampleProjectWizardPage(ONLINE_EXAMPLE_PROJECT_PAGE) { @Override public String getTitle() { return "Create Drools Projects from Online Examples"; } @Override public String getDescription() { return "Select Drools Example Projects"; } @Override public IRuntimeManager getRuntimeManager() { return DroolsRuntimeManager.getDefault(); } @Override public String getProductId() { return "drools"; } }; } /** * Implementation for the Empty Project Wizard Page */ class EmptyDroolsProjectWizardPage extends AbstractKieEmptyProjectWizardPage implements IKieSampleFilesProjectWizardPage { public EmptyDroolsProjectWizardPage(String pageName) { super(pageName); setTitle("Create New Empty Drools Project"); setDescription("Select the type of Drools Project"); } @Override protected void createControls(Composite parent) { } @Override public IRuntimeManager getRuntimeManager() { return DroolsRuntimeManager.getDefault(); } @Override protected IRuntime createRuntime() { return new DroolsRuntime(); } @Override public int showRuntimePreferenceDialog() { return PreferencesUtil.createPreferenceDialogOn(getShell(), DroolsProjectPreferencePage.PREF_ID, new String[] { DroolsProjectPreferencePage.PROP_ID }, null).open(); } @Override public String getProductName() { return "Drools"; } @Override public String getProductId() { return "drools"; } } /** * Implementation for the Sample Files Project Wizard Page */ class SampleDroolsProjectWizardPage extends EmptyDroolsProjectWizardPage { private boolean addSampleRule = true; private boolean addSampleDecisionTableCode = true; private boolean addSampleRuleFlow = true; public SampleDroolsProjectWizardPage(String pageName) { super(pageName); setTitle("Create New Drools Project with Sample Files"); setDescription("Select the sample files to be included"); } @Override protected void createControls(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout(1, false)); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.verticalIndent = 10; gd.horizontalIndent = 10; composite.setLayoutData(gd); composite.setLayoutData(gd); final Button addSampleRuleButton = createCheckBox(composite, "Add a sample HelloWorld rule file to this project."); addSampleRuleButton.setSelection(addSampleRule); addSampleRuleButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { addSampleRule = ((Button) e.widget).getSelection(); } }); final Button addSampleDecisionTableCodeButton = createCheckBox(composite, "Add a sample HelloWorld decision table file to this project."); addSampleDecisionTableCodeButton.setSelection(addSampleDecisionTableCode); addSampleDecisionTableCodeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { addSampleDecisionTableCode = ((Button) e.widget).getSelection(); } }); final Button addSampleRuleFlowButton = createCheckBox(composite, "Add a sample HelloWorld process file to this project."); addSampleRuleFlowButton.setSelection(addSampleRuleFlow); addSampleRuleFlowButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { addSampleRuleFlow = ((Button) e.widget).getSelection(); } }); } public boolean shouldCreateRuleFile() { return addSampleRule; } public boolean shouldCreateJavaRuleFile() { return addSampleRule; //addSampleJavaRuleCode; } public boolean shouldCreateDecisionTableFile() { return addSampleDecisionTableCode; } public boolean shouldCreateJavaDecisionTableFile() { return addSampleDecisionTableCode; //addSampleJavaDecisionTableCode; } public boolean shouldCreateRuleFlowFile() { return addSampleRuleFlow; } public boolean shouldCreateJavaRuleFlowFile() { return addSampleRuleFlow; //addSampleJavaRuleFlowCode; } } }