/*******************************************************************************
<o * Copyright (c) 2010-2014 SAP AG 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:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.core.template;
import java.text.MessageFormat;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.skalli.model.ExtensionEntityBase;
import org.eclipse.skalli.model.Project;
import org.eclipse.skalli.services.Services;
import org.eclipse.skalli.services.extension.ExtensionService;
import org.eclipse.skalli.services.extension.ExtensionServices;
import org.eclipse.skalli.services.template.ProjectTemplate;
import org.eclipse.skalli.services.template.ProjectTemplateService;
import org.osgi.service.component.ComponentConstants;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ProjectTemplateComponent implements ProjectTemplateService {
private static final Logger LOG = LoggerFactory.getLogger(ProjectTemplateComponent.class);
protected void activate(ComponentContext context) {
LOG.info(MessageFormat.format("[ProjectTemplateService] {0} : activated",
(String) context.getProperties().get(ComponentConstants.COMPONENT_NAME)));
}
protected void deactivate(ComponentContext context) {
LOG.info(MessageFormat.format("[ProjectTemplateService] {0} : deactivated",
(String) context.getProperties().get(ComponentConstants.COMPONENT_NAME)));
}
@Override
public Set<ProjectTemplate> getAllTemplates() {
return Services.getServices(ProjectTemplate.class, new TemplateComparator());
}
@Override
public ProjectTemplate getProjectTemplate(String className) {
Iterator<ProjectTemplate> templateServices = Services.getServiceIterator(ProjectTemplate.class);
while (templateServices.hasNext()) {
ProjectTemplate projectTemplate = templateServices.next();
if (projectTemplate.getClass().getName().equals(className)) {
return projectTemplate;
}
}
return new DefaultProjectTemplate();
}
@Override
public ProjectTemplate getProjectTemplateById(String id) {
Iterator<ProjectTemplate> templateServices = Services.getServiceIterator(ProjectTemplate.class);
while (templateServices.hasNext()) {
ProjectTemplate projectTemplate = templateServices.next();
if (projectTemplate.getId().equals(id)) {
return projectTemplate;
}
}
return new DefaultProjectTemplate();
}
private static class TemplateComparator implements Comparator<ProjectTemplate> {
@Override
public int compare(ProjectTemplate o1, ProjectTemplate o2) {
int result = compareBoolean(ProjectTemplate.DEFAULT_ID.equals(o1.getId()),
ProjectTemplate.DEFAULT_ID.equals(o2.getId()));
if (result == 0) {
result = o1.getDisplayName().compareTo(o2.getDisplayName());
if (result == 0) {
result = o1.getId().compareTo(o2.getId());
}
}
return result;
}
private int compareBoolean(boolean b1, boolean b2) {
if (b1) {
return b2 ? 0 : -1;
} else {
return b2 ? 1 : 0;
}
}
}
@Override
public Set<Class<? extends ExtensionEntityBase>> getSelectableExtensions(ProjectTemplate template, Project project) {
Set<Class<? extends ExtensionEntityBase>> selectableExtensions = new HashSet<Class<? extends ExtensionEntityBase>>();
if (project != null) {
for (ExtensionEntityBase extension : project.getAllExtensions()) {
selectableExtensions.add(extension.getClass());
}
}
final Set<String> included = template.getIncludedExtensions();
final Set<String> excluded = template.getExcludedExtensions();
for (ExtensionService<?> extensionService: ExtensionServices.getAll()) {
// 1) can the extension work with the given template?
// 2) if so, check if we have an exclude list and the extension is excluded
// 3) if so, reject the extensions, otherwise check if we have an include
// list and the extension is included
// 4) if so, accept it, otherwise reject it
Set<String> allowedTemplates = extensionService.getProjectTemplateIds();
if (allowedTemplates == null || allowedTemplates.contains(template.getId())) {
Class<? extends ExtensionEntityBase> extensionClass = extensionService.getExtensionClass();
String extensionClassName = extensionClass.getName();
if ( (excluded == null || !excluded.contains(extensionClassName))
&& (included == null || included.contains(extensionClassName))) {
selectableExtensions.add(extensionClass);
}
}
}
return selectableExtensions;
}
}