Skip to content

Commit 829d8c5

Browse files
undxozhelezniak-talendyyin-talendacatoireypiel-talend
authored
feat(QTDI-693): TCK microservice/OSGI build with dynamic dependencies.
* feat(QTDI-693): expose nested repository member * feat(QTDI-693): allow nested jar as root repository * feat(QTDI-693): classes across many scanning.properties * feat(QTDI-693): classes across many scanning.properties * feat(QTDI-693): include nested jars in getURLs * feat(QTDI-693): include nested jars in getURLs * feat(QTDI-693): fix test * feat(QTDI-675): pr comment * chore(QTDI-1826): unblock github action check (#1079) * add snapshot plugin oss repo * remove talend-icon * remove org.talend.ui:talend-icon:3.8.0 it's deprecated dependency, and its content is already inside the folder of documentation/src/main/antora/modules/ROOT/assets/images/icons/svg * feat(QTDI-113): Support Java 17 compilation (#from:936) (#1061) * feat(QTDI-113): Support Java 17 compilation (#936) --------- Co-authored-by: Emmanuel GALLOIS <[email protected]> Co-authored-by: undx <[email protected]> Co-authored-by: Axel CATOIRE <[email protected]> * fix(QTDI-1838): register ContainerFinder for studio (#1081) * it was removed in 2020 and looks like we've missed it, it was added in a lot of modules for Cloud, but I think by mistake it was removed from component-runtime-manager. * chore(QTDI-1859): improve CI build (#1084) * nexus creds for deps report * use settings.xml for deps report * feat(QTDI-693): add plugins.properties location property - fix springboot repackaging to BOOT-INF/ issue * feat(QTDI-693): fix path for plugins.properties location propert * feat(QTDI-693): fix property name * feat(QTDI-693): remove duplicate info log --------- Co-authored-by: Oleksandr Zhelezniak <[email protected]> Co-authored-by: yyin <[email protected]> Co-authored-by: Axel CATOIRE <[email protected]> Co-authored-by: Yves Piel <[email protected]>
1 parent 8d1a190 commit 829d8c5

File tree

5 files changed

+74
-20
lines changed

5 files changed

+74
-20
lines changed

component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/ComponentManager.java

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@
3737
import static org.talend.sdk.component.runtime.manager.reflect.Constructors.findConstructor;
3838
import static org.talend.sdk.component.runtime.manager.util.Lazy.lazy;
3939

40+
import java.io.BufferedReader;
4041
import java.io.File;
4142
import java.io.IOException;
4243
import java.io.InputStream;
44+
import java.io.InputStreamReader;
4345
import java.io.ObjectStreamException;
4446
import java.io.Serializable;
4547
import java.lang.annotation.Annotation;
@@ -1303,16 +1305,42 @@ public void onCreate(final Container container) {
13031305
try {
13041306
String alreadyScannedClasses = null;
13051307
Filter filter = KnownClassesFilter.INSTANCE;
1306-
try (final InputStream containerFilterConfig =
1307-
container.getLoader().getResourceAsStream("TALEND-INF/scanning.properties")) {
1308-
if (containerFilterConfig != null) {
1308+
// we need to scan the nested repository
1309+
if (container.hasNestedRepository()) {
1310+
try {
1311+
final Enumeration<URL> urls = loader.getResources("TALEND-INF/scanning.properties");
13091312
final Properties config = new Properties();
1310-
config.load(containerFilterConfig);
1311-
filter = createScanningFilter(config);
1312-
alreadyScannedClasses = config.getProperty("classes.list");
1313+
while (urls.hasMoreElements()) {
1314+
final URL url = urls.nextElement();
1315+
// ensure we scan the correct classes of plugin in the nested repository
1316+
if ("nested".equals(url.getProtocol())
1317+
&& url.getPath().contains(container.getRootModule())) {
1318+
try (final BufferedReader reader =
1319+
new BufferedReader(new InputStreamReader(url.openStream()))) {
1320+
config.load(reader);
1321+
filter = createScanningFilter(config);
1322+
alreadyScannedClasses = config.getProperty("classes.list");
1323+
break;
1324+
}
1325+
}
1326+
}
1327+
} catch (IOException e) {
1328+
log.info("[onCreate] Can't read nested scanning.properties: {}", e.getMessage());
1329+
}
1330+
}
1331+
// normal scanning or nested scan failed
1332+
if (alreadyScannedClasses == null) {
1333+
try (final InputStream containerFilterConfig =
1334+
container.getLoader().getResourceAsStream("TALEND-INF/scanning.properties")) {
1335+
if (containerFilterConfig != null) {
1336+
final Properties config = new Properties();
1337+
config.load(containerFilterConfig);
1338+
filter = createScanningFilter(config);
1339+
alreadyScannedClasses = config.getProperty("classes.list");
1340+
}
1341+
} catch (final IOException e) {
1342+
log.debug(e.getMessage(), e);
13131343
}
1314-
} catch (final IOException e) {
1315-
log.debug(e.getMessage(), e);
13161344
}
13171345

13181346
AnnotationFinder optimizedFinder = null;

component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/ComponentManagerTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -427,10 +427,11 @@ void extendFamilyInNestedRepo(@TempDir final File temporaryFolder) throws Except
427427
.of(container.getLoader().getURLs())
428428
.map(Files::toFile)
429429
.map(File::getName)
430-
.sorted()
430+
.sorted() // !! for asserts
431431
.toArray(String[]::new);
432-
assertEquals(1, dependencies.length); // ignored transitive deps, enables the new root to control it
433-
assertEquals("main.jar", dependencies[0]); // transitive-1.0.0.jar is nested
432+
assertEquals(2, dependencies.length); // ignored transitive deps, enables the new root to control it
433+
assertEquals("fatjar.jar", dependencies[0]); // transitive-1.0.0.jar is nested
434+
assertEquals("main.jar", dependencies[1]); // main.jar containing fatjar.jar
434435
} finally {
435436
if (!transitive.delete()) {
436437
transitive.deleteOnExit();

container/container-core/src/main/java/org/talend/sdk/component/classloader/ConfigurableClassLoader.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ public class ConfigurableClassLoader extends URLClassLoader {
111111
@Getter
112112
private final List<String> cacheableClasses;
113113

114+
private List<URL> nestedURLs = new ArrayList<>();
115+
114116
public ConfigurableClassLoader(final String id, final URL[] urls, final ClassLoader parent,
115117
final Predicate<String> parentFilter, final Predicate<String> childFirstFilter,
116118
final String[] nestedDependencies, final String[] jvmPrefixes) {
@@ -155,6 +157,7 @@ private void loadNestedDependencies(final ClassLoader parent, final String[] nes
155157
if (url == null) {
156158
throw new IllegalArgumentException("Didn't find " + resource + " in " + asList(nestedDependencies));
157159
}
160+
nestedURLs.add(url);
158161
final Map<String, Resource> resources = new HashMap<>();
159162
final URLConnection urlConnection;
160163
final Manifest manifest;
@@ -458,6 +461,15 @@ public Enumeration<URL> findResources(final String name) throws IOException {
458461
return enumeration(aggregated);
459462
}
460463

464+
@Override
465+
public URL[] getURLs() {
466+
final List<URL> urls = new ArrayList<>(Arrays.asList(super.getURLs()));
467+
if (!nestedURLs.isEmpty()) {
468+
urls.addAll(nestedURLs);
469+
}
470+
return urls.toArray(new URL[0]);
471+
}
472+
461473
private boolean isNestedDependencyResource(final String name) {
462474
return name != null && name.startsWith(NESTED_MAVEN_REPOSITORY);
463475
}

container/container-core/src/main/java/org/talend/sdk/component/container/Container.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,10 @@ public Date getCreated() {
307307
return created.get();
308308
}
309309

310+
public boolean hasNestedRepository() {
311+
return hasNestedRepository;
312+
}
313+
310314
public void registerTransformer(final ClassFileTransformer transformer) {
311315
transformers.add(transformer);
312316
}

container/container-core/src/main/java/org/talend/sdk/component/container/ContainerManager.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929
import java.io.IOException;
3030
import java.io.InputStream;
3131
import java.io.InputStreamReader;
32+
import java.net.URL;
3233
import java.nio.charset.StandardCharsets;
3334
import java.nio.file.Files;
3435
import java.nio.file.Path;
36+
import java.nio.file.Paths;
3537
import java.security.MessageDigest;
3638
import java.security.NoSuchAlgorithmException;
3739
import java.util.ArrayList;
@@ -110,16 +112,23 @@ public ContainerManager(final DependenciesResolutionConfiguration dependenciesRe
110112
this.logInfoLevelMapping = logInfoLevelMapping;
111113
this.containerInitializer = containerInitializer;
112114
this.resolver = dependenciesResolutionConfiguration.getResolver();
113-
this.rootRepositoryLocation = ofNullable(dependenciesResolutionConfiguration.getRootRepositoryLocation())
114-
.filter(Files::exists)
115-
.orElseGet(() -> PathFactory.get(System.getProperty("user.home", "")).resolve(".m2/repository"));
116115

117-
if (log.isDebugEnabled()) {
118-
log.debug("Using root repository: " + this.rootRepositoryLocation.toAbsolutePath());
116+
Path rootRepo = ofNullable(dependenciesResolutionConfiguration.getRootRepositoryLocation())
117+
.filter(Files::exists)
118+
.orElseGet(() -> PathFactory.get(System.getProperty("user.home")).resolve(".m2/repository"));
119+
// if we've defaulted to user home m2 (fallback), we want to check if we're in running in a fatjar
120+
if (PathFactory.get(System.getProperty("user.home")).resolve(".m2/repository").equals(rootRepo)) {
121+
final URL nested = classLoaderConfiguration.getParent().getResource("MAVEN-INF/repository");
122+
if (nested != null) {
123+
rootRepo = Paths.get(nested.getFile().replace("file:", ""));
124+
}
119125
}
120-
126+
this.rootRepositoryLocation = rootRepo;
127+
info("Using root repository: " + this.rootRepositoryLocation.toAbsolutePath());
128+
final String pluginsLocation = System.getProperty("talend.component.manager.plugins.location",
129+
"TALEND-INF/plugins.properties");
121130
final String nestedPluginMappingResource = ofNullable(classLoaderConfiguration.getNestedPluginMappingResource())
122-
.orElse("TALEND-INF/plugins.properties");
131+
.orElse(pluginsLocation);
123132
this.classLoaderConfiguration = new ClassLoaderConfiguration(
124133
ofNullable(classLoaderConfiguration.getParent()).orElseGet(ContainerManager.class::getClassLoader),
125134
ofNullable(classLoaderConfiguration.getClassesFilter()).orElseGet(() -> name -> true),
@@ -477,8 +486,8 @@ public Container create() {
477486
? nestedContainerMapping.getOrDefault(module, module)
478487
: module;
479488
final Path resolved = resolve(moduleLocation);
480-
info("Creating module " + moduleLocation + " (from " + module
481-
+ (Files.exists(resolved) ? ", location=" + resolved.toAbsolutePath().toString() : "") + ")");
489+
info(String.format("Creating module %s (from %s, location=%s)", moduleLocation, module,
490+
resolved.toAbsolutePath()));
482491
final Stream<Artifact> classpath = Stream
483492
.concat(getBuiltInClasspath(moduleLocation),
484493
additionalClasspath == null ? Stream.empty() : additionalClasspath.stream());

0 commit comments

Comments
 (0)