/* 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; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.mobilesorcery.sdk.profiles.IProfile; import com.mobilesorcery.sdk.profiles.Profile; /** * A 'default' packager, with an appropriate set of convenience methods. * * @author Mattias Bybro, mattias@bybro.com/mattias.bybro@purplescout.se * */ public class DefaultPackager extends ParameterResolver { public final static String APP_VENDOR_NAME_BUILD_PROP = MoSyncBuilder.BUILD_PREFS_PREFIX + "app.vendor"; public final static String MOSYNC_HOME = "mosync-home"; public final static String MOSYNC_BIN = "mosync-bin"; public final static String RUNTIME_DIR = "runtime-dir"; public final static String PROJECT_NAME = "project-name"; public final static String OUTPUT_DIR = "output-dir"; public final static String FINAL_OUTPUT_DIR = "final-output-dir"; public static final String COMPILE_OUTPUT_DIR = "compile-output-dir"; public static final String PACKAGE_OUTPUT_DIR = "package-output-dir"; public static final String APP_VERSION_MAJOR = "version-major"; public static final String APP_VERSION_MINOR = "version-minor"; public static final String APP_VERSION_MICRO = "version-micro"; public final static String RUNTIME_ID = "runtime-id"; public final static String PLATFORM_FAMILY = "platform-family"; public final static String PLATFORM_VARIANT = "platform-variant"; /** * The name of the device vendor (not the same as app vendor) */ public final static String VENDOR_NAME = "vendor"; /** * The name of the application vendor/publisher */ public final static String APP_VENDOR_NAME = "app-vendor"; public final static String APP_NAME = "app-name"; public final static String APP_VERSION = "app-version"; /** * The name of the profile * @see IProfile */ public final static String PROFILE_NAME = "profile"; private static final String PROGRAM_OUTPUT = "program-output"; private static final String RESOURCE_OUTPUT = "resource-output"; private static final String PROGRAMCOMB_OUTPUT = "programcomb-output"; private final MoSyncProject project; private CommandLineExecutor executor; private final IBuildVariant variant; private final Map<String, String> defaultParameters = new HashMap<String, String>(); private final Map<String, String> userParameters = new HashMap<String, String>(); private final CascadingProperties parameters; public DefaultPackager(MoSyncProject project, IBuildVariant variant) { parameters = new CascadingProperties(new Map[] { defaultParameters, userParameters }); this.project = project; this.variant = variant; setDefaultParameters(); initCommandLineExecutor(project); } public void setParameter(String param, String value) { userParameters.put(param, value); } public void setDefaultParameters() { initVersionParameters(); defaultParameters.put(MOSYNC_HOME, MoSyncTool.getDefault().getMoSyncHome().toOSString()); defaultParameters.put(MOSYNC_BIN, MoSyncTool.getDefault().getMoSyncBin().toOSString()); IProfile targetProfile = variant.getProfile(); if (targetProfile == null) { targetProfile = project.getTargetProfile(); } if (targetProfile == null) { return; } // TODO: Do not repeat these parameter keys, just strip namespaces by default (and in case of collision ask for namespace) defaultParameters.put(PROFILE_NAME, targetProfile.getName()); defaultParameters.put(APP_VENDOR_NAME, getProjectProperties().getProperty(APP_VENDOR_NAME_BUILD_PROP)); defaultParameters.put(APP_NAME, getProjectProperties().getProperty(MoSyncBuilder.APP_NAME)); defaultParameters.put(VENDOR_NAME, targetProfile.getVendor().getName()); defaultParameters.put(RUNTIME_DIR, MoSyncTool.getDefault().getRuntimePath(targetProfile).toOSString()); defaultParameters.put(PROJECT_NAME, project.getName()); defaultParameters.put(RUNTIME_ID, Profile.getAbbreviatedPlatform(targetProfile)); defaultParameters.put(PLATFORM_FAMILY, Util.toIdentifier(targetProfile.getVendor().getName())); defaultParameters.put(PLATFORM_VARIANT, Util.toIdentifier(MoSyncTool.toString(targetProfile))); defaultParameters.put(COMPILE_OUTPUT_DIR, MoSyncBuilder.getOutputPath(project.getWrappedProject(), variant).toOSString()); defaultParameters.put(PROGRAM_OUTPUT, MoSyncBuilder.getProgramOutputPath(project.getWrappedProject(), variant).toOSString()); defaultParameters.put(RESOURCE_OUTPUT, MoSyncBuilder.getResourceOutputPath(project.getWrappedProject(), variant).toOSString()); defaultParameters.put(PROGRAMCOMB_OUTPUT, MoSyncBuilder.getProgramCombOutputPath(project.getWrappedProject(), variant).toOSString()); defaultParameters.put(PACKAGE_OUTPUT_DIR, MoSyncBuilder.getPackageOutputPath(project.getWrappedProject(), variant).toOSString()); } private void initVersionParameters() { Version version = new Version(getProjectProperties().getProperty(MoSyncBuilder.PROJECT_VERSION)); defaultParameters.put(APP_VERSION, version.toString()); defaultParameters.put(APP_VERSION_MAJOR, Integer.toString(version.getMajor() == Version.UNDEFINED ? 0 : version.getMajor())); defaultParameters.put(APP_VERSION_MINOR, Integer.toString(version.getMinor() == Version.UNDEFINED ? 0 : version.getMinor())); defaultParameters.put(APP_VERSION_MICRO, Integer.toString(version.getMicro() == Version.UNDEFINED ? 0 : version.getMicro())); } public CascadingProperties getParameters() { return parameters; } protected void initCommandLineExecutor(MoSyncProject project) { setDefaultParameters(); if (executor == null) { executor = new CommandLineExecutor(MoSyncBuilder.CONSOLE_ID); executor.setParameters(parameters); executor.setExecutionDirectory(project.getWrappedProject().getLocation().toOSString()); } } public CommandLineExecutor getExecutor() { initCommandLineExecutor(project); return executor; } public int runCommandLine(HashMap<String, String> env, String[] commandLine, String consoleMsg) throws IOException { return getExecutor().runCommandLine(env, commandLine, consoleMsg); } public int runCommandLine(String... commandLine) throws IOException { return getExecutor().runCommandLine(commandLine); } public int runCommandLine(String[] commandLine, String consoleMsg) throws IOException { return getExecutor().runCommandLine(commandLine, consoleMsg); } public int runCommandLineWithRes ( String... commandLine ) throws IOException { return getExecutor().runCommandLineWithRes( commandLine ); } public void mkdirs(String path) { String resolvedPath = this.resolve(path); new File(resolvedPath).mkdirs(); } public IProcessConsole getConsole() { return getExecutor().createConsole(); } public String resolve(String path) { return CommandLineExecutor.replace(path, parameters).replace('\\', File.separatorChar).replace('/', File.separatorChar); } public static void writeFile(File file, String contents) throws IOException { FileWriter output = new FileWriter(file); try { output.write(contents); } finally { if (output != null) { output.close(); } } } public void setParameters(Map<String, String> userParameters) { this.userParameters.putAll(userParameters); } public IPropertyOwner getProjectProperties() { return MoSyncBuilder.getPropertyOwner(project, variant.getConfigurationId()); } public File resolveFile(String path) { return new File(resolve(path)); } @Override public String get(String key) throws ParameterResolverException { String result = parameters.get(key); return result; } @Override public List<String> listPrefixes() { return new ArrayList<String>(parameters.keySet()); } }