You are viewing a plain text version of this content. The canonical link for it is here.
Posted to easyant-commits@incubator.apache.org by hi...@apache.org on 2011/02/17 20:23:04 UTC

svn commit: r1071768 [6/7] - in /incubator/easyant/easyant4e: ./ trunk/ trunk/org.apache.easyant/ trunk/org.apache.easyant/META-INF/ trunk/org.apache.easyant/lib/ trunk/org.apache.easyant4e.feature/ trunk/org.apache.easyant4e.releng/ trunk/org.apache.e...

Added: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreServiceImpl.java?rev=1071768&view=auto
==============================================================================
--- incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreServiceImpl.java (added)
+++ incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreServiceImpl.java Thu Feb 17 20:22:56 2011
@@ -0,0 +1,210 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  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.apache.easyant4e.services;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.easyant.core.EasyAntConfiguration;
+import org.apache.easyant.core.EasyAntEngine;
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.easyant.core.factory.EasyantConfigurationFactory;
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.ivyde.extension.RepositoryInstaller;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IStatus;
+
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_BUILD_TYPES_ORG;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_BUILD_PLUGINS_ORG;
+import static org.apache.easyant4e.EasyAntConstants.PLUGINS_SETTINGS;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyantCoreServiceImpl implements EasyantCoreService {
+
+	//TODO a déplacer dans pluginService
+	//TODO et ne pas recharger les settings à chaque fois ... faire un push du contexte
+	//TODO read workspace preference and project preference to Get the good Ivy instance for the EasyAnt Core
+	//IvySettings ivySettings = createIvySettingsForEACore(project);
+	//Ivy ivy = Ivy.newInstance(ivySettings);
+	//ivySettings.addRepositoryCacheManager(getRepositoryCacheManager());
+	//ivySettings.setBaseDir(getBaseDir(project));
+	
+/*
+	public Ivy getIvyInstance() {	
+		URL url = Activator.getDefault().getBundle().getResource(PLUGINS_SETTINGS);		
+		Ivy ivy = IvyContext.getContext().getIvy();
+		try{
+			ivy.configure(url);
+		} catch (ParseException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot parse EasyAnt Ivy settings file: " + url, e);
+		} catch (IOException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot read EasyAnt Ivy settings file: " + url, e);
+		}
+		IvySettings ivySettings = ivy.getSettings();
+		IvyContext ivyContext = IvyContext.pushNewContext();
+		ivyContext.setIvy(ivy);
+		return ivy;
+	}
+	*/
+	
+/*
+	private IvySettings createIvySettingsForEACore(IProject project) {
+		// Ivy ivy = IvyContext.pushNewCopyContext().getIvy();
+		// IvySettings ivySettings = ivy.getSettings();
+		IvySettings ivySettings = new IvySettings();
+
+		URL url = Activator.getDefault().getBundle().getResource(PLUGINS_SETTINGS);
+		try {
+			ivySettings.load(url);
+		} catch (ParseException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot parse EasyAnt Ivy settings file: " + url, e);
+		} catch (IOException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot read EasyAnt Ivy settings file: " + url, e);
+		}
+		//ivySettings.addRepositoryCacheManager(getRepositoryCacheManager());
+		ivySettings.setBaseDir(getBaseDir(project));
+		
+		return ivySettings;
+	}
+*/
+
+	public static final String CACHE_FILE = "easyant4e-cache-manager";
+	public static final String CACHE_NAME = "__easyant4e-cache-manager";
+
+/*	
+	// FIXME connect this on project instance
+	private static RepositoryCacheManager getRepositoryCacheManager() {
+		DefaultRepositoryCacheManager cacheManager = new DefaultRepositoryCacheManager();
+		BundleContext bundleContext = IvyPlugin.getDefault().getBundleContext();
+		cacheManager.setBasedir(bundleContext.getDataFile(CACHE_FILE));
+		cacheManager.setCheckmodified(true);
+		cacheManager.setUseOrigin(true);
+		cacheManager.setName(WorkspaceResolver.CACHE_NAME);
+		return cacheManager;
+	}
+*/
+	private EasyAntEngine easyAntEngine;
+	
+	@Inject
+	public void setEasyAntEngine(EasyAntEngine easyAntEngine){
+		this.easyAntEngine = easyAntEngine;
+	}
+	
+	//private static File getBaseDir(IProject project) {
+	//	return project.getLocation().toFile();
+	//}
+
+	public String getPluginsRepositoryPath() {
+		return pluginsRepository.getPath();
+	}
+
+	private File pluginsRepository;
+
+	public void installPluginsRepository() {
+		String userHome = System.getProperty("user.home");
+		File easyAntHome = new File(userHome, ".easyant");
+		if (!easyAntHome.exists()) {
+			boolean created = easyAntHome.mkdir();
+			if (!created) {
+				Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot create directory: " + easyAntHome);
+			}
+		}
+		this.pluginsRepository = new File(easyAntHome, "easyant-repository");
+		installLocalRepository();
+	}
+
+	private void installLocalRepository() {
+		if (!pluginsRepository.exists()) {
+			boolean created = pluginsRepository.mkdir();
+			if (!created) {
+				Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot create directory: " + pluginsRepository);
+			} else {
+				// populate the repository from the plugin
+				// TODO read preference to override default ivysettings.xml use
+				// to
+				// resolve build plugins
+				RepositoryInstaller repositoryInstaller = new RepositoryInstaller();
+				repositoryInstaller.install(pluginsRepository);
+			}
+		}
+		// HashMap<String, String> variables = new HashMap<String, String>();
+		// variables.put("easyant.repo.dir", pluginsRepository.getPath());
+		// ivySettings.addAllVariables(variables);
+	}
+
+	public String[] getAllCoreBuildTypes() {
+		try {
+			//getIvyInstance(null);
+			return easyAntEngine.getPluginService().searchModule(EASYANT_BUILD_TYPES_ORG, "*");
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		return null;
+	}
+
+	public String[] getAllCorePlugins() {
+		try {
+			//getIvyInstance(null);
+			return easyAntEngine.getPluginService().searchModule(EASYANT_BUILD_PLUGINS_ORG, "*");
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		return null;
+	}
+	
+	public List<PropertyDescriptor> getPropertiesForBuildType(String buildTypeName){
+		//getIvyInstance(null);
+		ArrayList<PropertyDescriptor> propertyDescriptors = new ArrayList<PropertyDescriptor>();
+		EasyAntReport eaReport = null;
+		try {
+			eaReport = easyAntEngine.getPluginService().getBuildTypeInfo(buildTypeName);
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		if (eaReport != null) {
+			Map<String, PropertyDescriptor> properties = eaReport.getAvailableProperties();
+			for (Entry<String, PropertyDescriptor> entry : properties.entrySet()) {
+				PropertyDescriptor prop = entry.getValue();
+				propertyDescriptors.add(prop);
+			}
+		}
+		return propertyDescriptors;
+	}
+
+	public String getBuildTypeDescription(String buildTypeName) {
+		return easyAntEngine.getPluginService().getBuildTypeDescription(buildTypeName);
+	}
+
+	public String getPluginDescription(String pluginName) {
+		return easyAntEngine.getPluginService().getPluginDescription(pluginName);
+	}
+}

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreServiceImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreServiceImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreServiceImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectService.java
URL: http://svn.apache.org/viewvc/incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectService.java?rev=1071768&view=auto
==============================================================================
--- incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectService.java (added)
+++ incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectService.java Thu Feb 17 20:22:56 2011
@@ -0,0 +1,79 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  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.apache.easyant4e.services;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.easyant.core.descriptor.EasyAntModuleDescriptor;
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.easyant.core.report.TargetReport;
+import org.apache.easyant4e.EasyAntConstants;
+//import org.apache.ivy.Ivy;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public interface EasyantProjectService {
+
+	//Ivy getIvyInstance(IProject project);
+	
+	IProject importProject(IProjectDescription projectDescription, Shell messageShell, IProgressMonitor monitor);
+	
+	boolean hasEasyAntNature(IProject project);
+	
+	boolean hasEasyAntBuilder(IProject project);
+	
+	void addNature(IProject project);
+	
+	void removeNature(IProject project);
+	
+	/**
+	 * @param project
+	 * @param buildTaskName
+	 * @param logLevel @see {@link EasyAntConstants#ANT_LOGLEVEL_DEBUG}, ...
+	 * @param monitor
+	 */
+	void runBuild(IProject project, String buildTaskName, int logLevel, IProgressMonitor monitor);
+	
+	/**
+	 * @return a list of available phases
+	 */
+	List<PhaseReport> getPhases(IFile ivyFile);
+	
+	/**
+	 * @return a list of available targets
+	 */
+	List<TargetReport> getTargets(IFile ivyFile);
+	
+	EasyAntModuleDescriptor getEasyAntModuleDescriptor(File file);
+	
+	Map<String, PropertyDescriptor> getProperties(IProject project);
+	
+	PropertyDescriptor getProperty(IProject project, String name);
+	
+}

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectService.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectService.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectServiceImpl.java?rev=1071768&view=auto
==============================================================================
--- incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectServiceImpl.java (added)
+++ incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectServiceImpl.java Thu Feb 17 20:22:56 2011
@@ -0,0 +1,378 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  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.apache.easyant4e.services;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.apache.easyant.core.EasyAntConfiguration;
+import org.apache.easyant.core.EasyAntEngine;
+import org.apache.easyant.core.EasyAntMagicNames;
+import org.apache.easyant.core.descriptor.EasyAntModuleDescriptor;
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.easyant.core.factory.EasyantConfigurationFactory;
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.easyant.core.report.TargetReport;
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.EasyAntConstants;
+import org.apache.easyant4e.EasyAntPlugin;
+import org.apache.easyant4e.console.EasyAntConsole;
+import org.apache.easyant4e.natures.AddEasyAntNatureOperation;
+import org.apache.easyant4e.natures.EasyAntNature;
+import org.apache.easyant4e.natures.RemoveEasyAntNatureOperation;
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.IOverwriteQuery;
+import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
+import org.eclipse.ui.wizards.datatransfer.ImportOperation;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyantProjectServiceImpl implements EasyantProjectService{
+
+	private EasyAntConsole console;
+	
+	private EasyantCoreService easyantCoreService;
+	
+	private EasyAntEngine easyAntEngine;
+	
+	@Inject
+	public void setEasyAntEngine(EasyAntEngine easyAntEngine){
+		this.easyAntEngine = easyAntEngine;
+	}
+
+	@Inject
+	public void setEasyantCoreService(EasyantCoreService easyantCoreService) {
+		this.easyantCoreService = easyantCoreService;
+	}
+
+	@Inject 
+	public void setEasyAntConsole(EasyAntConsole console) {
+		this.console = console;
+	}
+
+/*	
+	public Ivy getIvyInstance(IProject project) {
+		//TODO read workspace and project preference to load good Ivy instance must be used by the given project
+		return easyantCoreService.getIvyInstance(project);// by default return the ivy instance used by Easyant core
+	}
+*/
+	public void runBuild(IProject project, String buildTaskName, int logLevel, IProgressMonitor monitor) {
+		console.show();
+		console.info("\n");
+		console.info(project.getName() + "$ easyant " + buildTaskName+"\n");
+		
+		IFile ivyFile = project.getFile("module.ivy");
+		String ivyFilePath = ivyFile.getLocation().toOSString();
+		File buildModule = new File(ivyFilePath);
+		
+		URL easyantIvySettingsUrl = Activator.getDefault().getBundle().getResource(EasyAntConstants.PLUGINS_SETTINGS);
+		
+		Properties properties = new Properties();
+		properties.put("basedir",project.getLocation().toOSString());
+		properties.put("build.compiler", "org.eclipse.jdt.core.JDTCompilerAdapter");
+		properties.put("easyant.modules.dir", easyantCoreService.getPluginsRepositoryPath());
+				
+		//junit plugin under eclipse
+		//if property is true : Forked Java VM exited abnormally. Please note the time in the report does not reflect the time until the VM exit.
+		properties.put("test.run.fork", "false");
+		
+		EasyAntConfiguration configuration = EasyantConfigurationFactory.getInstance().createDefaultConfiguration();
+		configuration.setShowMemoryDetails(true);
+		//configuration.setBuildFile(buildFile); //TODO manage module.ant file
+		configuration.setBuildModule(buildModule);
+		configuration.setDefinedProps(properties);
+		configuration.setMsgOutputLevel(logLevel);
+		Vector<String> targets = new Vector<String>();
+		targets.add(buildTaskName);
+		configuration.setTargets(targets);
+		configuration.setEasyantIvySettingsUrl(easyantIvySettingsUrl.toString());
+		
+		PrintStream outStream = getConsoleOutStream();
+		configuration.setOut(outStream);
+		
+		PrintStream errStream = getConsoleErrStream();
+		configuration.setErr(errStream);
+		
+		//TODO lancer cela dans une WorkspaceModifyOperation
+		try{
+			EasyAntEngine.runBuild(configuration);
+		}catch (Exception be) {
+			Activator.getEasyAntPlugin().log(IStatus.WARNING, be.getMessage());
+		}
+		
+		outStream.close();
+		errStream.close();
+		
+	}
+
+	private PrintStream getConsoleOutStream(){		
+		console.show(true);
+		return new PrintStream(new OutputStream(){
+			private StringBuffer sb = new StringBuffer();
+			@Override
+			public void write(int b) throws IOException {
+				if(b!=10){
+					sb.append((char)b);
+				}else{
+					String message = sb.toString();
+					console.info(message);
+					sb = new StringBuffer();
+				}				
+			}
+			
+		});
+	}
+
+	private PrintStream getConsoleErrStream(){		
+		console.show(true);
+		return new PrintStream(new OutputStream(){
+			private StringBuffer sb = new StringBuffer();
+			@Override
+			public void write(int b) throws IOException {
+				if(b!=10){
+					sb.append((char)b);
+				}else{
+					String message = sb.toString();
+					console.error(message);
+					sb = new StringBuffer();
+				}				
+			}
+			
+		});
+	}
+
+	public boolean hasEasyAntNature(IProject project){
+		try {
+			return project.hasNature(EasyAntNature.NATURE_ID);
+		} catch (CoreException e) {
+			Activator.getEasyAntPlugin().log(e);
+		}
+		return false;
+	}
+	
+	public boolean hasEasyAntBuilder(IProject project){
+		ICommand[] commands=null;
+		try {
+			commands = project.getProject().getDescription().getBuildSpec();
+		} catch (CoreException e) {
+			Activator.getEasyAntPlugin().log(e);
+		}		
+		boolean found = false;
+		if(commands!=null){		
+			for (int i = 0; i < commands.length; ++i) {
+				if (commands[i].getBuilderName().equals(EasyAntNature.BUILDER_ID)){
+					found = true;
+				}
+			}	
+		}	
+		return found;
+	}
+	
+
+	public void addNature(IProject project) {
+		addNature(project, null, null);	
+	}
+	
+	private void addNature(IProject project, Shell shell, IProgressMonitor monitor) {
+
+		AddEasyAntNatureOperation addNature = new AddEasyAntNatureOperation(project);
+		try {
+			if(shell==null && monitor==null){
+				PlatformUI.getWorkbench().getProgressService().run(false, false, addNature);
+			}else{
+				addNature.run(monitor);
+			}
+		} catch (InvocationTargetException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot add EasyAnt nature.", e);
+		} catch (InterruptedException e) {
+			Activator.getEasyAntPlugin().log(IStatus.CANCEL, "Add EasyAnt nature operation aborted!", e);
+		}
+		// TODO launch resolve (ask to user)
+		// TODO initialize IvyDE classpath container
+		// TODO maybe launch the first build ??	
+	}
+	
+	public void removeNature(IProject project) {
+		// Remove the nature on the given project
+		RemoveEasyAntNatureOperation removeNature = new RemoveEasyAntNatureOperation(project);
+		try {
+			PlatformUI.getWorkbench().getProgressService().run(false, false, removeNature);
+		} catch (InvocationTargetException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot remove EasyAnt nature.", e);
+		} catch (InterruptedException e) {
+			Activator.getEasyAntPlugin().log(IStatus.CANCEL, "Remove EasyAnt nature operation aborted!", e);
+		}
+		// TODO remove IvyDE classpath container
+		
+	}
+
+	public IProject importProject(IProjectDescription projectDescription,  Shell messageShell, IProgressMonitor monitor) {
+		//String projectName = importProjectDescriptor.getProjectName();
+		//IProjectDescription projectDescription = importProjectDescriptor.getDescription();
+		String projectName = projectDescription.getName();
+		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		final IProject project = workspace.getRoot().getProject(projectName);
+//		if (projectDescription == null) {
+//			// error case
+//			projectDescription = workspace.newProjectDescription(projectName);
+//			IPath locationPath = new Path(importProjectDescriptor.getProjectSystemFile().getAbsolutePath());
+//
+//			// If it is under the root use the default location
+//			if (Platform.getLocation().isPrefixOf(locationPath)) {
+//				projectDescription.setLocation(null);
+//			} else {
+//				projectDescription.setLocation(locationPath);
+//			}
+//		} else {
+//			projectDescription.setName(projectName);
+//		}
+
+//		if (importProjectDescriptor.isFromIvyDescription()) {
+			// import form Ivy description
+			File importSource = new File(projectDescription.getLocationURI());
+			IWorkspaceRoot rootWorkspace = workspace.getRoot();
+			ImportOperation importOperation = new ImportOperation(rootWorkspace.getFullPath(),importSource,FileSystemStructureProvider.INSTANCE, new IOverwriteQuery(){
+					public String queryOverwrite(String pathString) { return ALL; }
+			});
+			importOperation.setContext(messageShell);
+			try {
+				//PlatformUI.getWorkbench().getProgressService().run(false, false, importOperation);
+				importOperation.run(monitor);
+			} catch (InvocationTargetException e) {
+				Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot import project.", e);
+			} catch (InterruptedException e) {
+				Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot import project.", e);
+			}			
+//		}
+
+		try {
+			monitor.beginTask("Creating project ...", 100);
+			project.create(projectDescription, new SubProgressMonitor(monitor, 30));
+			project.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 70));
+			// configure project, apply EasyAnt nature
+//			if (importProjectDescriptor.isFromIvyDescription()) {
+				addNature(project, messageShell, monitor);
+//			}
+		} catch (CoreException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot configure imported project.", e);
+			return null;
+		} finally {
+			monitor.done();		
+		}
+		return project;
+		
+	}
+	
+	public List<PhaseReport> getPhases(IFile ivyFile) {
+		EasyAntReport easyAntReport = null;
+		try {
+			//loadEasyAntIvySettings(ivyFile.getProject());
+			File f = new File(ivyFile.getLocation().toPortableString());
+			easyAntReport = easyAntEngine.getPluginService().generateEasyAntReport(f);
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		if (easyAntReport != null) {
+			return easyAntReport.getAvailablePhases();
+		}
+		return Collections.emptyList();
+	}
+
+	//private File getBaseDir(IProject project) {
+	//	return project.getLocation().toFile();
+	//}
+	
+	public List<TargetReport> getTargets(IFile ivyFile) {
+		EasyAntReport easyAntReport = null;
+		try {
+			File f = new File(ivyFile.getLocation().toPortableString());
+			easyAntReport = easyAntEngine.getPluginService().generateEasyAntReport(f);
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		if (easyAntReport != null) {
+			return easyAntReport.getUnboundTargets();
+		}
+		return Collections.emptyList();
+	}
+
+	public EasyAntModuleDescriptor getEasyAntModuleDescriptor(File file) {
+		EasyAntModuleDescriptor moduleDescriptor=null;
+		try {
+			moduleDescriptor = easyAntEngine.getPluginService().getEasyAntModuleDescriptor(file);
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		return moduleDescriptor;
+	}
+	
+	public Map<String, PropertyDescriptor> getProperties(IProject project){
+		IFile ivyFile = project.getFile("module.ivy");
+		String ivyFilePath = ivyFile.getLocation().toOSString();
+		File moduleDescriptor = new File(ivyFilePath);
+		EasyAntReport easyAntReport=null;
+		try {
+			easyAntReport = easyAntEngine.getPluginService().generateEasyAntReport(moduleDescriptor);			
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}				
+		if(easyAntReport!=null){
+			return easyAntReport.getAvailableProperties();
+		}
+		return Collections.emptyMap();
+	}
+	
+	public PropertyDescriptor getProperty(IProject project, String name){
+		Map<String, PropertyDescriptor> properties = getProperties(project);
+		if(properties.containsKey(name)){
+			PropertyDescriptor propertyDescriptor = properties.get(name);			
+			return propertyDescriptor;
+		}else{
+			return null;
+		}
+	}
+	
+}

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectServiceImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectServiceImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectServiceImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizard.java
URL: http://svn.apache.org/viewvc/incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizard.java?rev=1071768&view=auto
==============================================================================
--- incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizard.java (added)
+++ incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizard.java Thu Feb 17 20:22:56 2011
@@ -0,0 +1,70 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  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.apache.easyant4e.wizards;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.providers.ImageProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntImportWizard extends Wizard implements IImportWizard {
+
+	private EasyAntImportWizardPage importPage;
+	
+	private ImageProvider imageProvider;
+	
+	public EasyAntImportWizard(){
+		Activator.getEasyAntPlugin().injectMembers(this);
+	}
+		
+	@Inject
+	public void setImageProvider(ImageProvider imageProvider) {
+		this.imageProvider = imageProvider;
+	}
+
+	@Inject 
+	void setEasyAntImportWizardPage(EasyAntImportWizardPage importPage){
+		this.importPage=importPage;
+	}
+	
+	public void addPages() {
+		//importPage = new EasyAntImportWizardPage();
+		super.addPage(importPage);
+	}
+
+	@Override
+	public boolean performFinish() {
+		return importPage.createProjects();
+	}
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setNeedsProgressMonitor(true);
+		setWindowTitle("Import EasyAnt Projects");		
+		setDefaultPageImageDescriptor(imageProvider.getLogoImageDescriptor());
+	}
+
+}

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizard.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizard.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizard.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizardPage.java
URL: http://svn.apache.org/viewvc/incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizardPage.java?rev=1071768&view=auto
==============================================================================
--- incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizardPage.java (added)
+++ incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizardPage.java Thu Feb 17 20:22:56 2011
@@ -0,0 +1,649 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  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.apache.easyant4e.wizards;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.natures.AddEasyAntNatureOperation;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+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.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.ui.dialogs.IOverwriteQuery;
+import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
+import org.eclipse.ui.wizards.datatransfer.ImportOperation;
+
+import com.google.inject.Inject;
+
+//import com.google.inject.Inject;
+
+/**
+ * This wizard is used to import existing EasyAnt Projects
+ * 
+ * Inspired from WizardProjectsImportPage
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntImportWizardPage extends WizardPage {
+	
+	private EasyantProjectService easyantProjectService;
+	
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService) {
+		this.easyantProjectService = easyantProjectService;
+	}
+
+	public EasyAntImportWizardPage() {
+		super("Import EasyAnt projects");
+		setPageComplete(false);
+		setTitle("Import EasyAnt projects");
+		setDescription("Select a directory to search for existing EasyAnt projects.");
+	}
+
+	/**
+	 * The name of the folder containing metadata information for the workspace.
+	 */
+	public static final String METADATA_FOLDER = ".metadata"; //$NON-NLS-1$
+	//FIXME hard coded the folder name ?
+	public static final String TARGET_FOLDER = "target"; //$NON-NLS-1$
+	
+	
+	private Text directoryPathField;
+
+	private CheckboxTreeViewer projectsList;
+
+	private ProjectRecord[] selectedProjects = new ProjectRecord[0];
+
+	// Keep track of the directory that we browsed to last time
+	// the wizard was invoked.
+	private static String previouslyBrowsedDirectory = ""; //$NON-NLS-1$
+
+	private Button browseDirectoriesButton;
+
+	private IProject[] wsProjects;
+
+	// The last selected path to minimize searches
+	private String lastPath;
+	// The last time that the file or folder at the selected path was modified
+	// to mimize searches
+	private long lastModified;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
+	 * .Composite)
+	 */
+	public void createControl(Composite parent) {
+
+		initializeDialogUnits(parent);
+
+		Composite workArea = new Composite(parent, SWT.NONE);
+		setControl(workArea);
+
+		workArea.setLayout(new GridLayout());
+		workArea.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
+
+		createProjectsRoot(workArea);
+		createProjectsList(workArea);
+		createOptionsArea(workArea);
+		Dialog.applyDialogFont(workArea);
+
+	}
+
+	/**
+	 * Create the area with the extra options.
+	 * 
+	 * @param workArea
+	 */
+	private void createOptionsArea(Composite workArea) {
+		Composite optionsGroup = new Composite(workArea, SWT.NONE);
+		optionsGroup.setLayout(new GridLayout());
+		optionsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+	}
+
+	/**
+	 * Create the checkbox list for the found projects.
+	 * 
+	 * @param workArea
+	 */
+	private void createProjectsList(Composite workArea) {
+
+		Label title = new Label(workArea, SWT.NONE);		
+		title.setText("EasyAnt Projects:");
+
+		Composite listComposite = new Composite(workArea, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginWidth = 0;
+		layout.makeColumnsEqualWidth = false;
+		listComposite.setLayout(layout);
+
+		listComposite
+				.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH));
+
+		projectsList = new CheckboxTreeViewer(listComposite, SWT.BORDER);
+		GridData listData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
+		projectsList.getControl().setLayoutData(listData);
+
+		projectsList.setContentProvider(new ITreeContentProvider() {
+			public Object[] getChildren(Object parentElement) {
+				return null;
+			}
+
+			public Object[] getElements(Object inputElement) {
+				return getValidProjects();
+			}
+
+			public boolean hasChildren(Object element) {
+				return false;
+			}
+
+			public Object getParent(Object element) {
+				return null;
+			}
+
+			public void dispose() {
+
+			}
+
+			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			}
+
+		});
+
+		projectsList.setLabelProvider(new LabelProvider() {
+			public String getText(Object element) {
+				return ((ProjectRecord) element).getProjectLabel();
+			}
+		});
+
+		projectsList.addCheckStateListener(new ICheckStateListener() {
+			public void checkStateChanged(CheckStateChangedEvent event) {
+				setPageComplete(projectsList.getCheckedElements().length > 0);
+			}
+		});
+		projectsList.setInput(this);
+		projectsList.setComparator(new ViewerComparator());
+		createSelectionButtons(listComposite);
+	}
+
+	/**
+	 * Create the selection buttons in the listComposite.
+	 * 
+	 * @param listComposite
+	 */
+	private void createSelectionButtons(Composite listComposite) {
+		Composite buttonsComposite = new Composite(listComposite, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		buttonsComposite.setLayout(layout);
+
+		buttonsComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+
+		Button selectAll = new Button(buttonsComposite, SWT.PUSH);
+		selectAll.setText("Select All");
+		selectAll.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				projectsList.setCheckedElements(selectedProjects);
+				setPageComplete(projectsList.getCheckedElements().length > 0);
+			}
+		});
+		Dialog.applyDialogFont(selectAll);
+		setButtonLayoutData(selectAll);
+
+		Button deselectAll = new Button(buttonsComposite, SWT.PUSH);
+		deselectAll.setText("Deselect All");
+		deselectAll.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+
+				projectsList.setCheckedElements(new Object[0]);
+				setPageComplete(false);
+			}
+		});
+		Dialog.applyDialogFont(deselectAll);
+		setButtonLayoutData(deselectAll);
+
+		Button refresh = new Button(buttonsComposite, SWT.PUSH);
+		refresh.setText("Refresh");
+		refresh.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				updateProjectsList(directoryPathField.getText().trim());
+			}
+		});
+		Dialog.applyDialogFont(refresh);
+		setButtonLayoutData(refresh);
+	}
+
+	/**
+	 * Create the area where you select the root directory for the projects.
+	 * 
+	 * @param workArea
+	 *            Composite
+	 */
+	private void createProjectsRoot(Composite workArea) {
+		// project specification group
+		Composite projectGroup = new Composite(workArea, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 3;
+		layout.makeColumnsEqualWidth = false;
+		layout.marginWidth = 0;
+		projectGroup.setLayout(layout);
+		projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+		// project location entry field
+		this.directoryPathField = new Text(projectGroup, SWT.BORDER);
+
+		this.directoryPathField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
+
+		// browse button
+		browseDirectoriesButton = new Button(projectGroup, SWT.PUSH);
+		browseDirectoriesButton.setText("Browse");
+		setButtonLayoutData(browseDirectoriesButton);
+
+		browseDirectoriesButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				handleLocationDirectoryButtonPressed();
+			}
+
+		});
+
+		directoryPathField.addTraverseListener(new TraverseListener() {
+			public void keyTraversed(TraverseEvent e) {
+				if (e.detail == SWT.TRAVERSE_RETURN) {
+					e.doit = false;
+					updateProjectsList(directoryPathField.getText().trim());
+				}
+			}
+
+		});
+
+		directoryPathField.addFocusListener(new FocusAdapter() {
+			public void focusLost(org.eclipse.swt.events.FocusEvent e) {
+				updateProjectsList(directoryPathField.getText().trim());
+			}
+
+		});
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IDialogPage. Set the focus on path
+	 * fields when page becomes visible.
+	 */
+	public void setVisible(boolean visible) {
+		super.setVisible(visible);
+		if (visible) {
+			this.directoryPathField.setFocus();
+		}
+	}
+
+	/**
+	 * Update the list of projects based on path. Method declared public only
+	 * for test suite.
+	 * 
+	 * @param path
+	 */
+	public void updateProjectsList(final String path) {
+		// on an empty path empty selectedProjects
+		if (path == null || path.length() == 0) {
+			setMessage("Import Projects Description");
+			selectedProjects = new ProjectRecord[0];
+			projectsList.refresh(true);
+			projectsList.setCheckedElements(selectedProjects);
+			setPageComplete(projectsList.getCheckedElements().length > 0);
+			lastPath = path;
+			return;
+		}
+
+		final File directory = new File(path);
+		long modified = directory.lastModified();
+		if (path.equals(lastPath) && lastModified == modified) {
+			// since the file/folder was not modified and the path did not
+			// change, no refreshing is required
+			return;
+		}
+
+		lastPath = path;
+		lastModified = modified;
+
+		// We can't access the radio button from the inner class so get the
+		// status beforehand
+		// final boolean dirSelected =
+		// this.projectFromDirectoryRadio.getSelection();
+		try {
+			getContainer().run(true, true, new IRunnableWithProgress() {
+
+				public void run(IProgressMonitor monitor) {
+					monitor.beginTask("Searching", 100);
+					selectedProjects = new ProjectRecord[0];
+					Collection files = new ArrayList();
+					monitor.worked(10);
+					if (directory.isDirectory()) {
+
+						if (!collectProjectFilesFromDirectory(files, directory, null, monitor)) {
+							return;
+						}
+						Iterator filesIterator = files.iterator();
+						selectedProjects = new ProjectRecord[files.size()];
+						int index = 0;
+						monitor.worked(50);
+						monitor.subTask("Processing");
+						while (filesIterator.hasNext()) {
+							File file = (File) filesIterator.next();
+							ProjectRecord projectRecord = new ProjectRecord(file, lastPath);							
+							selectedProjects[index] = projectRecord;
+							index++;
+						}
+					} else {
+						monitor.worked(60);
+					}
+					monitor.done();
+				}
+
+			});
+		} catch (InvocationTargetException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage());
+		} catch (InterruptedException e) {
+			// Nothing to do if the user interrupts.
+		}
+
+		projectsList.refresh(true);
+		projectsList.setCheckedElements(getValidProjects());
+		if (getValidProjects().length < selectedProjects.length) {
+			setMessage("Projects in workspace", WARNING);
+		} else {
+			setMessage("Import projects description");
+		}
+		setPageComplete(projectsList.getCheckedElements().length > 0);
+	}
+
+	/**
+	 * Display an error dialog with the specified message.
+	 * 
+	 * @param message
+	 *            the error message
+	 */
+	protected void displayErrorDialog(String message) {
+		MessageDialog.openError(getContainer().getShell(), getErrorDialogTitle(), message);
+	}
+
+	/**
+	 * Get the title for an error dialog. Subclasses should override.
+	 */
+	protected String getErrorDialogTitle() {
+		// FIXME
+		return "internalErrorTitle";
+	}
+
+	/**
+	 * Collect the list of .project files that are under directory into files.
+	 * 
+	 * @param files
+	 * @param directory
+	 * @param directoriesVisited
+	 *            Set of canonical paths of directories, used as recursion guard
+	 * @param monitor
+	 *            The monitor to report to
+	 * @return boolean <code>true</code> if the operation was completed.
+	 */
+	private boolean collectProjectFilesFromDirectory(Collection files, File directory, Set directoriesVisited,
+			IProgressMonitor monitor) {
+
+		if (monitor.isCanceled()) {
+			return false;
+		}
+		monitor.subTask("Collect project files from "+ directory.getPath());
+		File[] contents = directory.listFiles();
+		if (contents == null){
+			return false;
+		}
+
+		// Initialize recursion guard for recursive symbolic links
+		if (directoriesVisited == null) {
+			directoriesVisited = new HashSet();
+			try {
+				directoriesVisited.add(directory.getCanonicalPath());
+			} catch (IOException exception) {
+				Activator.getEasyAntPlugin().log(IStatus.ERROR, exception.getMessage(), exception);
+			}
+		}
+		// first look for EasyAnt description files
+		for (int i = 0; i < contents.length; i++) {
+			File file = contents[i];
+			if (file.isFile() && file.getName().endsWith("ivy")) {
+				files.add(file);				
+			}else if (contents[i].isDirectory()) {
+				if (!contents[i].getName().equals(METADATA_FOLDER) && !contents[i].getName().equals(TARGET_FOLDER)) {
+					try {
+						String canonicalPath = contents[i].getCanonicalPath();
+						if (!directoriesVisited.add(canonicalPath)) {
+							// already been here --> do not recurse
+							continue;
+						}
+					} catch (IOException exception) {
+						Activator.getEasyAntPlugin().log(IStatus.ERROR, exception.getMessage(), exception);
+
+					}
+					collectProjectFilesFromDirectory(files, contents[i], directoriesVisited, monitor);
+				}
+			}
+		}
+		return true;
+	}
+	/**
+	 * The browse button has been selected. Select the location.
+	 */
+	protected void handleLocationDirectoryButtonPressed() {
+		DirectoryDialog dialog = new DirectoryDialog(directoryPathField.getShell());
+		dialog.setMessage("Select directory to scan");
+
+		String dirName = directoryPathField.getText().trim();
+		if (dirName.length() == 0) {
+			dirName = previouslyBrowsedDirectory;
+		}
+
+		if (dirName.length() == 0) {
+			dialog.setFilterPath(Activator.getEasyAntPlugin().getPluginWorkspace().getRoot().getLocation().toOSString());
+		} else {
+			File path = new File(dirName);
+			if (path.exists()) {
+				dialog.setFilterPath(new Path(dirName).toOSString());
+			}
+		}
+
+		String selectedDirectory = dialog.open();
+		if (selectedDirectory != null) {
+			previouslyBrowsedDirectory = selectedDirectory;
+			directoryPathField.setText(previouslyBrowsedDirectory);
+			updateProjectsList(selectedDirectory);
+		}
+
+	}
+
+
+	/**
+	 * Create the selected projects
+	 * 
+	 * @return boolean <code>true</code> if all project creations were
+	 *         successful.
+	 */
+	public boolean createProjects() {		
+		final Object[] selected = projectsList.getCheckedElements();
+		WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
+			protected void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+				try {
+					monitor.beginTask("", selected.length); //$NON-NLS-1$
+					if (monitor.isCanceled()) {
+						throw new OperationCanceledException();
+					}
+					for (int i = 0; i < selected.length; i++) {
+						createExistingProject((ProjectRecord) selected[i], new SubProgressMonitor(monitor, 1));
+					}
+				} finally {
+					monitor.done();
+				}
+			}
+		};
+		// run the new project creation operation
+		try {
+			getContainer().run(true, true, op);
+		} catch (InterruptedException e) {
+			return false;
+		} catch (InvocationTargetException e) {
+			// one of the steps resulted in a core exception
+			Throwable t = e.getTargetException();
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, t.getMessage(), t);
+			String message = "Cannot import project";
+			IStatus status;
+			if (t instanceof CoreException) {
+				status = ((CoreException) t).getStatus();
+			} else {
+				status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 1, message, t);
+			}
+			ErrorDialog.openError(getShell(), message, null, status);
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Create the project described in record. If it is successful return true.
+	 * 
+	 * @param record
+	 * @return boolean <code>true</code> if successful
+	 * @throws InterruptedException
+	 */
+	private IProject createExistingProject(final ProjectRecord record, IProgressMonitor monitor)
+			throws InvocationTargetException, InterruptedException {		
+		return easyantProjectService.importProject(record.getDescription(), getShell(), monitor);
+	}
+
+	/**
+	 * Method used for test suite.
+	 * 
+	 * @return CheckboxTreeViewer the viewer containing all the projects found
+	 */
+	public CheckboxTreeViewer getProjectsList() {
+		return projectsList;
+	}
+
+	/**
+	 * Retrieve all the projects in the current workspace.
+	 * 
+	 * @return IProject[] array of IProject in the current workspace
+	 */
+	private IProject[] getProjectsInWorkspace() {
+		if (wsProjects == null) {
+			wsProjects = Activator.getEasyAntPlugin().getPluginWorkspace().getRoot().getProjects();
+		}
+		return wsProjects;
+	}
+
+	/**
+	 * Get the array of valid project records that can be imported from the
+	 * source workspace or archive, selected by the user. If a project with the
+	 * same name exists in both the source workspace and the current workspace,
+	 * it will not appear in the list of projects to import and thus cannot be
+	 * selected for import.
+	 * 
+	 * Method declared public for test suite.
+	 * 
+	 * @return ProjectRecord[] array of projects that can be imported into the
+	 *         workspace
+	 */
+	public ProjectRecord[] getValidProjects() {
+		List validProjects = new ArrayList();
+		for (int i = 0; i < selectedProjects.length; i++) {
+			if (!isProjectInWorkspace(selectedProjects[i].getProjectName())) {
+				validProjects.add(selectedProjects[i]);
+			}
+		}
+		return (ProjectRecord[]) validProjects.toArray(new ProjectRecord[validProjects.size()]);
+	}
+
+	/**
+	 * Determine if the project with the given name is in the current workspace.
+	 * 
+	 * @param projectName
+	 *            String the project name to check
+	 * @return boolean true if the project with the given name is in this
+	 *         workspace
+	 */
+	private boolean isProjectInWorkspace(String projectName) {
+		if (projectName == null) {
+			return false;
+		}
+		IProject[] workspaceProjects = getProjectsInWorkspace();
+		for (int i = 0; i < workspaceProjects.length; i++) {
+			if (projectName.equals(workspaceProjects[i].getName())) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+}

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizardPage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizardPage.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizardPage.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/ProjectRecord.java
URL: http://svn.apache.org/viewvc/incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/ProjectRecord.java?rev=1071768&view=auto
==============================================================================
--- incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/ProjectRecord.java (added)
+++ incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/ProjectRecord.java Thu Feb 17 20:22:56 2011
@@ -0,0 +1,155 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  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.apache.easyant4e.wizards;
+
+import java.io.File;
+
+import org.apache.easyant.core.descriptor.EasyAntModuleDescriptor;
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IProjectDescription;
+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 com.google.inject.Inject;
+
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class ProjectRecord {
+	
+	private EasyantProjectService easyantProjectService;
+	
+	private String lastPath;
+	
+	private File projectSystemFile;
+
+	public File getProjectSystemFile() {
+		return projectSystemFile;
+	}
+
+	private String projectName;
+
+	private boolean fromIvyDescription = false;
+
+	private IProjectDescription description;
+
+	public IProjectDescription getDescription() {
+		return description;
+	}
+
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService){
+		this.easyantProjectService = easyantProjectService;
+	}
+
+	/**
+	 * Create a record for a project based on the info in the file.
+	 * 
+	 * @param file
+	 */
+	ProjectRecord(File file, String lastPath) {
+		Activator.getEasyAntPlugin().injectMembers(this);
+		this.projectSystemFile = file;
+		this.lastPath = lastPath;
+		setProjectName();
+	}
+
+	/**
+	 * Set the name of the project based on the projectFile.
+	 */
+	private void setProjectName() {
+		try {
+			// If we don't have the project name try again
+			IPath path = new Path(projectSystemFile.getPath());
+			if (projectName == null && !path.toOSString().endsWith("ivy")) {
+				// if the file is in the default location, use the directory
+				// name as the project name
+				if (isDefaultLocation(path)) {
+					projectName = path.segment(path.segmentCount() - 2);
+					description = Activator.getEasyAntPlugin().getPluginWorkspace().newProjectDescription(projectName);
+				} else {
+					description = Activator.getEasyAntPlugin().getPluginWorkspace().loadProjectDescription(path);
+					projectName = description.getName();
+				}
+
+			} else if (path.toOSString().endsWith("ivy")) {
+				fromIvyDescription = true;
+				// Load EasyantFile
+				File f = new File(path.toPortableString());
+				EasyAntModuleDescriptor moduleDescriptor = easyantProjectService.getEasyAntModuleDescriptor(f);
+				projectName = moduleDescriptor.getName();
+				description = Activator.getEasyAntPlugin().getPluginWorkspace().newProjectDescription(projectName);					
+				if(lastPath.endsWith(projectName)){
+					description.setLocation(new Path(lastPath));
+				}else{
+					description.setLocation(new Path(lastPath+"/"+ projectName));
+				}
+				description.setComment(moduleDescriptor.getDescription());
+				String[] newNatures= {};
+				description.setNatureIds(newNatures);					
+			}
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Returns whether the given project description file path is in the
+	 * default location for a project
+	 * 
+	 * @param path
+	 *            The path to examine
+	 * @return Whether the given path is the default location for a project
+	 */
+	private boolean isDefaultLocation(IPath path) {
+		// The project description file must at least be within the project,
+		// which is within the workspace location
+		if (path.segmentCount() < 2)
+			return false;
+		return path.removeLastSegments(2).toFile().equals(Platform.getLocation().toFile());
+	}
+
+	/**
+	 * Get the name of the project
+	 * 
+	 * @return String
+	 */
+	public String getProjectName() {
+		return projectName;
+	}
+
+	/**
+	 * Gets the label to be used when rendering this project record in the
+	 * UI.
+	 * 
+	 * @return String the label
+	 */
+	public String getProjectLabel() {
+		return projectName;
+	}
+
+	public boolean isFromIvyDescription() {
+		return fromIvyDescription;
+	}
+}
\ No newline at end of file

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/ProjectRecord.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/ProjectRecord.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/org/apache/easyant4e/wizards/ProjectRecord.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/repository.zip
URL: http://svn.apache.org/viewvc/incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/repository.zip?rev=1071768&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/easyant/easyant4e/trunk/org.apache.easyant4e/src/repository.zip
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/easyant/easyant4e/trunk/quality/.project
URL: http://svn.apache.org/viewvc/incubator/easyant/easyant4e/trunk/quality/.project?rev=1071768&view=auto
==============================================================================
--- incubator/easyant/easyant4e/trunk/quality/.project (added)
+++ incubator/easyant/easyant4e/trunk/quality/.project Thu Feb 17 20:22:56 2011
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>quality</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>

Propchange: incubator/easyant/easyant4e/trunk/quality/.project
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/easyant4e/trunk/quality/.project
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/easyant4e/trunk/quality/.project
------------------------------------------------------------------------------
    svn:mime-type = text/xml