/******************************************************************************* * Copyright (c) 2010 Neil Bartlett. * 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: * Neil Bartlett - initial API and implementation *******************************************************************************/ package bndtools.wizards.project; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.bndtools.api.BndtoolsConstants; import org.bndtools.api.ProjectPaths; import org.bndtools.templating.Template; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.ui.wizards.NewJavaProjectWizardPageOne; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.osgi.service.metatype.AttributeDefinition; import org.osgi.service.metatype.ObjectClassDefinition; import bndtools.Plugin; public class NewBndProjectWizardPageOne extends NewJavaProjectWizardPageOne { private final ProjectNameGroup nameGroup = new ProjectNameGroup(); private final ProjectLocationGroup locationGroup = new ProjectLocationGroup("Location"); private Template template; NewBndProjectWizardPageOne() { setTitle("Create a Bnd OSGi Project"); nameGroup.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { IStatus status = nameGroup.getStatus(); if (status.isOK()) { setPageComplete(true); setErrorMessage(null); locationGroup.setProjectName(nameGroup.getProjectName()); } else { setPageComplete(false); setErrorMessage(status.getMessage()); } } }); locationGroup.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { IStatus status = locationGroup.getStatus(); setPageComplete(status.isOK()); if (status.isOK()) { setErrorMessage(null); } else { setErrorMessage(status.getMessage()); } } }); } @Override public String getProjectName() { return nameGroup.getProjectName(); } public String getPackageName() { return nameGroup.getPackageName(); } @Override public URI getProjectLocationURI() { IPath location = locationGroup.getLocation(); if (isDirectlyInWorkspace(location)) return null; return URIUtil.toURI(location); } private static boolean isDirectlyInWorkspace(IPath location) { File wslocation = Platform.getLocation().toFile(); return location.toFile().getAbsoluteFile().getParentFile().equals(wslocation); } @Override /* * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets .Composite) This has been cut * and pasted from the superclass because we wish to customize the contents of the page. */ public void createControl(Composite parent) { initializeDialogUnits(parent); final Composite composite = new Composite(parent, SWT.NULL); composite.setFont(parent.getFont()); composite.setLayout(new GridLayout(1, false)); composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); Control nameControl = nameGroup.createControl(composite); nameControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Control locationControl = locationGroup.createControl(composite); locationControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Control jreControl = createJRESelectionControl(composite); jreControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Control workingSetControl = createWorkingSetControl(composite); workingSetControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Control infoControl = createInfoControl(composite); infoControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); setControl(composite); } @Override public IClasspathEntry[] getDefaultClasspathEntries() { IClasspathEntry[] entries = super.getDefaultClasspathEntries(); List<IClasspathEntry> result = new ArrayList<IClasspathEntry>(entries.length + 2); result.addAll(Arrays.asList(entries)); // Add the Bnd classpath container entry IPath bndContainerPath = BndtoolsConstants.BND_CLASSPATH_ID; IClasspathEntry bndContainerEntry = JavaCore.newContainerEntry(bndContainerPath, false); result.add(bndContainerEntry); return result.toArray(new IClasspathEntry[0]); } @Override public IClasspathEntry[] getSourceClasspathEntries() { IPath projectPath = new Path(getProjectName()).makeAbsolute(); ProjectPaths projectPaths = ProjectPaths.DEFAULT; List<IClasspathEntry> newEntries = new ArrayList<IClasspathEntry>(2); newEntries.add(JavaCore.newSourceEntry(projectPath.append(projectPaths.getSrc()), null, projectPath.append(projectPaths.getBin()))); boolean enableTestSrcDir; try { if (template == null) enableTestSrcDir = true; else { ObjectClassDefinition templateMeta = template.getMetadata(); enableTestSrcDir = findAttribute(templateMeta, ProjectTemplateParam.TEST_SRC_DIR.getString()) != null; } } catch (Exception e) { Plugin.getDefault().getLog().log(new Status(IStatus.ERROR, Plugin.PLUGIN_ID, 0, "Error accessing template parameters", e)); enableTestSrcDir = true; } if (enableTestSrcDir) newEntries.add(JavaCore.newSourceEntry(projectPath.append(projectPaths.getTestSrc()), null, projectPath.append(projectPaths.getTestBin()))); return newEntries.toArray(new IClasspathEntry[0]); } private AttributeDefinition findAttribute(ObjectClassDefinition ocd, String name) { AttributeDefinition[] attDefs = ocd.getAttributeDefinitions(ObjectClassDefinition.ALL); if (attDefs == null) return null; for (AttributeDefinition attDef : attDefs) { if (name.equals(attDef.getName())) return attDef; } return null; } @Override public IPath getOutputLocation() { return new Path(getProjectName()).makeAbsolute().append(ProjectPaths.DEFAULT.getBin()); } public void setTemplate(Template template) { this.template = template; } }