Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix regression in Open Type Hierarchy #5255

Merged
merged 3 commits into from May 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
40 changes: 17 additions & 23 deletions aQute.libg/src/aQute/lib/utf8properties/UTF8Properties.java
Expand Up @@ -8,6 +8,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.ByteBuffer;
Expand Down Expand Up @@ -144,45 +145,38 @@ private String decode(byte[] buffer) {
return new String(buffer); // default decoding
}

private static final Pattern LINE_SPLITTER = Pattern.compile("\n\r?");

@Override
public void store(OutputStream out, String msg) throws IOException {
public void store(Writer writer, String msg) throws IOException {
CharArrayWriter sw = new CharArrayWriter();
super.store(sw, null);

String[] lines = sw.toString()
.split("\n\r?");
String[] lines = LINE_SPLITTER.split(sw.toString());

byte[] newline = "\n".getBytes(UTF_8);
for (String line : lines) {
if (line.startsWith("#"))
continue;

out.write(line.getBytes(UTF_8));
out.write(newline);
writer.write(line);
writer.write('\n');
}
}

@Override
public void store(Writer out, String msg) throws IOException {
CharArrayWriter sw = new CharArrayWriter();
super.store(sw, null);

String[] lines = sw.toString()
.split("\n\r?");

for (String line : lines) {
if (line.startsWith("#"))
continue;

out.write(line);
out.write('\n');
public void store(OutputStream out, String msg) throws IOException {
Writer writer = new OutputStreamWriter(out, UTF_8);
try {
store(writer, msg);
} finally {
writer.flush();
}
}

public void store(File out) throws IOException {
CharArrayWriter sw = new CharArrayWriter();
super.store(sw, null);
IO.store(sw.toString(), out);
public void store(File file) throws IOException {
try (OutputStream out = IO.outputStream(file)) {
store(out, null);
}
}

public void store(OutputStream out) throws IOException {
Expand Down
20 changes: 19 additions & 1 deletion aQute.libg/test/aQute/lib/utf8properties/UTF8PropertiesTest.java
Expand Up @@ -4,6 +4,7 @@

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
Expand All @@ -12,6 +13,7 @@

import org.junit.jupiter.api.Test;

import aQute.bnd.test.jupiter.InjectTemporaryDirectory;
import aQute.lib.io.IO;
import aQute.libg.reporter.ReporterAdapter;
import aQute.service.reporter.Report.Location;
Expand Down Expand Up @@ -381,12 +383,28 @@ public void testWrite() throws IOException {
StringWriter sw = new StringWriter();
p.store(sw, null);
String s = sw.toString();
assertThat(s).contains("#comment");
assertThat(s).doesNotStartWith("#")
.contains("#comment");
UTF8Properties p1 = new UTF8Properties();
p1.load(new StringReader(s));
assertThat(p1).containsExactlyInAnyOrderEntriesOf(p);
}

@Test
public void testWriteFile(@InjectTemporaryDirectory
File tmp) throws Exception {
UTF8Properties p = new UTF8Properties();
p.put("Foo", "Foo");
p.put("Bar", "Bar");
File props = new File(tmp, "props.properties");
p.store(props);
assertThat(props).isFile();
assertThat(IO.collect(props)).doesNotStartWith("#");
UTF8Properties p1 = new UTF8Properties();
p1.load(props, null);
assertThat(p1).containsExactlyInAnyOrderEntriesOf(p);
}

private void testProperty(String content, String key, String value) throws IOException {
testProperty(content, key, value, null);
}
Expand Down
169 changes: 67 additions & 102 deletions biz.aQute.bndlib.tests/test/test/BuilderTest.java
Expand Up @@ -541,39 +541,29 @@ public void testOverlappingPackageMissesImportVersions() throws Exception {
*/

@Test
public void testLastModifiedForManifest() throws Exception {
File file = new File("tmp.jar");
try {
long time = System.currentTimeMillis();
public void testLastModifiedForManifest(@InjectTemporaryDirectory
File tmp) throws Exception {
long time = System.currentTimeMillis();

Builder b = new Builder();
try (Builder b = new Builder()) {
b.addClasspath(IO.getFile("jar/osgi.jar"));
b.setExportPackage("org.osgi.framework");
Jar build = b.build();
try {
assertTrue(b.check());
assertTrue(b.check());

build.write("tmp.jar");
Jar ajr = new Jar(file);
try {
Resource r = ajr.getResource("META-INF/MANIFEST.MF");
assertNotNull(r);
long t = r.lastModified();
Date date = new Date(t);
System.out.println(date + " " + t);
// TODO we need to adapt the timestamp handling
assertThat(t).as("%s %s", date, t)
.isEqualTo(1142555622000L);
} finally {
ajr.close();
}
} finally {
build.close();
File file = new File(tmp, "tmp.jar");
build.write(file);
try (Jar ajr = new Jar(file)) {
Resource r = ajr.getResource("META-INF/MANIFEST.MF");
assertNotNull(r);
long t = r.lastModified();
Date date = new Date(t);
System.out.println(date + " " + t);
// TODO we need to adapt the timestamp handling
assertThat(t).as("%s %s", date, t)
.isEqualTo(1142555622000L);
}
} finally {
file.delete();
}

}

/**
Expand Down Expand Up @@ -806,69 +796,49 @@ public void testBadPackageInfo() throws Exception {
* removes A from 'a', and checks again that the last modified data changed.
*/
@Test
public void testRemoveClassFromPackage() throws Exception {
try {
Builder b = new Builder();
try {
IO.getFile("bin_test/a1/a")
.mkdirs();
IO.copy(IO.getFile("bin_test/a/A.class"), IO.getFile("bin_test/a1/a/A.class"));
IO.copy(IO.getFile("bin_test/a/B.class"), IO.getFile("bin_test/a1/a/B.class"));
Jar classpath = new Jar(IO.getFile("bin_test/a1"));
b.addClasspath(classpath);
b.setPrivatePackage("a");
Jar result = b.build();
Resource ra = result.getResource("a/A.class");
Resource rb = result.getResource("a/B.class");
long lm1 = result.lastModified();
assertTrue(lm1 > 0, "Last modified date of bundle > 0");

// windows has a very low resolution sometimes
Thread.sleep(IO.isWindows() ? 1000 : 100);

IO.getFile("bin_test/a1/a/B.class")
.delete();
classpath.remove("a/B.class");
classpath.updateModified(System.currentTimeMillis(), "Removed file B");
result = b.build();
long lm2 = result.lastModified();
assertTrue(lm2 > lm1, "Last modified date of bundle has increased after deleting class from package");

// windows has a very low resolution sometimes
Thread.sleep(IO.isWindows() ? 1000 : 100);

IO.getFile("bin_test/a1/a/A.class")
.delete();
classpath.remove("a/A.class");
classpath.updateModified(System.currentTimeMillis(), "Removed file A");

// windows has a very low resolution sometimes
Thread.sleep(IO.isWindows() ? 1000 : 100);

result = b.build();
long lm3 = result.lastModified();
assertTrue(lm3 > lm2,
"Last modified date of bundle has increased after deleting last class from package");
} finally {
b.close();
}
} finally {
try {
IO.getFile("bin_test/a1/a/A.class")
.delete();
} catch (Exception e) {}
try {
IO.getFile("bin_test/a1/a/B.class")
.delete();
} catch (Exception e) {}
try {
IO.getFile("bin_test/a1/a")
.delete();
} catch (Exception e) {}
try {
IO.getFile("bin_test/a1")
.delete();
} catch (Exception e) {}
public void testRemoveClassFromPackage(@InjectTemporaryDirectory
File tmp) throws Exception {
try (Builder b = new Builder()) {
IO.mkdirs(IO.getFile(tmp, "a"));
IO.copy(IO.getFile("bin_test/a/A.class"), IO.getFile(tmp, "a/A.class"));
IO.copy(IO.getFile("bin_test/a/B.class"), IO.getFile(tmp, "a/B.class"));
Jar classpath = new Jar(tmp);
b.addClasspath(classpath);
b.setPrivatePackage("a");
Jar result = b.build();
Resource ra = result.getResource("a/A.class");
assertThat(ra).isNotNull();
Resource rb = result.getResource("a/B.class");
assertThat(rb).isNotNull();
long lm1 = result.lastModified();
assertThat(lm1).as("Last modified date of bundle > 0")
.isGreaterThan(0L);

// windows has a very low resolution sometimes
Thread.sleep(IO.isWindows() ? 1000 : 100);

IO.delete(IO.getFile(tmp, "a/B.class"));
classpath.remove("a/B.class");
classpath.updateModified(System.currentTimeMillis(), "Removed file B");
result = b.build();
long lm2 = result.lastModified();
assertThat(lm2).as("Last modified date of bundle has increased after deleting class from package")
.isGreaterThan(lm1);

// windows has a very low resolution sometimes
Thread.sleep(IO.isWindows() ? 1000 : 100);

IO.delete(IO.getFile(tmp, "a/A.class"));
classpath.remove("a/A.class");
classpath.updateModified(System.currentTimeMillis(), "Removed file A");

// windows has a very low resolution sometimes
Thread.sleep(IO.isWindows() ? 1000 : 100);

result = b.build();
long lm3 = result.lastModified();
assertThat(lm3).as("Last modified date of bundle has increased after deleting last class from package")
.isGreaterThan(lm2);
}
}

Expand Down Expand Up @@ -943,7 +913,7 @@ public void testDigests(@InjectTemporaryDirectory
File tmp) throws Exception {
Builder b = new Builder();
try {
b.addClasspath(IO.getFile(new File(""), "jar/osgi.jar"));
b.addClasspath(IO.getFile("jar/osgi.jar"));
b.setExportPackage("org.osgi.framework");
b.setProperty(Constants.DIGESTS, "MD5, SHA1");
Jar jar = b.build();
Expand Down Expand Up @@ -1860,7 +1830,7 @@ public void testNoManifest(@InjectTemporaryDirectory
Jar jar = b.build();
assertTrue(b.check());

File f = new File(tmp, "tmp.jar");
File f = IO.getFile(tmp, "tmp.jar");
jar.write(f);

JarInputStream jin = new JarInputStream(new FileInputStream(f));
Expand Down Expand Up @@ -2402,11 +2372,11 @@ public void testConduit() throws Exception {
}

@Test
public void testSignedJarConduit() throws Exception {
public void testSignedJarConduit(@InjectTemporaryDirectory
File tmp) throws Exception {
Properties p = new Properties();
p.setProperty("-conduit", "jar/osgi-3.0.0.jar");
Builder b = new Builder();
try {
try (Builder b = new Builder()) {
b.setProperties(p);
Jar jars[] = b.builds();
assertTrue(b.check());
Expand All @@ -2417,17 +2387,14 @@ public void testSignedJarConduit() throws Exception {
Resource r = jar.getResource("META-INF/OSGI.RSA");
assertNotNull(r);

File f = new File("tmp.jar");
f.deleteOnExit();
File f = IO.getFile(tmp, "tmp.jar");
jar.write(f);

try (Jar wj = new Jar(f)) {
Resource wr = wj.getResource("META-INF/OSGI.RSA");
assertNotNull(wr);
assertEquals(wj.getSHA256(), jar.getSHA256());
}
} finally {
b.close();
}
}

Expand Down Expand Up @@ -2911,8 +2878,7 @@ public void testImportRangeCalculatedFromClasspath_2() throws Exception {
Properties base = new Properties();
base.put(Constants.IMPORT_PACKAGE, "javax.servlet,javax.servlet.http");

String pwd = System.getProperty("user.dir");
base.put("pwd", new File(pwd).toURI()
base.put("pwd", IO.work.toURI()
.toString());
base.put("-classpath", "${pwd}/jar/jsp-api.jar,${pwd}/jar/servlet-api.jar");

Expand Down Expand Up @@ -2977,8 +2943,7 @@ public void testImportRangeCalculatedFromClasspath_4() throws Exception {
Properties base = new Properties();
base.put(Constants.IMPORT_PACKAGE, "javax.servlet,javax.servlet.http");

String pwd = System.getProperty("user.dir");
base.put("pwd", new File(pwd).toURI()
base.put("pwd", IO.work.toURI()
.toString());
base.put("-classpath", "${pwd}/jar/jsp-api.jar,${pwd}/jar/servlet-api.jar");

Expand Down
Expand Up @@ -88,7 +88,7 @@ void refresh() throws CoreException {
resources = null;
}

private static final IClasspathAttribute TEST = JavaCore.newClasspathAttribute("test",
static final IClasspathAttribute TEST = JavaCore.newClasspathAttribute("test",
Boolean.TRUE.toString());
private static final IClasspathAttribute PROJECT = JavaCore.newClasspathAttribute(Constants.VERSION_ATTRIBUTE,
Constants.VERSION_ATTR_PROJECT);
Expand Down Expand Up @@ -146,7 +146,7 @@ IRuntimeClasspathEntry[] getRuntimeClasspathEntries() throws JavaModelException
return runtime.toArray(EMPTY_RUNTIMEENTRIES);
}

private static boolean hasAttribute(IClasspathEntry cpe, IClasspathAttribute attr) {
static boolean hasAttribute(IClasspathEntry cpe, IClasspathAttribute attr) {
return Arrays.stream(cpe.getExtraAttributes())
.anyMatch(attr::equals);
}
Expand Down