ExtractResource.java
package emissary.config;
import emissary.util.io.ResourceReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
/**
* This class assists users and integrators by extracting the named resource and putting it into the config directory
*/
public class ExtractResource {
/** Our logger */
protected static final Logger logger = LoggerFactory.getLogger(ExtractResource.class);
/** The output path for extraction, the first config dir */
protected String outputDirectory = ConfigUtil.getFirstConfigDir();
/**
* Set the output directory for extraction to a new value Default is obtained from ConfigUtil#getConfigDir
*/
public void setOutputDirectory(final String dir) {
this.outputDirectory = dir;
}
/**
* Return the extraction output directory
*/
public String getOutputDirectory() {
return this.outputDirectory;
}
public String getResource(final String theResource) throws IOException {
String resource = theResource;
if (!hasFileEnding(resource)) {
resource += ConfigUtil.CONFIG_FILE_ENDING;
}
logger.debug("Reading " + resource);
final String result;
try (InputStream is = ConfigUtil.getConfigStream(resource);
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
final byte[] buf = new byte[4096];
int thisReadOp = 0;
while ((thisReadOp = is.read(buf)) > -1) {
baos.write(buf, 0, thisReadOp);
}
result = baos.toString();
}
return result;
}
public void writeResource(final String theResource) throws IOException {
String resource = theResource;
if (!hasFileEnding(resource)) {
resource += ConfigUtil.CONFIG_FILE_ENDING;
}
final String rezdata = getResource(resource);
final String outputPath = this.outputDirectory + "/" + resource.replaceAll("/", ".");
logger.debug("Writing " + outputPath);
try (BufferedOutputStream os = new BufferedOutputStream(Files.newOutputStream(Paths.get(outputPath)))) {
os.write(rezdata.getBytes());
}
}
private static boolean hasFileEnding(final String resource) {
return resource.endsWith(ResourceReader.CONFIG_SUFFIX) || resource.endsWith(ResourceReader.PROP_SUFFIX)
|| resource.endsWith(ResourceReader.XML_SUFFIX) || resource.endsWith(ResourceReader.JS_SUFFIX);
}
/**
* Run from the command line specifying a set of resources to be extracted
*/
@SuppressWarnings("SystemOut")
public static void main(final String[] args) {
final ExtractResource ex = new ExtractResource();
if (args.length == 0) {
printUsage();
return;
}
int i = 0;
// Process arguments
while (i < args.length && args[i].startsWith("-")) {
if ("-o".equals(args[i])) {
if (args.length >= i + 1) {
ex.setOutputDirectory(args[++i]);
} else {
printUsage();
return;
}
} else if ("--".equals(args[i])) {
i++;
break;
} else {
printUsage();
return;
}
i++;
}
// Process remaining args as resource names
for (; i < args.length; i++) {
try {
ex.writeResource(args[i]);
} catch (IOException iox) {
logger.error("{}: {}", args[i], iox.toString());
}
}
}
@SuppressWarnings("SystemOut")
private static void printUsage() {
System.out.println("Usage: scripts/run.sh " + ExtractResource.class.getName() + " [ -o output_directory ] package/to/Resource[.cfg] ...");
}
}