mirror of https://github.com/apache/nifi.git
NIFI-6758: allow pre-unpacked nar's to be recorded in ExtensionMapping
- fixing resource leak This closes #3806. Signed-off-by: Bryan Bende <bbende@apache.org>
This commit is contained in:
parent
ed1e843609
commit
5238dc20b1
|
@ -24,6 +24,8 @@ import org.apache.nifi.util.StringUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import static java.lang.String.format;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileFilter;
|
import java.io.FileFilter;
|
||||||
|
@ -34,6 +36,7 @@ import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -105,35 +108,26 @@ public final class NarUnpacker {
|
||||||
|
|
||||||
// get the manifest for this nar
|
// get the manifest for this nar
|
||||||
try (final JarFile nar = new JarFile(narFile)) {
|
try (final JarFile nar = new JarFile(narFile)) {
|
||||||
final Manifest manifest = nar.getManifest();
|
BundleCoordinate bundleCoordinate = createBundleCoordinate(nar.getManifest());
|
||||||
|
|
||||||
// lookup the nar id
|
|
||||||
final Attributes attributes = manifest.getMainAttributes();
|
|
||||||
final String groupId = attributes.getValue(NarManifestEntry.NAR_GROUP.getManifestName());
|
|
||||||
final String narId = attributes.getValue(NarManifestEntry.NAR_ID.getManifestName());
|
|
||||||
final String version = attributes.getValue(NarManifestEntry.NAR_VERSION.getManifestName());
|
|
||||||
|
|
||||||
// determine if this is the framework
|
// determine if this is the framework
|
||||||
if (NarClassLoaders.FRAMEWORK_NAR_ID.equals(narId)) {
|
if (NarClassLoaders.FRAMEWORK_NAR_ID.equals(bundleCoordinate.getId())) {
|
||||||
if (unpackedFramework != null) {
|
if (unpackedFramework != null) {
|
||||||
throw new IllegalStateException("Multiple framework NARs discovered. Only one framework is permitted.");
|
throw new IllegalStateException("Multiple framework NARs discovered. Only one framework is permitted.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// unpack the framework nar
|
// unpack the framework nar
|
||||||
unpackedFramework = unpackNar(narFile, frameworkWorkingDir);
|
unpackedFramework = unpackNar(narFile, frameworkWorkingDir);
|
||||||
} else if (NarClassLoaders.JETTY_NAR_ID.equals(narId)) {
|
} else if (NarClassLoaders.JETTY_NAR_ID.equals(bundleCoordinate.getId())) {
|
||||||
if (unpackedJetty != null) {
|
if (unpackedJetty != null) {
|
||||||
throw new IllegalStateException("Multiple Jetty NARs discovered. Only one Jetty NAR is permitted.");
|
throw new IllegalStateException("Multiple Jetty NARs discovered. Only one Jetty NAR is permitted.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// unpack and record the Jetty nar
|
// unpack and record the Jetty nar
|
||||||
unpackedJetty = unpackNar(narFile, extensionsWorkingDir);
|
unpackedJetty = unpackNar(narFile, extensionsWorkingDir);
|
||||||
unpackedNars.put(unpackedJetty, new BundleCoordinate(groupId, narId, version));
|
|
||||||
unpackedExtensions.add(unpackedJetty);
|
unpackedExtensions.add(unpackedJetty);
|
||||||
} else {
|
} else {
|
||||||
// unpack and record the extension nar
|
// unpack and record the extension nar
|
||||||
final File unpackedExtension = unpackNar(narFile, extensionsWorkingDir);
|
final File unpackedExtension = unpackNar(narFile, extensionsWorkingDir);
|
||||||
unpackedNars.put(unpackedExtension, new BundleCoordinate(groupId, narId, version));
|
|
||||||
unpackedExtensions.add(unpackedExtension);
|
unpackedExtensions.add(unpackedExtension);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -188,6 +182,7 @@ public final class NarUnpacker {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unpackedNars.putAll(createUnpackedNarBundleCoordinateMap(extensionsWorkingDir));
|
||||||
final ExtensionMapping extensionMapping = new ExtensionMapping();
|
final ExtensionMapping extensionMapping = new ExtensionMapping();
|
||||||
mapExtensions(unpackedNars, docsWorkingDir, extensionMapping);
|
mapExtensions(unpackedNars, docsWorkingDir, extensionMapping);
|
||||||
|
|
||||||
|
@ -205,6 +200,36 @@ public final class NarUnpacker {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a map containing the nar directory mapped to it's bundle-coordinate.
|
||||||
|
* @param extensionsWorkingDir
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static Map<File, BundleCoordinate> createUnpackedNarBundleCoordinateMap(File extensionsWorkingDir) {
|
||||||
|
Map<File, BundleCoordinate> result = new HashMap<>();
|
||||||
|
File[] unpackedDirs = extensionsWorkingDir.listFiles(file -> file.isDirectory() && file.getName().endsWith("nar-unpacked"));
|
||||||
|
for (File unpackedDir : unpackedDirs) {
|
||||||
|
Path mf = Paths.get(unpackedDir.getAbsolutePath(), "META-INF", "MANIFEST.MF");
|
||||||
|
try(InputStream is = Files.newInputStream(mf)) {
|
||||||
|
Manifest manifest = new Manifest(is);
|
||||||
|
BundleCoordinate bundleCoordinate = createBundleCoordinate(manifest);
|
||||||
|
result.put(unpackedDir, bundleCoordinate);
|
||||||
|
} catch (IOException e) {
|
||||||
|
logger.error(format("Unable to parse NAR information from unpacked nar directory [%s].", unpackedDir.getAbsoluteFile()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BundleCoordinate createBundleCoordinate(Manifest manifest) {
|
||||||
|
Attributes mainAttributes = manifest.getMainAttributes();
|
||||||
|
String groupId = mainAttributes.getValue(NarManifestEntry.NAR_GROUP.getManifestName());
|
||||||
|
String narId = mainAttributes.getValue(NarManifestEntry.NAR_ID.getManifestName());
|
||||||
|
String version = mainAttributes.getValue(NarManifestEntry.NAR_VERSION.getManifestName());
|
||||||
|
BundleCoordinate bundleCoordinate = new BundleCoordinate(groupId, narId, version);
|
||||||
|
return bundleCoordinate;
|
||||||
|
}
|
||||||
|
|
||||||
private static void mapExtensions(final Map<File, BundleCoordinate> unpackedNars, final File docsDirectory, final ExtensionMapping mapping) throws IOException {
|
private static void mapExtensions(final Map<File, BundleCoordinate> unpackedNars, final File docsDirectory, final ExtensionMapping mapping) throws IOException {
|
||||||
for (final Map.Entry<File, BundleCoordinate> entry : unpackedNars.entrySet()) {
|
for (final Map.Entry<File, BundleCoordinate> entry : unpackedNars.entrySet()) {
|
||||||
final File unpackedNar = entry.getKey();
|
final File unpackedNar = entry.getKey();
|
||||||
|
|
Loading…
Reference in New Issue