/* 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.FileInputStream; import java.io.IOException; import java.text.MessageFormat; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import com.mobilesorcery.sdk.core.CoreMoSyncPlugin; import com.mobilesorcery.sdk.core.IPropertyOwner; import com.mobilesorcery.sdk.core.MoSyncProject; import com.mobilesorcery.sdk.core.MoSyncProjectParameterResolver; import com.mobilesorcery.sdk.core.ParameterResolverException; import com.mobilesorcery.sdk.core.Util; import com.mobilesorcery.sdk.profiles.filter.DeviceCapabilitiesFilter; public class ProjectTemplate { /** * The default project template type. **/ public static final String DEFAULT_TYPE = "default"; private final ProjectTemplateDescription desc; private final File templateRoot; public ProjectTemplate(File templateRoot, ProjectTemplateDescription desc) { // TODO: Should support not only file base templates!? this.templateRoot = templateRoot; this.desc = desc; } public String getId() { return desc.getId(); } public String getName() { return desc.getName(); } public String getDescription() { return desc.getDescriptionText(); } public String getType() { return desc.getType(); } public Set<String> getRequiredCapabilities() { return desc.getRequiredCapabilities(); } public String validate() { if (getId() == null) { return missingAttr("id"); //$NON-NLS-1$ } if (getName() == null) { return missingAttr("name"); //$NON-NLS-1$ } if (!templateRoot.isDirectory() || !templateRoot.exists()) { return Messages.ProjectTemplate_InvalidTemplateRoot; } return null; } private String missingAttr(String attr) { return MessageFormat.format(Messages.ProjectTemplate_InvalidTemplate_0, attr); } /** * Initializes a project (it has to exist and be open); creates a set of files * and sets any specific settings * @param monitor * @param mosyncProject * @return * @throws CoreException */ public IFile initializeProject(IProgressMonitor monitor, MoSyncProject mosyncProject) throws CoreException { IProject project = mosyncProject.getWrappedProject(); if (!project.exists()) { throw new CoreException(new Status(IStatus.ERROR, CoreMoSyncPlugin.PLUGIN_ID, Messages.ProjectTemplate_ProjectInitFailed_0)); } if (!project.isOpen()) { throw new CoreException(new Status(IStatus.ERROR, CoreMoSyncPlugin.PLUGIN_ID, Messages.ProjectTemplate_ProjectInitFailed_1)); } MoSyncProjectParameterResolver resolver = MoSyncProjectParameterResolver.create(mosyncProject, null); List<String> templateFiles = desc.getTemplateFiles(); List<String> generatedFiles = desc.getGeneratedFiles(); String generatedFile = ""; for (int i = 0; i < templateFiles.size(); i++) { String templateFile = templateFiles.get(i); try { generatedFile = Util.replace(generatedFiles.get(i), resolver); } catch (ParameterResolverException e) { throw new CoreException(new Status(IStatus.ERROR, CoreMoSyncPlugin.PLUGIN_ID, "Could not init project", e)); } IFile file = project.getFile(new Path(generatedFile)); FileInputStream fis = null; try { File templateFileLocation = new File(templateRoot, templateFile); fis = new FileInputStream(templateFileLocation); mkParents(file); file.create(fis, true, new SubProgressMonitor(monitor, 1)); } catch (IOException e) { throw new CoreException(new Status(IStatus.ERROR, CoreMoSyncPlugin.PLUGIN_ID, Messages.ProjectTemplate_ProjectInitFailed_2, e)); } finally { Util.safeClose(fis); } } Map<String, String> settings = desc.getSettings(); if (settings != null) { mosyncProject.setProperties(settings); } Set<String> requiredCapabilities = desc.getRequiredCapabilities(); if (requiredCapabilities != null) { DeviceCapabilitiesFilter newFilter = DeviceCapabilitiesFilter.create( requiredCapabilities.toArray(new String[0]), new String[0]); DeviceCapabilitiesFilter.setFilter(mosyncProject, newFilter); } mosyncProject.setProperty(MoSyncProject.TEMPLATE_ID, getId()); if (generatedFiles.size() > 0) { return project.getFile(new Path(generatedFile)); } return null; } public Map<String, String> getSettings() { return desc.getSettings(); } private void mkParents(IResource resource) throws CoreException { IContainer parent = resource.getParent(); if (!parent.exists() && parent != null) { mkParents(parent); if (parent.getType() == IResource.FOLDER) { ((IFolder) parent).create(true, true, new NullProgressMonitor()); } } } }