/*******************************************************************************
* Copyright (c) 2012 Pivotal Software, Inc.
* 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:
* Pivotal Software, Inc. - initial API and implementation
*******************************************************************************/
package org.springsource.ide.eclipse.commons.internal.configurator;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.springframework.util.StringUtils;
import org.springsource.ide.eclipse.commons.configurator.ConfigurableExtension;
import org.springsource.ide.eclipse.commons.configurator.WorkspaceConfiguratorParticipant;
import org.springsource.ide.eclipse.commons.internal.configurator.ConfiguratorImporter.ParticipantExtensionPointReader;
/**
* @author Steffen Pingel
* @author Christian Dupuis
* @since 2.5.0
*/
public class Configurator {
private static final String PARAM_TARGET = "targetDir";
private static final String PARAM_EXTENSION = "extension";
private final List<WorkspaceConfiguratorParticipant> participants = new ArrayList<WorkspaceConfiguratorParticipant>();
public IStatus execute(Map<?, ?> parameters) {
return execute(parameters, false);
}
public IStatus execute(Map<?, ?> parameters, boolean errorIfNoParticipant) {
participants.clear();
String targetPath = (String) parameters.get(PARAM_TARGET);
if (targetPath != null) {
return execute(targetPath, errorIfNoParticipant);
}
else {
String extensionId = (String) parameters.get(PARAM_EXTENSION);
if (extensionId != null) {
for (InstallableItem item : ParticipantExtensionPointReader.getInstallableItems()) {
if (extensionId.equals(item.getId())) {
ConfiguratorImporter importer = new ConfiguratorImporter();
File installLocation = importer.getInstallLocation();
if (installLocation != null) {
IStatus result = item.install(installLocation, new NullProgressMonitor());
if (result.getSeverity() != IStatus.ERROR) {
return execute(item.getTargetLocation(installLocation).getAbsolutePath(),
errorIfNoParticipant);
}
}
break;
}
}
if (errorIfNoParticipant) {
return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "No install item found to configure request");
}
// try again later
persistRequest("extension=" + extensionId);
return Status.OK_STATUS;
}
else {
return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Missing parameter 'targetDir' or 'extension'");
}
}
}
private IStatus execute(String targetPath, boolean errorIfNoParticipant) {
File file = new File(targetPath);
if (file.exists() && file.isDirectory()) {
// Run external contributed configurators
for (WorkspaceConfiguratorParticipant configurator : ParticipantExtensionPointReader.getParticipants()) {
ConfigurableExtension extension = configurator.createExtension(file, new NullProgressMonitor());
if (extension != null) {
participants.add(configurator);
try {
extension.configure(new NullProgressMonitor());
}
catch (Exception e) {
return new Status(IStatus.ERROR, Activator.PLUGIN_ID, 1, "Error occured configuring workspace",
e);
}
}
}
}
else {
return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Parameter 'targetDir' does not denote a valid path");
}
if (participants.isEmpty()) {
if (errorIfNoParticipant) {
return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "No participant found to configure request");
}
else {
// If install wasn't configured by any participant persist the
// request for later
persistRequest(targetPath);
}
}
return Status.OK_STATUS;
}
public void executePendingRequests() {
String configureTargets = Activator.getDefault().getPreferenceStore()
.getString(Activator.PROPERTY_CONFIGURE_TARGETS);
List<String> newConfigureTargets = new ArrayList<String>();
if (StringUtils.hasLength(configureTargets)) {
StringTokenizer targets = new StringTokenizer(configureTargets, File.pathSeparator);
while (targets.hasMoreTokens()) {
String target = targets.nextToken();
Map<String, String> parameters = new HashMap<String, String>();
if (target.startsWith("extension=")) {
parameters.put(PARAM_EXTENSION, target.substring("extension=".length()));
}
else {
parameters.put(PARAM_TARGET, target);
}
IStatus status = execute(parameters, true);
if (!status.isOK()) {
newConfigureTargets.add(target);
}
}
}
Activator
.getDefault()
.getPreferenceStore()
.setValue(Activator.PROPERTY_CONFIGURE_TARGETS,
StringUtils.collectionToDelimitedString(newConfigureTargets, File.pathSeparator));
}
private void persistRequest(String target) {
String configureTargets = Activator.getDefault().getPreferenceStore()
.getString(Activator.PROPERTY_CONFIGURE_TARGETS);
if (StringUtils.hasLength(configureTargets)) {
configureTargets += File.pathSeparatorChar + target;
}
else {
configureTargets = target;
}
Activator.getDefault().getPreferenceStore().setValue(Activator.PROPERTY_CONFIGURE_TARGETS, configureTargets);
}
public IStatus undo(Map<?, ?> parameters) {
String targetPath = (String) parameters.get(PARAM_TARGET);
if (targetPath != null) {
File file = new File(targetPath);
if (file.exists() && file.isDirectory()) {
for (WorkspaceConfiguratorParticipant configurator : participants) {
ConfigurableExtension extension = configurator.createExtension(file, new NullProgressMonitor());
if (extension != null) {
extension.unConfigure(new NullProgressMonitor());
}
}
}
}
return Status.OK_STATUS;
}
}