package com.mobilesorcery.sdk.core.build; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.ui.IMemento; import com.mobilesorcery.sdk.core.BuildResult; import com.mobilesorcery.sdk.core.CommandLineExecutor; import com.mobilesorcery.sdk.core.CoreMoSyncPlugin; import com.mobilesorcery.sdk.core.IBuildResult; import com.mobilesorcery.sdk.core.IBuildSession; import com.mobilesorcery.sdk.core.IBuildVariant; import com.mobilesorcery.sdk.core.IFileTreeDiff; 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.Util; import com.mobilesorcery.sdk.core.LineReader.ILineHandler; import com.mobilesorcery.sdk.core.build.BundleBuildStep.Factory; import com.mobilesorcery.sdk.internal.builder.IncrementalBuilderVisitor; import com.mobilesorcery.sdk.internal.dependencies.DependencyManager; public class BundleBuildStep extends CommandLineBuildStep { public final static String ID = "bundle"; public static class Factory extends CommandLineBuildStep.Factory { private String inFile; private String outFile; @Override public String getId() { return BundleBuildStep.ID; } @Override public IBuildStep create() { return new BundleBuildStep(this); } public void setInFile(String inFile) { this.inFile = inFile; } public String getInFile() { return inFile; } public void setOutFile(String outFile) { this.outFile = outFile; } public String getOutFile() { return outFile; } @Override public Script getScript() { Script script = new Script(new String[][] {{ "%mosync-bin%/Bundle", "-in", inFile, "-out", outFile }}); return script; } @Override public boolean shouldRunPerFile() { return false; } @Override public void load(IMemento memento) { IMemento command = memento.getChild("bundle"); if (command != null) { this.inFile = command.getString("inFile"); this.outFile = command.getString("outFile"); this.name = command.getString("name"); Boolean failOnError = command.getBoolean("foe"); this.failOnError = failOnError == null ? false : failOnError; } } @Override public void store(IMemento memento) { IMemento command = memento.createChild("bundle"); command.putString("inFile", inFile); command.putString("outFile", outFile); command.putBoolean("foe", failOnError); command.putString("name", name); } @Override public boolean requiresPrivilegedAccess() { return false; } } private final Factory factory; public BundleBuildStep(Factory prototype) { super(prototype); this.factory = prototype; } @Override public int incrementalBuild(MoSyncProject project, IBuildSession session, IBuildVariant variant, IFileTreeDiff diff, IBuildResult buildResult, IProgressMonitor monitor) throws Exception { final File inFile = new File(Util.replace(factory.inFile, getParameterResolver())); final File outFile = new File(Util.replace(factory.outFile, getParameterResolver())); IncrementalBuilderVisitor visitor = new IncrementalBuilderVisitor() { @Override public boolean doesAffectBuild(IResource resource) { return super.doesAffectBuild(resource) && Util.isParent(inFile, resource.getLocation().toFile()); } }; // TODO: REFACTOR! visitor.setProject(project.getWrappedProject()); visitor.setVariant(variant); visitor.setDependencyProvider(getDependencyProvider()); visitor.setConsole(getConsole()); visitor.setDiff(diff); visitor.setResourceFilter(getResourceFilter()); visitor.setParameterResolver(getParameterResolver()); visitor.visit(project.getWrappedProject()); DependencyManager<IResource> deps = getBuildState().getDependencyManager(); deps.clearDependencies(Arrays.asList(visitor.getDeletedResources())); IFile[] correspondingResources = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(outFile.toURI()); for (IFile correspondingResource : correspondingResources) { deps.addDependencies(correspondingResource, Arrays.asList(visitor.getChangedOrAddedResources())); } Set<IResource> rebuildTheseResources = visitor.computeResourcesToRebuild(deps); if (!rebuildTheseResources.isEmpty()) { outFile.getParentFile().mkdirs(); super.incrementalBuild(project, session, variant, diff, buildResult, monitor); } return CONTINUE; } public static void bundle(File inFile, File outFile) throws IOException { CommandLineExecutor executor = new CommandLineExecutor(MoSyncBuilder.CONSOLE_ID); executor.runCommandLine(new String[] { MoSyncTool.getDefault().getBinary("Bundle").toOSString(), "-in", inFile.getAbsolutePath(), "-out", outFile.getAbsolutePath() }); } }