
com.github.redsolo.vcm.commands.ReplaceTextInResourceCommand Maven / Gradle / Ivy
package com.github.redsolo.vcm.commands;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.lingala.zip4j.exception.ZipException;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParameterException;
import com.beust.jcommander.Parameters;
import com.github.redsolo.vcm.Model;
import com.github.redsolo.vcm.util.LineReader;
@Parameters(commandDescription = "Replaces any text in resource tree (component.rsc)")
public class ReplaceTextInResourceCommand extends AbstractModelCollectionCommand {
private static Logger log = Logger.getLogger(ReplaceTextInResourceCommand.class);
private Map replacementMap;
@Parameter(description = "replacement text (comma separated list of key=value pairs)", names = { "-r", "--replace" }, required=true)
private List replacementtext;
@Parameter(description = "only search and display found texst", names = { "-s", "--search-only"})
private boolean searchOnly = false;
@Override
public String getName() {
return "replace";
}
@Override
protected void validateParameters(MainConfiguration mainConfiguration) {
replacementMap = new HashMap();
for (String keyValuePair : replacementtext) {
String[] string = StringUtils.split(keyValuePair, "=");
if (string.length != 2) {
throw new ParameterException("Incorrect key value pair");
}
replacementMap.put(string[0], string[1]);
}
}
@Override
protected void executeModel(Model model) throws IOException, ZipException {
log.debug("Reading from " + model.getFile());
InputStream inputStream = model.getInputStream(Model.COMPONENT_RSC);
try {
List lines = readLinesFromModel(inputStream);
if (searchOnly) {
displayLines(lines);
} else {
if (modelNeedsToBeUpdated(lines)) {
writeLinesToModel(model, lines);
if (!skipRevisionUpdate) {
model.stepRevision();
}
}
}
} finally {
IOUtils.closeQuietly(inputStream);
}
}
private List readLinesFromModel(InputStream inputStream) throws IOException {
ArrayList lines = new ArrayList();
LineReader reader = new LineReader(new InputStreamReader(inputStream, "US-ASCII"));
String line = reader.readLine();
while (line != null) {
lines.add(line);
line = reader.readLine();
}
inputStream.close();
return lines;
}
private boolean modelNeedsToBeUpdated(List lines) {
for (String line : lines) {
if (!line.equals(extracted(line))) {
return true;
}
}
return false;
}
private void displayLines(List lines) {
for (String line : lines) {
extracted(line);
}
}
private void writeLinesToModel(Model model, List lines) throws ZipException, IOException {
OutputStream outputStream = model.getOutputStream(Model.COMPONENT_RSC);
OutputStreamWriter writer = null;
try {
writer = new OutputStreamWriter(outputStream, "US-ASCII");
for (String line : lines) {
line = extracted(line);
writer.write(line);
writer.write('\n');
}
writer.flush();
model.refresh();
} finally {
IOUtils.closeQuietly(writer);
IOUtils.closeQuietly(outputStream);
}
}
private String extracted(String line) {
for (String key : replacementMap.keySet()) {
if (line.contains(key)) {
String replacedString = StringUtils.replace(line, key, replacementMap.get(key));
log.debug(String.format("Replacing '%s' in line '%s' to '%s'", key, line, replacedString));
line = replacedString;
}
}
return line;
}
public List getReplacementtext() {
return replacementtext;
}
public void setReplacementtext(List replacementtext) {
this.replacementtext = replacementtext;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy