package com.mobilesorcery.sdk.builder.java;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.jar.Manifest;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import com.mobilesorcery.sdk.core.CapabilityFragmentation;
import com.mobilesorcery.sdk.core.CapabilityState;
import com.mobilesorcery.sdk.core.CommandLineBuilder;
import com.mobilesorcery.sdk.core.DefaultPackager;
import com.mobilesorcery.sdk.core.IBuildResult;
import com.mobilesorcery.sdk.core.IBuildSession;
import com.mobilesorcery.sdk.core.IBuildVariant;
import com.mobilesorcery.sdk.core.ICapabilities;
import com.mobilesorcery.sdk.core.ICapability;
import com.mobilesorcery.sdk.core.IFileTreeDiff;
import com.mobilesorcery.sdk.core.MoSyncBuilder;
import com.mobilesorcery.sdk.core.MoSyncProject;
import com.mobilesorcery.sdk.core.MoSyncTool;
import com.mobilesorcery.sdk.core.PackageToolPackager;
import com.mobilesorcery.sdk.core.ParameterResolver;
import com.mobilesorcery.sdk.core.ParameterResolverException;
import com.mobilesorcery.sdk.core.PropertyUtil;
import com.mobilesorcery.sdk.core.Util;
import com.mobilesorcery.sdk.profiles.IProfile;
import com.mobilesorcery.sdk.profiles.ProfileDBManager;
import com.mobilesorcery.sdk.profiles.filter.DeviceCapabilitiesFilter;
import com.mobilesorcery.sdk.ui.DefaultMessageProvider;
public class JavaPackager extends PackageToolPackager {
public final static String ID = "com.mobilesorcery.sdk.build.j2me.packager";
public JavaPackager() {
super();
}
@Override
protected void addPlatformSpecifics(MoSyncProject project,
IBuildVariant variant, CommandLineBuilder commandLine)
throws Exception {
KeystoreCertificateInfo keystoreCertInfo = null;
boolean useProjectSpecific = PropertyUtil.getBoolean(project,
PropertyInitializer.JAVAME_PROJECT_SPECIFIC_KEYS);
boolean doSign = useProjectSpecific ? PropertyUtil.getBoolean(project,
PropertyInitializer.JAVAME_DO_SIGN) : Activator.getDefault()
.getPreferenceStore()
.getBoolean(PropertyInitializer.JAVAME_DO_SIGN);
ParameterResolver resolver = MoSyncBuilder.createParameterResolver(project, variant);
if (doSign) {
keystoreCertInfo = KeystoreCertificateInfo.loadOne(
PropertyInitializer.JAVAME_KEYSTORE_CERT_INFOS,
PropertyInitializer.JAVAME_PROJECT_SPECIFIC_KEYS, project,
Activator.getDefault().getPreferenceStore());
if (keystoreCertInfo == null
|| !DefaultMessageProvider.isEmpty(keystoreCertInfo
.validate(false, resolver))) {
throw new CoreException(new Status(IStatus.OK,
Activator.PLUGIN_ID, keystoreCertInfo.validate(false, resolver)
.getMessage()));
}
}
if (keystoreCertInfo != null) {
String keystore = Util.replace(keystoreCertInfo.getKeystoreLocation(), resolver);
String alias = keystoreCertInfo.getAlias();
String storepass = keystoreCertInfo.getKeystorePassword();
String keypass = keystoreCertInfo.getKeyPassword();
commandLine.flag("--javame-keystore").with(keystore);
commandLine.flag("--javame-storepass", true).with(storepass);
commandLine.flag("--javame-alias").with(alias);
commandLine.flag("--javame-keypass", true).with(keypass);
}
}
@Override
public void createPackage(MoSyncProject project, IBuildSession session,
IBuildVariant variant, IFileTreeDiff diff, IBuildResult buildResult)
throws CoreException {
super.createPackage(project, session, variant, diff, buildResult);
FileInputStream mdStream = null;
try {
// We can remove this once we are sure we produce correct manifests.
DefaultPackager intern = new DefaultPackager(project, variant);
File mfFile = new File(
intern.get(DefaultPackager.PACKAGE_OUTPUT_DIR),
"META-INF/MANIFEST.MF");
mdStream = new FileInputStream(mfFile);
Manifest mf = new Manifest();
mf.read(mdStream);
} catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR,
Activator.PLUGIN_ID,
"Internal error: could not create manifest", e));
} finally {
Util.safeClose(mdStream);
}
}
@Override
protected Map<String, List<File>> computeBuildResult(MoSyncProject project,
IBuildVariant variant) throws ParameterResolverException {
File jar = getProducedJar(project, variant);
File jad = new File(Util.replaceExtension(jar.getAbsolutePath(), "jad"));
HashMap<String, List<File>> result = new HashMap<String, List<File>>();
result.put(IBuildResult.MAIN, Arrays.asList(jar));
result.put(Activator.JAD, Arrays.asList(jad));
return result;
}
protected File getProducedJar(MoSyncProject project, IBuildVariant variant) throws ParameterResolverException {
DefaultPackager intern = new DefaultPackager(project, variant);
return new File(intern.get(DefaultPackager.PACKAGE_OUTPUT_DIR),
intern.get(DefaultPackager.APP_NAME) + ".jar");
}
@Override
public String getShortDescription(MoSyncProject project, IProfile profile) {
if (getClass() == JavaPackager.class
&& profile.getProfileType() == MoSyncTool.DEFAULT_PROFILE_TYPE) {
ArrayList<Object> result = new ArrayList<Object>();
ICapabilities caps = ProfileDBManager.getInstance()
.getCapabilities(profile);
DeviceCapabilitiesFilter filter = DeviceCapabilitiesFilter.extractFilterFromProject(project);
if (caps != null && filter != null) {
ICapability cldc = caps.getCapability("CLDC");
if (cldc != null) {
result.add("CLDC " + cldc.getValue());
}
ICapability iconSize = caps.getCapability("IconSize");
if (iconSize != null) {
result.add(iconSize.getValue());
}
Set<ICapability> deviceCapabilities = caps.listCapabilities();
for (ICapability cap : deviceCapabilities) {
String name = cap.getName();
if (cap.getState() == CapabilityState.REQUIRES_PERMISSION
|| cap.getState() == CapabilityState.REQUIRES_PRIVILEGED_PERMISSION
&& cap.getFragmentation() == CapabilityFragmentation.BUILDTIME) {
if (filter.getRequiredCapabilities().contains(name) ||
filter.getOptionalCapabilities().contains(name)) {
result.add(cap.getName());
}
}
}
}
if (result.size() > 0) {
return Util.join(result.toArray(), ", ");
}
}
return super.getShortDescription(project, profile);
}
}