/*******************************************************************************
* Copyright (c) 2007, 2010 Spring IDE Developers
* 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:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.core.project;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.ide.eclipse.core.PersistablePreferenceObjectSupport;
import org.springframework.ide.eclipse.core.SpringCore;
import org.springframework.ide.eclipse.core.model.ISpringProject;
import org.springframework.util.StringUtils;
/**
* Wraps contributions to the <code>org.springframework.ide.eclipse.core.builders</code> extension point.
* @author Christian Dupuis
* @author Torsten Juergeleit
* @since 2.0
*/
public class ProjectBuilderDefinition extends PersistablePreferenceObjectSupport {
private static final Long DEFAULT_ORDER = 10L;
private static final String BUILDER_PREFIX = "builders.enable.";
private static final String CLASS_ATTRIBUTE = "class";
private static final String DESCRIPTION_ATTRIBUTE = "description";
private static final String ENABLED_BY_DEFAULT_ATTRIBUTE = "enabledByDefault";
private static final String ICON_ATTRIBUTE = "icon";
private static final String ID_ATTRIBUTE = "id";
private static final String NAME_ATTRIBUTE = "name";
private static final String ORDER_ATTRIBUTE = "order";
private String description;
private String iconUri;
private String id;
private String name;
private String namespaceUri;
private Long order;
private IProjectBuilder projectBuilder;
public ProjectBuilderDefinition(IConfigurationElement element) throws Exception {
init(element);
}
private void cleanup(IProject project) {
if (!isEnabled(project)) {
if (project != null) {
cleanupProject(project);
}
// cleanup projects that use workspace properties
else {
Set<ISpringProject> projects = SpringCore.getModel().getProjects();
for (ISpringProject sproject : projects) {
IProject p = sproject.getProject();
if (!hasProjectSpecificOptions(p)) {
cleanupProject(p);
}
}
}
}
}
private void cleanupProject(IProject project) {
try {
getProjectBuilder().cleanup(project, new NullProgressMonitor());
}
catch (CoreException e) {
// ignore
}
}
public String getDescription() {
return description;
}
public String getIconUri() {
return iconUri;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getNamespaceUri() {
return namespaceUri;
}
@Override
protected String getPreferenceId() {
return BUILDER_PREFIX + this.id;
}
public IProjectBuilder getProjectBuilder() {
return projectBuilder;
}
public Long getOrder() {
return order;
}
private void init(IConfigurationElement element) throws Exception {
Object builder = element.createExecutableExtension(CLASS_ATTRIBUTE);
if (builder instanceof IProjectBuilder) {
projectBuilder = (IProjectBuilder) builder;
}
this.namespaceUri = element.getDeclaringExtension().getNamespaceIdentifier();
this.id = element.getAttribute(ID_ATTRIBUTE);
this.name = element.getAttribute(NAME_ATTRIBUTE);
this.description = element.getAttribute(DESCRIPTION_ATTRIBUTE);
this.iconUri = element.getAttribute(ICON_ATTRIBUTE);
String orderString = element.getAttribute(ORDER_ATTRIBUTE);
if (StringUtils.hasText(orderString)) {
this.order = Long.valueOf(orderString);
}
else {
this.order = DEFAULT_ORDER;
}
String enabledByDefault = element.getAttribute(ENABLED_BY_DEFAULT_ATTRIBUTE);
if (enabledByDefault != null) {
setEnabledByDefault(Boolean.valueOf(enabledByDefault));
}
else {
setEnabledByDefault(true);
}
if (projectBuilder instanceof InitializingBean) {
((InitializingBean) projectBuilder).afterPropertiesSet();
}
}
@Override
protected void onEnablementChanged(boolean isEnabled, IProject project) {
cleanup(project);
}
@Override
public String toString() {
return id + " (" + projectBuilder.getClass().getName() + ")";
}
}