package org.bndtools.core.ui.wizards.shared; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Collection; import java.util.List; import java.util.Map; import org.bndtools.templating.Resource; import org.bndtools.templating.ResourceMap; import org.bndtools.templating.Template; import org.bndtools.templating.TemplateEngine; import org.bndtools.templating.util.ObjectClassDefinitionImpl; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; import org.osgi.framework.Version; import org.osgi.service.metatype.ObjectClassDefinition; /** * Used as a bare-bones template for scenarios where no repository or workspace is available to load real templates. */ public class BuiltInTemplate implements Template { private final Bundle bundle = FrameworkUtil.getBundle(BuiltInTemplate.class); private final ResourceMap inputResources = new ResourceMap(); private final String name; private final String engineName; private final Version version = Version.parseVersion("1.0.0"); private URI helpUri = null; public BuiltInTemplate(String name, String templateEngine) { this.name = name; this.engineName = templateEngine; } @Override public String getName() { return name; } @Override public String getShortDescription() { return "built-in"; } @Override public String getCategory() { return "mmm/Bndtools"; } @Override public int getRanking() { return -1000; } @Override public Version getVersion() { return version; } @Override public ObjectClassDefinition getMetadata() throws Exception { return getMetadata(new NullProgressMonitor()); } @Override public ObjectClassDefinition getMetadata(IProgressMonitor monitor) throws Exception { return new ObjectClassDefinitionImpl(name, getShortDescription(), null); } @Override public ResourceMap generateOutputs(Map<String,List<Object>> parameters) throws Exception { return generateOutputs(parameters, new NullProgressMonitor()); } @Override public ResourceMap generateOutputs(Map<String,List<Object>> parameters, IProgressMonitor monitor) throws Exception { BundleContext context = bundle.getBundleContext(); Collection<ServiceReference<TemplateEngine>> svcRefs = context.getServiceReferences(TemplateEngine.class, String.format("(name=%s)", engineName)); if (svcRefs == null || svcRefs.isEmpty()) throw new Exception(String.format("Unable to generate built-in template '%s': no Template Engine available matching '%s'", name, engineName)); ServiceReference<TemplateEngine> svcRef = svcRefs.iterator().next(); TemplateEngine engine = context.getService(svcRef); if (engine == null) throw new Exception(String.format("Unable to generate built-in template '%s': no Template Engine available matching '%s'", name, engineName)); try { return engine.generateOutputs(inputResources, parameters, monitor); } finally { context.ungetService(svcRef); } } public void addInputResource(String path, Resource resource) { inputResources.put(path, resource); } public void setHelpPath(String path) { this.helpUri = getResourceURI(path); } @Override public URI getIcon() { return getResourceURI("icons/template_empty.gif"); } @Override public URI getHelpContent() { return helpUri; } private URI getResourceURI(String path) { URI uri = null; URL url = bundle.getResource(path); if (url != null) { try { uri = url.toURI(); } catch (URISyntaxException e) { // ignore, we'll just see a missing icon } } return uri; } @Override public void close() throws IOException { // nothing to do } }