package com.mobilesorcery.sdk.core;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
public class MoSyncProjectParameterResolver extends ParameterResolver {
//TODO: Variable support?
//TODO: Support for general split at colon
private final static String PROJECT_ROOT = "project:";
private final static String CURRENT_PROJECT = "current-project";
private final MoSyncProject project;
private final ParameterResolver fallbackResolver;
private MoSyncProjectParameterResolver(MoSyncProject project, ParameterResolver fallbackResolver) {
this.project = project;
this.fallbackResolver = fallbackResolver;
}
@Override
public String get(String key) throws ParameterResolverException {
if (CURRENT_PROJECT.equals(key)) {
return project.getWrappedProject().getLocation().toOSString();
} else if (PROJECT_ROOT.equals(getPrefix(key))) {
String projectName = getParameter(key);
IProject referencedProject = project.getWrappedProject().getWorkspace().getRoot().getProject(projectName);
if (referencedProject == null || !referencedProject.exists()) {
throw new ParameterResolverException(PROJECT_ROOT, String.format("No project with name %s", projectName));
}
return referencedProject.getLocation().toOSString();
}
return fallbackResolver == null ? null : fallbackResolver.get(key);
}
@Override
public List<String> listPrefixes() {
ArrayList<String> result = new ArrayList<String>();
if (fallbackResolver != null) {
result.addAll(fallbackResolver.listPrefixes());
}
result.add(CURRENT_PROJECT);
result.add(PROJECT_ROOT);
return result;
}
@Override
public List<String> listAvailableParameters(String prefix) {
if (PROJECT_ROOT.equals(prefix)) {
return MoSyncProject.listAllProjects();
}
return null;
}
/**
* Creates a {@link MoSyncProjectParameterResolver} for a project
* @param project
* @param variant The variant to create the resolver for, or <code>null</code>
* for the active, non-finalizing variant.
* @return
*/
public static MoSyncProjectParameterResolver create(MoSyncProject project,
IBuildVariant variant) {
if (variant == null) {
variant = MoSyncBuilder.getActiveVariant(project);
}
// We re-use the default packager; it really should NOT be here -- but hey, it works :)
return new MoSyncProjectParameterResolver(project, new DefaultPackager(project, variant));
}
}