package org.springframework.roo.addon.cloud.foundry.converter;
import java.io.File;
import java.util.ArrayList;
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.addon.cloud.foundry.CloudFoundrySession;
import org.springframework.roo.addon.cloud.foundry.model.CloudFile;
import org.springframework.roo.shell.Completion;
import org.springframework.roo.shell.Converter;
import org.springframework.roo.shell.MethodTarget;
/**
* Provides conversion to and from Cloud Foundry model classes.
*
* @author James Tyrrell
* @author Andrew Swan
* @since 1.2.0
*/
@Component
@Service
public class CloudFileConverter implements Converter<CloudFile> {
@Reference private CloudFoundrySession session;
public CloudFile convertFromText(final String value,
final Class<?> requiredType, final String optionContext) {
if (StringUtils.isBlank(value)) {
return null;
}
return new CloudFile(value);
}
public boolean getAllPossibleValues(final List<Completion> completions,
final Class<?> requiredType, final String existingData,
final String optionContext, final MethodTarget target) {
final String appName = ConverterUtils.getOptionValue("appName",
target.getRemainingBuffer());
String path = ConverterUtils.getOptionValue("path",
target.getRemainingBuffer());
if (path != null) {
final int index = path.lastIndexOf(/* "/" */File.separator);
if (index > 0) {
path = path.substring(0, index + 1);
}
else {
path = null;
}
}
try {
final String file = session.getClient().getFile(appName, 1, path);
final List<String> options = getFileOptions(file);
for (final String option : options) {
if (path == null) {
path = "";
}
completions.add(new Completion(path + option));
}
}
catch (final Exception ignored) {
}
return false;
}
private List<String> getFileOptions(final String files) {
final String[] lines = files.split("\n");
final List<String> options = new ArrayList<String>();
for (final String line : lines) {
final int index = line.indexOf(" ");
if (index > 0) {
options.add(line.substring(0, index));
}
}
return options;
}
public boolean supports(final Class<?> requiredType,
final String optionContext) {
return CloudFile.class.isAssignableFrom(requiredType);
}
}