/******************************************************************************* * Copyright (c) 2000, 2007 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package fr.inria.diverse.k3.ui.templates.k3al; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.common.ui.dialogs.WorkspaceResourceDialog; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.osgi.framework.BundleException; import fr.inria.diverse.commons.eclipse.pde.classpath.ClasspathHelper; import fr.inria.diverse.commons.eclipse.pde.manifest.ManifestChanger; import fr.inria.diverse.commons.eclipse.pde.wizards.pages.pde.ui.BaseProjectWizardFields; import fr.inria.diverse.commons.eclipse.pde.wizards.pages.pde.ui.templates.AbstractStringWithButtonOption; import fr.inria.diverse.commons.eclipse.pde.wizards.pages.pde.ui.templates.NewProjectTemplateWizard; import fr.inria.diverse.commons.eclipse.pde.wizards.pages.pde.ui.templates.TemplateOption; import fr.inria.diverse.k3.ui.templates.Activator; import fr.inria.diverse.k3.ui.templates.IHelpContextIds; import fr.inria.diverse.k3.ui.templates.K3TemplateMessages; import fr.inria.diverse.k3.ui.templates.K3TemplateSection; import fr.inria.diverse.k3.ui.wizards.pages.NewK3ProjectWizardFields; import fr.inria.diverse.k3.ui.wizards.pages.NewK3ProjectWizardFields.KindsOfProject; public class UserEcoreBasicAspectTemplate extends K3TemplateSection { public static final String KEY_ASPECTCLASS_POSTFIX = "aspectClassPostfix"; //$NON-NLS-1$ public static final String ASPECTCLASS_POSTFIX = "Aspect"; //$NON-NLS-1$ public static final String KEY_ASPECTBASEPACKAGE_NAME = "aspectBasePackage"; //$NON-NLS-1$ public static final String ASPECTBASEPACKAGE_NAME = ""; //$NON-NLS-1$ public static final String KEY_ASPECTPACKAGE_POSTFIX = "aspectPackagePostfix"; //$NON-NLS-1$ public static final String ASPECTPACKAGE_POSTFIX = ".aspects"; //$NON-NLS-1$ public static final String KEY_ECOREBASEPACKAGE_NAME = "ecoreBasePackage"; //$NON-NLS-1$ public static final String ECOREBASEPACKAGE_NAME = ""; //$NON-NLS-1$ public static final String KEY_ASPECTFILE_NAME = "aspectFileName"; //$NON-NLS-1$ public static final String ASPECTFILE_NAME = "MyAspects"; //$NON-NLS-1$ public static final String KEY_ECOREFILE_PATH = "ecoreFilePath"; //$NON-NLS-1$ protected static final List<String> FILE_EXTENSIONS = Arrays.asList(new String [] { "ecore" }); NewK3ProjectWizardFields _data; protected NewProjectTemplateWizard hostWizard; /** * Constructor for HelloWorldTemplate. */ public UserEcoreBasicAspectTemplate(NewProjectTemplateWizard hostWizard) { setPageCount(1); createOptions(); this.hostWizard = hostWizard; } /** * used to retrieve the template folder */ public String getSectionId() { return "userEcoreBasicAspect"; //$NON-NLS-1$ } /* * @see ITemplateSection#getNumberOfWorkUnits() */ public int getNumberOfWorkUnits() { return super.getNumberOfWorkUnits() + 1; } protected void createOptions() { //addOption(KEY_PACKAGE_NAME, K3TemplateMessages.UserEcoreBasicAspectTemplate_packageName, (String) null, 0); addBlankField(0).setLabel(K3TemplateMessages.UserEcoreBasicAspectTemplate_desc_complement_part1); addBlankField(0).setLabel(K3TemplateMessages.UserEcoreBasicAspectTemplate_desc_complement_part2); addOption(KEY_ASPECTBASEPACKAGE_NAME, K3TemplateMessages.UserEcoreBasicAspectTemplate_aspectBasePackageName, K3TemplateMessages.UserEcoreBasicAspectTemplate_aspectBasePackageNameToolTip, ASPECTBASEPACKAGE_NAME, 0).setRequired(false); addOption(KEY_ASPECTPACKAGE_POSTFIX, K3TemplateMessages.UserEcoreBasicAspectTemplate_aspectPackagePostfix, K3TemplateMessages.UserEcoreBasicAspectTemplate_aspectPackagePostfixToolTip, ASPECTPACKAGE_POSTFIX, 0).setRequired(false); addOption(KEY_ASPECTFILE_NAME, K3TemplateMessages.UserEcoreBasicAspectTemplate_aspectFileName, K3TemplateMessages.UserEcoreBasicAspectTemplate_aspectFileNameToolTip, ASPECTFILE_NAME, 0); addOption(KEY_ASPECTCLASS_POSTFIX, K3TemplateMessages.UserEcoreBasicAspectTemplate_aspectClassPostfix, K3TemplateMessages.UserEcoreBasicAspectTemplate_aspectClassPostfixToolTip, ASPECTCLASS_POSTFIX, 0); addBlankField(0); addOption(KEY_ECOREBASEPACKAGE_NAME, K3TemplateMessages.UserEcoreBasicAspectTemplate_ecoreBasePackageName, K3TemplateMessages.UserEcoreBasicAspectTemplate_ecoreBasePackageNameToolTip, null, 0).setRequired(false); //addOption(KEY_ECOREFILE_LOCATION, K3TemplateMessages.UserEcoreBasicAspectTemplate_ecoreFileLocation, (String) null, 0); TemplateOption ecoreLocationOption = new AbstractStringWithButtonOption(this, KEY_ECOREFILE_PATH, K3TemplateMessages.UserEcoreBasicAspectTemplate_ecoreFilePath) { @Override public String doSelectButton() { final IWorkbenchWindow workbenchWindow = PlatformUI .getWorkbench().getActiveWorkbenchWindow(); Object selection = null; if (workbenchWindow.getSelectionService().getSelection() instanceof IStructuredSelection) { selection = ((IStructuredSelection) workbenchWindow .getSelectionService().getSelection()) .getFirstElement(); } final IFile selectedEcoreFile = selection != null && selection instanceof IFile && FILE_EXTENSIONS.contains(((IFile) selection) .getFileExtension()) ? (IFile) selection : null; ViewerFilter viewerFilter = new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IFile) { IFile file = (IFile) element; return FILE_EXTENSIONS.contains(file .getFileExtension()) && (selectedEcoreFile == null || !selectedEcoreFile .getFullPath().equals( file.getFullPath())); } return true; } }; final IFile[] files = WorkspaceResourceDialog .openFileSelection(workbenchWindow.getShell(), null, "Select ecore", true, null, Collections.singletonList(viewerFilter)); if (files.length > 0) { UserEcoreBasicAspectTemplate.this._data.ecoreIFile = files[0]; //txtPathEcore.setText(files[i].getFullPath().toOSString()); //UserEcoreBasicAspectTemplate.this._data.ecoreProjectPath = files[0].getProject().getFullPath().toOSString(); return files[0].getFullPath().toOSString(); } return null; } }; registerOption(ecoreLocationOption, (String) null, 0); } public void addPages(Wizard wizard) { WizardPage page = createPage(0, IHelpContextIds.TEMPLATE_ECORE_ASPECT); page.setTitle(K3TemplateMessages.UserEcoreBasicAspectTemplate_title); page.setDescription(K3TemplateMessages.UserEcoreBasicAspectTemplate_desc); wizard.addPage(page); markPagesAdded(); } public boolean isDependentOnParentWizard() { return true; } protected void initializeFields(BaseProjectWizardFields data) { // save reference to content for later use _data = (NewK3ProjectWizardFields)data; // initialize values according to previous pages content or o //String packageName = getFormattedPackageName(_data.projectName); //initializeOption(KEY_PACKAGE_NAME, packageName); if(_data.ecoreIFile != null){ initializeOption(KEY_ECOREFILE_PATH,_data.ecoreIFile.getFullPath().toOSString()); } if(_data.basePackage != null){ initializeOption(KEY_ECOREBASEPACKAGE_NAME,_data.basePackage); } } public String getUsedExtensionPoint() { return "org.eclipse.ui.actionSets"; //$NON-NLS-1$ } /* (non-Javadoc) * @see org.eclipse.pde.ui.templates.ITemplateSection#getFoldersToInclude() */ public String[] getNewFiles() { return new String[] {"icons/"}; //$NON-NLS-1$ } /* (non-Javadoc) * @see fr.inria.diverse.k3.ui.templates.K3TemplateSection#generateFiles(org.eclipse.core.runtime.IProgressMonitor) */ @Override protected void generateFiles(IProgressMonitor monitor) throws CoreException { updateDataFromOptions(); super.generateFiles(monitor); k3.language.aspectgenerator.Context aspectGeneratorContext = k3.language.aspectgenerator.AspectGenerator.aspectGenerate ( _data.projectLocation, _data.projectName, "File:///"+_data.ecoreIFile.getLocation().toOSString(), (String) this.getValue(KEY_ECOREBASEPACKAGE_NAME), // ecoreBasePackage (String) this.getValue(KEY_PACKAGE_NAME) (String) this.getValue(KEY_ASPECTBASEPACKAGE_NAME), // aspectBasePackage (String) this.getValue(KEY_ASPECTPACKAGE_POSTFIX), // aspectPackageSuffix null, //_data.operationName, new ArrayList<String>(),//_data.operationParams new ArrayList<String>() //_data.listNewClass, (no parameters so no need to create empty classes) ); // now also fix the project configuration // If this is a plugin if(_data.kindsOfProject == KindsOfProject.PLUGIN){ ManifestChanger manifestChanger; try { manifestChanger = new ManifestChanger(project.getFile("META-INF/MANIFEST.MF")); manifestChanger.addPluginDependency(_data.ecoreIFile.getProject().getName(), "0.0.0", false, true); for(String createdPackage : aspectGeneratorContext.createdPackages){ manifestChanger.addExportPackage(createdPackage); } manifestChanger.commit(); } catch (IOException | BundleException e) { Activator.logErrorMessage(e.getMessage(), e); } } else if(_data.kindsOfProject == KindsOfProject.STANDALONE){ // must update the build path ClasspathHelper.addEntry(project, JavaCore.newProjectEntry(_data.ecoreIFile.getProject().getFullPath()), monitor); } else if(_data.kindsOfProject == KindsOfProject.MAVEN){ ClasspathHelper.addEntry(project, JavaCore.newProjectEntry(_data.ecoreIFile.getProject().getFullPath()), monitor); // TODO must update the pom.xml } } public void updateDataFromOptions() { if(_data == null) initializeFields(hostWizard.getData()); // for convenience, copy the appropriate values from the wizard options into the data //_data.namePackage = (String) this.getValue(KEY_PACKAGE_NAME); } }