org.apache.nifi.util.Unpackage Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.nifi.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Map;
import java.util.UUID;
public class Unpackage {
private static void printUsage() {
System.out.println("java " + Unpackage.class.getCanonicalName() + " [ ... ]");
System.out.println(" : The version of the FlowFile Package format. Valid values are 1, 2, 3");
System.out.println(" : The FlowFile package to unpack");
System.out.println();
}
public static void main(final String[] args) throws IOException {
if (args.length < 2) {
printUsage();
return;
}
final String version = args[0];
int inputFileCount = 0;
int outputFileCount = 0;
for (int i = 1; i < args.length; i++) {
final String filename = args[i];
final File inFile = new File(filename);
if (inFile.isDirectory()) {
System.out.println("WARNING: input file " + inFile + " is a directory; skipping");
continue;
}
if (!inFile.exists() || !inFile.canRead()) {
System.out.println("ERROR: unable to read file " + inFile);
continue;
}
final File outputDir = new File(inFile.getAbsolutePath() + ".unpacked");
if (!outputDir.exists() && !outputDir.mkdir()) {
System.out.println("ERROR: Unable to create directory " + outputDir);
continue;
}
final File tempFile = new File(outputDir, ".temp." + UUID.randomUUID().toString() + ".unpackage");
inputFileCount++;
try (final FileInputStream fis = new FileInputStream(inFile);
final BufferedInputStream bufferedIn = new BufferedInputStream(fis)) {
final FlowFileUnpackager unpackager = createUnpackager(version);
while (unpackager.hasMoreData()) {
outputFileCount++;
final Map attributes;
try (final FileOutputStream fos = new FileOutputStream(tempFile);
final BufferedOutputStream bufferedOut = new BufferedOutputStream(fos)) {
attributes = unpackager.unpackageFlowFile(bufferedIn, bufferedOut);
}
String outputFilename = attributes.get("filename");
if (outputFilename == null) {
outputFilename = attributes.get("nf.file.name");
}
final File outputFile = new File(outputDir, outputFilename);
tempFile.renameTo(outputFile);
final File attributeFilename = new File(outputDir, outputFilename + ".attributes");
try (final FileOutputStream fos = new FileOutputStream(attributeFilename);
final BufferedOutputStream bufferedOut = new BufferedOutputStream(fos)) {
for (final Map.Entry entry : attributes.entrySet()) {
bufferedOut.write((entry.getKey() + "=" + entry.getValue() + "\n").getBytes("UTF-8"));
}
}
}
}
}
System.out.println("Unpacked " + inputFileCount + " packages into " + outputFileCount + " files");
}
public static FlowFileUnpackager createUnpackager(final String version) {
switch (version) {
case "1":
return new FlowFileUnpackagerV1();
case "2":
return new FlowFileUnpackagerV2();
case "3":
return new FlowFileUnpackagerV3();
default:
System.out.println("ERROR: Invalid version: " + version + "; must be 1, 2, or 3");
return null;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy