package com.mobilesorcery.sdk.core.build; import java.io.File; import java.text.MessageFormat; import java.util.List; import java.util.Map; import java.util.SortedSet; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.ui.IMemento; import com.mobilesorcery.sdk.core.IBuildConfiguration; 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.MoSyncBuilder; import com.mobilesorcery.sdk.core.MoSyncProject; import com.mobilesorcery.sdk.core.MoSyncTool; import com.mobilesorcery.sdk.core.Util; import com.mobilesorcery.sdk.core.build.CopyBuildResultBuildStep.Factory; public class CopyBuildResultBuildStep extends AbstractBuildStep { public static class Factory extends AbstractBuildStepFactory { private final static String DEFAULT_FOLDER_NAME = "ReleasePackages"; private String folderName; private String cfgId; private Boolean isActive; @Override public IBuildStep create() { return new CopyBuildResultBuildStep(this); } @Override public String getId() { return ID; } @Override public String getName() { return MessageFormat.format("Copy to {0}", getFolderName()); } public String getFolderName() { return folderName == null ? DEFAULT_FOLDER_NAME : folderName; } public void setFolderName(String folderName) { this.folderName = folderName; } public String getConfigurationId() { return cfgId; } public void setConfigurationId(String cfgId) { this.cfgId = cfgId; } public boolean isActive() { return isActive == null || isActive; } public void setActive(boolean isActive) { this.isActive = isActive; } @Override public boolean isDefault() { return isActive() && cfgId == null && folderName == null; } @Override public void load(IMemento memento) { cfgId = memento.getString("cfg"); folderName = memento.getString("folder"); isActive = memento.getBoolean("active"); } @Override public void store(IMemento memento) { if (cfgId != null) { memento.putString("cfg", cfgId); } if (folderName != null) { memento.putString("folder", folderName); } if (isActive != null) { memento.putBoolean("active", isActive); } } } public static String ID = "copy.build.results"; private final Factory prototype; public CopyBuildResultBuildStep(Factory prototype) { this.prototype = prototype; setName(prototype.getName()); } @Override public boolean shouldAdd(IBuildSession session) { return session.doPack(); } @Override public int incrementalBuild(MoSyncProject project, IBuildSession session, IBuildVariant variant, IFileTreeDiff diff, IBuildResult result, IProgressMonitor monitor) throws Exception { if (diff == null || !diff.isEmpty()) { if (prototype.isActive()) { String cfgId = getReleasePackageCfgId(project); if (configMatches(project, variant)) { IPath outputFolder = project.getWrappedProject() .getLocation().append(prototype.getFolderName()); String cfgFolder = getCfgFolder(project, variant); if (cfgFolder != null) { outputFolder = outputFolder.append(cfgFolder); } outputFolder = outputFolder.append(MoSyncTool .toString(variant.getProfile())); Map<String, List<File>> buildArtifacts = result .getBuildResult(); if (!buildArtifacts.isEmpty()) { getConsole().addMessage( "Copied to release package folder:"); } for (Map.Entry<String, List<File>> buildArtifact : buildArtifacts .entrySet()) { for (File file : buildArtifact.getValue()) { File dest = outputFolder.append(file.getName()) .toFile(); Util.copy(new NullProgressMonitor(), file, dest, null); getConsole().addMessage("\t" + dest.getAbsolutePath()); } } IFolder toRefresh = project.getWrappedProject().getFolder( prototype.getFolderName()); MoSyncBuilder.ensureFolderIsMarkedDerived(toRefresh); MoSyncBuilder.refresh(toRefresh); } else { getConsole() .addMessage( MessageFormat .format("NOTE: This package was not copied the release package folder. Only builds for configuration {0} will be copied", cfgId)); } } } return IBuildStep.CONTINUE; } private String getCfgFolder(MoSyncProject project, IBuildVariant variant) { String cfgId = variant.getConfigurationId(); return getReleasePackageCfgId(project) == null ? cfgId : null; } private String getReleasePackageCfgId(MoSyncProject project) { String releasePackageCfgId = prototype.getConfigurationId(); /* * if (releasePackageCfgId == null) { // Fallback. SortedSet<String> * cfgs = project * .getBuildConfigurationsOfType(IBuildConfiguration.RELEASE_TYPE); if * (!cfgs.isEmpty()) { releasePackageCfgId = cfgs.first(); } } */ return releasePackageCfgId; } private boolean configMatches(MoSyncProject project, IBuildVariant variant) { String cfgId = variant.getConfigurationId(); String cfgToBuild = getReleasePackageCfgId(project); return cfgToBuild == null || Util.equals(cfgId, cfgToBuild); } }