package com.mobilesorcery.sdk.core.build;
import java.io.IOException;
import java.text.MessageFormat;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.IMemento;
import com.mobilesorcery.sdk.core.BuildResult;
import com.mobilesorcery.sdk.core.CoreMoSyncPlugin;
import com.mobilesorcery.sdk.core.IBuildResult;
import com.mobilesorcery.sdk.core.IBuildSession;
import com.mobilesorcery.sdk.core.IBuildState;
import com.mobilesorcery.sdk.core.IBuildVariant;
import com.mobilesorcery.sdk.core.IFileTreeDiff;
import com.mobilesorcery.sdk.core.IFilter;
import com.mobilesorcery.sdk.core.IPackager;
import com.mobilesorcery.sdk.core.IProcessConsole;
import com.mobilesorcery.sdk.core.IPropertyOwner;
import com.mobilesorcery.sdk.core.MoSyncBuilder;
import com.mobilesorcery.sdk.core.MoSyncProject;
import com.mobilesorcery.sdk.core.MoSyncTool;
import com.mobilesorcery.sdk.core.PropertyUtil;
import com.mobilesorcery.sdk.core.LineReader.ILineHandler;
import com.mobilesorcery.sdk.core.Util;
import com.mobilesorcery.sdk.internal.PipeTool;
import com.mobilesorcery.sdk.profiles.IProfile;
import com.mobilesorcery.sdk.profiles.Profile;
public class PackBuildStep extends AbstractBuildStep {
public static class Factory extends AbstractBuildStepFactory {
@Override
public IBuildStep create() {
return new PackBuildStep();
}
@Override
public String getId() {
return ID;
}
@Override
public String getName() {
return "Package";
}
}
public static final String ID = "pack";
public PackBuildStep() {
setId(ID);
setName("Pack");
}
@Override
public int incrementalBuild(MoSyncProject mosyncProject, IBuildSession session,
IBuildVariant variant, IFileTreeDiff diff,
IBuildResult buildResult, IProgressMonitor monitor) throws Exception {
IProcessConsole console = getConsole();
IProfile targetProfile = variant.getProfile();
// Special hack for MoRe (I don't think this is how it should work though.)
if (targetProfile.isEmulator() && buildResult.getBuildResult().get(IBuildResult.MAIN) == null) {
buildResult.setBuildResult(IBuildResult.MAIN, buildResult.getIntermediateBuildResult(LinkBuildStep.ID));
} else {
monitor.setTaskName(MessageFormat.format("Packaging for {0}", targetProfile));
IPackager packager = targetProfile.getPackager();
packager.createPackage(mosyncProject, session, variant, diff, buildResult);
}
if (buildResult.getBuildResult() == null || !BuildResult.exists(buildResult.getBuildResult())) {
if (buildResult.getBuildResult() != null) {
CoreMoSyncPlugin.getDefault().getLog().log(new Status(IStatus.WARNING, CoreMoSyncPlugin.PLUGIN_ID,
MessageFormat.format("Expected build result at {0}, but did not find it", buildResult.getBuildResult())));
}
throw new IOException(MessageFormat.format("Failed to create package for {0}", targetProfile));
} else {
console.addMessage(MessageFormat.format("Created package for profile {0}:\n\t{1}",
MoSyncTool.toString(targetProfile),
Util.join(buildResult.getBuildResult().values().toArray(), "\n\t")));
}
return CONTINUE;
}
@Override
public boolean shouldBuild(MoSyncProject project, IBuildSession session, IBuildResult buildResult) {
return super.shouldBuild(project, session, buildResult) && !MoSyncBuilder.isLib(project) && !MoSyncBuilder.isExtension(project);
}
@Override
public boolean shouldAdd(IBuildSession session) {
return session.doPack();
}
@Override
public String[] getDependees() {
return new String[] { };
}
}