package org.springframework.roo.project.converter;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.springframework.roo.project.ProjectOperations;
import org.springframework.roo.project.maven.Pom;
import org.springframework.roo.shell.Completion;
import org.springframework.roo.shell.Converter;
import org.springframework.roo.shell.MethodTarget;
@Component
@Service
public class PomConverter implements Converter<Pom> {
/**
* An option context value indicating that the currently focused module
* should be included when this {@link Converter} generates completions.
*/
public static final String INCLUDE_CURRENT_MODULE = "includeCurrent";
static final String ROOT_MODULE_SYMBOL = "~";
@Reference ProjectOperations projectOperations;
private void addCompletion(final String moduleName,
final List<Completion> completions) {
final String nonEmptyModuleName = StringUtils.defaultIfEmpty(
moduleName, ROOT_MODULE_SYMBOL);
completions.add(new Completion(nonEmptyModuleName));
}
public Pom convertFromText(final String value, final Class<?> targetType,
final String optionContext) {
final String moduleName;
if (ROOT_MODULE_SYMBOL.equals(value)) {
moduleName = "";
}
else {
moduleName = value;
}
return projectOperations.getPomFromModuleName(moduleName);
}
public boolean getAllPossibleValues(final List<Completion> completions,
final Class<?> targetType, final String existingData,
final String optionContext, final MethodTarget target) {
final String focusedModuleName = projectOperations
.getFocusedModuleName();
for (final String moduleName : projectOperations.getModuleNames()) {
if (isModuleRelevant(moduleName, focusedModuleName, optionContext)) {
addCompletion(moduleName, completions);
}
}
return true;
}
private boolean isModuleRelevant(final String moduleName,
final String focusedModuleName, final String optionContext) {
return StringUtils.contains(optionContext, INCLUDE_CURRENT_MODULE)
|| !moduleName.equals(focusedModuleName);
}
public boolean supports(final Class<?> type, final String optionContext) {
return Pom.class.isAssignableFrom(type);
}
}