package com.redhat.ceylon.tools.classpath;
import java.io.File;
import java.util.SortedSet;
import com.redhat.ceylon.cmr.api.ModuleQuery;
import com.redhat.ceylon.common.ModuleUtil;
import com.redhat.ceylon.common.Versions;
import com.redhat.ceylon.common.tool.Argument;
import com.redhat.ceylon.common.tool.Description;
import com.redhat.ceylon.common.tool.Option;
import com.redhat.ceylon.common.tool.Summary;
import com.redhat.ceylon.common.tools.CeylonTool;
import com.redhat.ceylon.model.cmr.ArtifactResult;
import com.redhat.ceylon.tools.moduleloading.ModuleLoadingTool;
@Summary("Prints a classpath suitable for passing to Java tools to run a given Ceylon module")
@Description("Will print a classpath for a given Ceylon module, suitable for use with Java tools to " +
"run a given Ceylon module outside of the regular JBoss Modules container used in `ceylon run`.")
public class CeylonClasspathTool extends ModuleLoadingTool {
private String moduleNameOptVersion;
private boolean force;
@Argument(argumentName="module", multiplicity = "1")
public void setModule(String module) {
this.moduleNameOptVersion = module;
}
@Option(longName="force")
@Description("Force generation of classpath with multiple versions of the same module.")
public void setForce(boolean force) {
this.force = force;
}
@Override
public void run() throws Exception {
String module = ModuleUtil.moduleName(moduleNameOptVersion);
String version = checkModuleVersionsOrShowSuggestions(
getRepositoryManager(),
module,
ModuleUtil.moduleVersion(moduleNameOptVersion),
ModuleQuery.Type.JVM,
Versions.JVM_BINARY_MAJOR_VERSION,
Versions.JVM_BINARY_MINOR_VERSION,
null);
if(version == null)
return;
loadModule(module, version);
if(!force)
errorOnConflictingModule(module, version);
boolean once = true;
for(ArtifactResult entry : this.loadedModules.values()){
// since we even add missing modules there to avoid seeing them twice, let's skip them now
if(entry == null)
continue;
File file = entry.artifact();
if(file == null)
continue;
// on duplicate, let's only keep the last version
SortedSet<String> versions = loadedModuleVersions.get(entry.name());
if(version != null && !versions.isEmpty() && entry.version() != null && !entry.version().equals(versions.last()))
continue;
if(once)
once = false;
else
append(File.pathSeparator);
append(file.getAbsolutePath());
}
flush();
}
@Override
public void initialize(CeylonTool mainTool) throws Exception {
}
}