Merge pull request #1293 from dmatej/encoding
Fixed dependency on default encoding and work with streams
diff --git a/maven-plugins/hk2-inhabitant-generator/src/main/java/org/jvnet/hk2/generator/internal/GeneratorRunner.java b/maven-plugins/hk2-inhabitant-generator/src/main/java/org/jvnet/hk2/generator/internal/GeneratorRunner.java
index 6a101d0..ec6a7e2 100755
--- a/maven-plugins/hk2-inhabitant-generator/src/main/java/org/jvnet/hk2/generator/internal/GeneratorRunner.java
+++ b/maven-plugins/hk2-inhabitant-generator/src/main/java/org/jvnet/hk2/generator/internal/GeneratorRunner.java
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation.
* Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
@@ -24,6 +25,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.URI;
import java.nio.file.FileSystem;
@@ -48,16 +50,17 @@
import org.glassfish.hk2.utilities.DescriptorImpl;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
/**
* @author jwells
- *
*/
public class GeneratorRunner {
private final static String DOT_CLASS = ".class";
private final static String META_INF = "META-INF";
private final static String INHABITANTS = "hk2-locator";
private final static String TARGET_HABITATS = "target-habitats"; //Should be same as ConfigMetadata.TARGET_HABITATS
-
+
private final Utilities utilities; // For caching
private final String fileOrDirectory;
private final String outjarName;
@@ -70,7 +73,7 @@
/**
* This initializes the GeneratorRunner with the values needed to run
- *
+ *
* @param fileOrDirectory The fileOrDirectory to inspect for services
* @param outjarName The name of the jar file to create (can be the fileOrDirectory)
* @param locatorName The name of the locator these files should be put into
@@ -98,39 +101,41 @@
utilities = new Utilities(verbose, searchPath);
this.includeDate = includeDate;
outJarIsInJar = fileOrDirectory.equals(outjarName);
-
+
if (verbose) {
System.out.println("HabitatGenerator: inputFile=" + fileOrDirectory + " outjarName=" + outjarName +
" locatorName=" + locatorName + " noSwap=" + noSwap + " outputDirectory=" + outputDirectory);
}
}
-
+
/**
* Does the work of writing out the inhabitants file to the proper location
- *
+ *
* @throws AssertionError On an error such as not being able to find the
* proper file
* @throws IOException On IO error
*/
public void go() throws AssertionError, IOException {
File toInspect = new File(fileOrDirectory);
-
+
if (!toInspect.exists()) {
throw new AssertionError("Could not find file: " + toInspect.getAbsolutePath());
}
-
+
List<DescriptorImpl> allDescriptors;
if (toInspect.isDirectory()) {
allDescriptors = utilities.findAllServicesFromDirectory(toInspect, Collections.singletonList(toInspect));
- if (allDescriptors.isEmpty()) return;
+ if (allDescriptors.isEmpty()) {
+ return;
+ }
writeToDirectory(allDescriptors);
}
else {
allDescriptors = findAllServicesFromJar(toInspect);
-
+
// Do this here to close all FDs so that on Windows we can rewrite the file
utilities.close();
-
+
if (noSwap && outJarIsInJar) {
writeToJarNoSwap(toInspect, allDescriptors);
}
@@ -138,10 +143,10 @@
writeToJar(toInspect, allDescriptors);
}
}
-
+
utilities.close();
}
-
+
private void writeToDirectory(List<DescriptorImpl> allDescriptors) throws IOException {
Map<String, List<DescriptorImpl>> targetHabitatMap = new HashMap<String, List<DescriptorImpl>>();
targetHabitatMap.put(locatorName, new ArrayList<DescriptorImpl>());
@@ -168,11 +173,11 @@
for (Map.Entry<String, List<DescriptorImpl>> targetHabitatEntry : targetHabitatMap.entrySet()) {
String targetHabitatName = targetHabitatEntry.getKey();
List<DescriptorImpl> descriptors = targetHabitatEntry.getValue();
-
+
if (descriptors.size() == 0) {
continue;
}
-
+
File inhabitantsDir = new File(outputDirectory);
File outputFile = new File(inhabitantsDir, targetHabitatName);
@@ -220,161 +225,118 @@
}
}
-
+
private void writeToJar(File jarFile, List<DescriptorImpl> descriptors) throws IOException {
File outjar = new File(outjarName);
File writeMeFile = writeInhabitantsFile(descriptors, null, outjar.getParentFile());
writeMeFile.deleteOnExit();
-
- byte buffer[] = new byte[1024];
-
+
+ byte[] buffer = new byte[8192];
File tmpJarFile = File.createTempFile(jarFile.getName(), ".tmp", outjar.getParentFile());
-
- FileInputStream fis = new FileInputStream(jarFile);
- ZipInputStream zis = new ZipInputStream(fis);
-
- FileOutputStream fos = null;
- ZipOutputStream zos = null;
-
- try {
- fos = new FileOutputStream(tmpJarFile);
- zos = new ZipOutputStream(fos);
-
+ try (FileInputStream fis = new FileInputStream(jarFile);
+ ZipInputStream zis = new ZipInputStream(fis);
+ FileOutputStream fos = new FileOutputStream(tmpJarFile);
+ ZipOutputStream zos = new ZipOutputStream(fos)) {
+
ZipEntry zentry = zis.getNextEntry();
while (zentry != null) {
String entryName = zentry.getName();
-
+
if (entryName.equals(META_INF + "/" + INHABITANTS + "/" + locatorName)) {
// Don't write out the old one
zentry = zis.getNextEntry();
continue;
}
-
+
zos.putNextEntry(new ZipEntry(entryName));
-
+
int len;
while ((len = zis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
-
+
zentry = zis.getNextEntry();
}
-
+
if (!descriptors.isEmpty()) {
zos.putNextEntry(new ZipEntry(META_INF + "/" + INHABITANTS + "/" + locatorName));
-
- FileInputStream desc_os = new FileInputStream(writeMeFile);
- try {
+
+ try (FileInputStream desc_os = new FileInputStream(writeMeFile)) {
int len;
while ((len = desc_os.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
}
- finally {
- desc_os.close();
- }
}
}
- finally {
- zis.close();
-
- if (zos != null) {
- zos.close();
- }
- }
-
+
// All went well, replace the JAR file with the new and improved jar file
String tmpFileName = tmpJarFile.getAbsolutePath();
-
+
if (verbose) {
System.out.println("Swapping jar file " + tmpFileName + " to " + outjar.getAbsolutePath());
}
-
+
if (!tmpJarFile.renameTo(outjar)) {
throw new IOException("Unable to swap generated JAR file " + tmpFileName + " to " + outjar.getAbsolutePath());
}
}
-
+
private void writeToJarNoSwap(File jarFile, List<DescriptorImpl> descriptors) throws IOException {
- if (descriptors.isEmpty()) return;
-
- URI jarURI = URI.create("jar:" + jarFile.toURI());
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- PrintWriter bWriter = new PrintWriter(baos);
- writeHeader(bWriter);
-
- for (DescriptorImpl desc : descriptors) {
- desc.writeObject(bWriter);
+ if (descriptors.isEmpty()) {
+ return;
}
-
- bWriter.close();
- baos.close();
-
- byte data[] = baos.toByteArray();
-
- OutputStream os = null;
- PrintWriter writer = null;
- ByteArrayInputStream bais = null;
-
- FileSystem fileSystem = FileSystems.newFileSystem(jarURI, new HashMap<String, Object>());
- try {
+
+ final URI jarURI = URI.create("jar:" + jarFile.toURI());
+ final byte[] data = toByteArray(descriptors);
+ try (FileSystem fileSystem = FileSystems.newFileSystem(jarURI, new HashMap<>())) {
Path locatorDirectory = fileSystem.getPath("/" + META_INF, INHABITANTS);
Files.createDirectories(locatorDirectory);
-
Path locatorPath = fileSystem.getPath("/" + META_INF, INHABITANTS, locatorName);
-
- bais = new ByteArrayInputStream(data);
-
- Files.copy(bais, locatorPath, StandardCopyOption.REPLACE_EXISTING);
- }
- finally {
- if (bais != null) {
- bais.close();
+ try (ByteArrayInputStream bais = new ByteArrayInputStream(data)) {
+ Files.copy(bais, locatorPath, StandardCopyOption.REPLACE_EXISTING);
}
- if (writer != null) {
- writer.close();
- }
- if (os != null) {
- os.close();
- }
-
- fileSystem.close();
}
}
-
+
+ private byte[] toByteArray(List<DescriptorImpl> descriptors) throws IOException {
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try (PrintWriter bWriter = new PrintWriter(baos, false, UTF_8)) {
+ writeHeader(bWriter);
+ for (DescriptorImpl desc : descriptors) {
+ desc.writeObject(bWriter);
+ }
+ }
+ return baos.toByteArray();
+ }
+
private File writeInhabitantsFile(List<DescriptorImpl> descriptors, File noSwapFile, File outDir) throws IOException {
- File outFile;
+ final File outFile;
if (noSwapFile != null) {
outFile = noSwapFile;
- }
- else {
+ } else {
outFile = File.createTempFile(locatorName, ".tmp", outDir);
}
-
+
if (verbose) {
System.out.println("Writing " + descriptors.size() + " entries to file " + outFile.getAbsolutePath());
}
-
- FileOutputStream fos = new FileOutputStream(outFile);
-
- PrintWriter pw = new PrintWriter(fos);
- writeHeader(pw);
-
- for (DescriptorImpl di : descriptors) {
- di.writeObject(pw);
+
+ try (OutputStream outputStream = new PrintStream(outFile, UTF_8);
+ PrintWriter pw = new PrintWriter(outputStream)) {
+ writeHeader(pw);
+ for (DescriptorImpl di : descriptors) {
+ di.writeObject(pw);
+ }
}
-
- pw.close();
- fos.close();
-
+
if (verbose) {
System.out.println("Wrote " + descriptors.size() + " entries to inhabitant file " + outFile.getAbsolutePath());
}
-
+
return outFile;
}
-
+
private void writeHeader(PrintWriter writer) {
writer.println("#");
if (includeDate) {
@@ -385,26 +347,28 @@
}
writer.println("#");
writer.println();
-
+
}
-
+
private List<DescriptorImpl> findAllServicesFromJar(File jar) throws IOException {
TreeSet<DescriptorImpl> retVal = new TreeSet<DescriptorImpl>(new DescriptorComparitor());
-
+
JarFile jarFile = new JarFile(jar);
-
+
try {
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
-
+
String entryName = entry.getName();
- if (!entryName.endsWith(DOT_CLASS)) continue;
-
+ if (!entryName.endsWith(DOT_CLASS)) {
+ continue;
+ }
+
InputStream is = null;
try {
is = jarFile.getInputStream(entry);
-
+
List<DescriptorImpl> dis = utilities.createDescriptorIfService(is, Collections.singletonList(jar));
retVal.addAll(dis);
}
@@ -418,13 +382,13 @@
}
}
}
-
+
}
}
finally {
jarFile.close();
}
-
+
return new ArrayList<DescriptorImpl>(retVal);
}
}