/* Copyright (C) 2009 Mobile Sorcery AB This program is free software; you can redistribute it and/or modify it under the terms of the Eclipse Public License v1.0. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License v1.0 for more details. You should have received a copy of the Eclipse Public License v1.0 along with this program. It is also available at http://www.eclipse.org/legal/epl-v10.html */ package com.mobilesorcery.sdk.core.templates; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.TreeMap; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; import com.mobilesorcery.sdk.core.CoreMoSyncPlugin; import com.mobilesorcery.sdk.core.MoSyncTool; import com.mobilesorcery.sdk.core.Util; import com.mobilesorcery.sdk.core.launch.IEmulatorLauncher; import com.mobilesorcery.sdk.core.templates.ITemplate; import com.mobilesorcery.sdk.core.templates.ProjectTemplate; import com.mobilesorcery.sdk.core.templates.ProjectTemplateDescription; import com.mobilesorcery.sdk.core.templates.Template; /** * The activator class controls the plug-in life cycle */ public class TemplateManager { public static final String RESOURCE_TEMPLATE_ID = "template.resource"; // The shared instance private static TemplateManager INSTANCE; private final TreeMap<String, ITemplate> templates = new TreeMap<String, ITemplate>(); private final TreeMap<String, ProjectTemplate> projectTemplates = new TreeMap<String, ProjectTemplate>(); private TreeMap<String, IProjectTemplateExtension> extensions = null; public final static synchronized TemplateManager getDefault() { if (INSTANCE == null) { INSTANCE = new TemplateManager(); } return INSTANCE; } /** * The constructor */ private TemplateManager() { initTemplates(); } private void initTemplates() { IPath templateDir = MoSyncTool.getDefault().getTemplatesPath(); File[] subdirs = templateDir.toFile().listFiles(); for (int i = 0; i < subdirs.length; i++) { File subdir = subdirs[i]; if (subdir.isDirectory()) { File descFile = new File(subdir, "project.desc"); if (descFile.exists()) { try { ProjectTemplateDescription desc = ProjectTemplateDescription.parse(descFile); ProjectTemplate template = new ProjectTemplate(subdir, desc); String validationResult = template.validate(); if (validationResult == null) { addProjectTemplate(template); } else { // Just to end up in the catch clause. throw new IOException("Invalid template: " + validationResult); } } catch (IOException e) { CoreMoSyncPlugin.getDefault().log(e); } } } } addTemplate(new Template(RESOURCE_TEMPLATE_ID, "Resource File", "New Resource File", getClass().getResource("/templates/resources.lstx.template"), "Resources/resource.lstx", null)); } private void addProjectTemplate(ProjectTemplate template) { projectTemplates.put(template.getId(), template); } private void addTemplate(ITemplate template) { // We'll keep these for a while - but we should really really try to incorporate it // in the CDT code templates list. templates.put(template.getId(), template); } public List<ProjectTemplate> getProjectTemplates(String type) { ArrayList<ProjectTemplate> result = new ArrayList<ProjectTemplate>(); for (ProjectTemplate projectTemplate : projectTemplates.values()) { if (Util.equals(type, projectTemplate.getType())) { result.add(projectTemplate); } } return result; } public IProjectTemplateExtension getExtensionForType(String type) { if (extensions == null) { extensions = new TreeMap<String, IProjectTemplateExtension>(); IConfigurationElement[] extensionCfgs = Platform.getExtensionRegistry().getConfigurationElementsFor(ProjectTemplateExtension.EXTENSION_POINT_ID); for (IConfigurationElement extensionCfg : extensionCfgs) { ProjectTemplateExtension extensionImpl = new ProjectTemplateExtension(extensionCfg); String extensionType = extensionImpl.getType(); extensions.put(extensionType, extensionImpl); } } return extensions.get(type); } public Collection<String> getTemplateTypes() { HashSet<String> result = new HashSet<String>(); for (ProjectTemplate projectTemplate : projectTemplates.values()) { result.add(projectTemplate.getType()); } return result; } public ITemplate getTemplate(String id) { return templates.get(id); } public ProjectTemplate getProjectTemplate(String id) { return projectTemplates.get(id); } }