Skip to content

Commit d784480

Browse files
committed
In case the resources are load from a jar, the jar will be handled differently, as getResourceAsStream does not return a directory to list all files in case it is a jar.
1 parent fe1460a commit d784480

File tree

3 files changed

+48
-8
lines changed

3 files changed

+48
-8
lines changed

core/sds-aspect-model-resolver/src/main/java/io/openmanufacturing/sds/aspectmodel/resolver/ClasspathStrategy.java

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,23 @@
1313

1414
package io.openmanufacturing.sds.aspectmodel.resolver;
1515

16+
import java.io.File;
1617
import java.io.FileNotFoundException;
1718
import java.io.IOException;
1819
import java.io.InputStream;
1920
import java.net.URL;
2021
import java.nio.charset.StandardCharsets;
22+
import java.util.ArrayList;
2123
import java.util.Arrays;
2224
import java.util.Comparator;
25+
import java.util.Enumeration;
26+
import java.util.List;
27+
import java.util.jar.JarEntry;
28+
import java.util.jar.JarFile;
2329
import java.util.stream.Stream;
2430

2531
import org.apache.commons.io.IOUtils;
32+
import org.apache.commons.lang3.StringUtils;
2633
import org.apache.jena.rdf.model.Model;
2734
import org.slf4j.Logger;
2835
import org.slf4j.LoggerFactory;
@@ -87,15 +94,38 @@ protected URL resourceUrl( final String directory, final String filename ) {
8794
return getClass().getClassLoader().getResource( directory + "/" + filename );
8895
}
8996

90-
protected Stream<String> filesInDirectory( String dir ) {
91-
final String directory = dir.startsWith( "/" ) ? dir : "/" + dir;
97+
protected Stream<String> filesInDirectory( final String directory ) {
9298
try {
93-
final InputStream directoryUrl = getClass().getResourceAsStream( directory );
94-
if ( directoryUrl == null ) {
95-
LOG.warn( "No such classpath directory {}", directory );
96-
return Stream.empty();
99+
final String url = getClass().getClassLoader().getResource( directory ).toString();
100+
final int jarIndex = url.indexOf( ".jar" );
101+
final String path = jarIndex > 0 ? url.substring( 0, jarIndex +4 ).replace( "jar:file:", "" ) : url;
102+
final File jarFile = new File(path);
103+
if(jarFile.isFile()) {
104+
final List<String> fileList = new ArrayList<>();
105+
final JarFile jar = new JarFile(jarFile);
106+
final Enumeration<JarEntry> entries = jar.entries();
107+
final String dir = directory.endsWith( "/" ) ? directory : directory + "/";
108+
while(entries.hasMoreElements()) {
109+
final String name = entries.nextElement().getName();
110+
if(name.contains( dir ))
111+
{
112+
final String fileName = name.replace( dir, "" );
113+
if(StringUtils.isNotBlank( fileName ))
114+
{
115+
fileList.add( fileName );
116+
}
117+
}
118+
}
119+
jar.close();
120+
return fileList.stream();
121+
} else {
122+
final InputStream directoryUrl = getClass().getClassLoader().getResourceAsStream( directory );
123+
if ( directoryUrl == null ) {
124+
LOG.warn( "No such classpath directory {}", directory );
125+
return Stream.empty();
126+
}
127+
return Arrays.stream( IOUtils.toString( directoryUrl, StandardCharsets.UTF_8 ).split( "\\n" ) );
97128
}
98-
return Arrays.stream( IOUtils.toString( directoryUrl, StandardCharsets.UTF_8 ).split( "\\n" ) );
99129
} catch ( final IOException exception ) {
100130
LOG.warn( "Could not list files in classpath directory {}", directory, exception );
101131
return Stream.empty();

core/sds-aspect-model-resolver/src/test/java/io/openmanufacturing/sds/aspectmodel/resolver/AspectModelResolverTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,4 +356,15 @@ public void testResolveAspectContainingRefinedProperty( final KnownVersion metaM
356356
.resolveAspectModel( strategy, AspectModelUrn.fromUrn( aspectUrn ) );
357357
Assertions.assertThat( result.isSuccess() ).describedAs( "Resolution of refined Property failed." ).isTrue();
358358
}
359+
360+
@ParameterizedTest
361+
@MethodSource( value = "allVersions" )
362+
public void testResolveAspectContainingRefinedProperty2( final KnownVersion metaModelVersion ) {
363+
final String aspectUrn = "urn:bamm:io.openmanufacturing.test:1.0.0#ReferenceCharacteristicTest";
364+
final AspectModelResolver resolver = new AspectModelResolver();
365+
final ClasspathStrategy strategy = new ClasspathStrategy( metaModelVersion.toString().toLowerCase() );
366+
final Try<VersionedModel> result = resolver
367+
.resolveAspectModel( strategy, AspectModelUrn.fromUrn( aspectUrn ) );
368+
Assertions.assertThat( result.isSuccess() ).describedAs( "Resolution of refined Property failed." ).isTrue();
369+
}
359370
}

core/sds-test-aspect-models/src/main/java/io/openmanufacturing/sds/test/TestSharedModel.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
public interface TestSharedModel {
1010
String TEST_NAMESPACE = "urn:bamm:io.openmanufacturing.test.shared:1.0.0#";
11-
String RESOURCE_PATH = "io.openmanufacturing.test.shared/1.0.0";
1211
String getName();
1312

1413
default AspectModelUrn getUrn() {

0 commit comments

Comments
 (0)