Compare commits

...

8 Commits

Author SHA1 Message Date
pyzhou
83e97938d5 fix(TDI-49150) Upgrade tck in studio 7.3 (#5901) 2022-12-30 15:16:43 +08:00
jiezhang-tlnd
089f43ccd4 chore(TUP-37524)CVE-2022-46364,org.apache.cxf:cxf-core:3.4.4,3.5.2 (#5877) 2022-12-29 11:09:38 +08:00
Jane Ding
d008463ef1 fix(TUP-37467):[8.0.1&7.3.1] custom component are no more build as (#5882)
* fix(TUP-37467):[8.0.1&7.3.1] custom component are no more build as
snapshot but releases since june/july patch
https://jira.talendforge.org/browse/TUP-37467

* fix(TUP-37467):[8.0.1&7.3.1] custom component are no more build as
snapshot but releases since june/july patch
https://jira.talendforge.org/browse/TUP-37467
2022-12-28 17:40:50 +08:00
wang wei
d7ed643621 fix(TDI-48822): Bump component-runtime to 1.38.8 in Studio 7.3.1 (#5896) 2022-12-28 13:58:56 +08:00
pyzhou
0972593afd fix(TDI-49113) Upgrade tck in studio 7.3 (#5894) 2022-12-26 16:22:24 +08:00
pyzhou
c50c5c2e46 fix(TDI-49004): backport tmap java17 7.3
* fix(TDI-46572): tMap support Java17 (#4659)

* fix(TDI-46572):add jboss dependency to routines

* add to .m2

* fix(TDI-46572):advancedPersistentLookup lib upgrade

* replace advancedPersistentLookupLib jar

* change name

* format

* upgrade jar

* add back dependency

* remove LGPL dependency

* Remove binary jar and copy during build

* fix NPE

* test remove jboss from build
# Conflicts:
#	main/plugins/org.talend.libraries.persist.lookup/META-INF/MANIFEST.MF
#	main/plugins/org.talend.librariesmanager/META-INF/MANIFEST.MF
#	main/plugins/org.talend.librariesmanager/build.properties

* fix(TDI-46923):add back jboss marshalling (#4711)

# Conflicts:
#	main/plugins/org.talend.designer.maven.tos/resources/build/pom.xml

* fix(TDI-46937): fix tmap tuj (#4723)

* fix(TDI-46937): fix tmap tuj

* fix(TDI-46937):fix tuj

* fix(TDI-47147):tMap TUJ fix (#4817)

* Revert "fix(TDI-46937): fix tmap tuj (#4723)"

This reverts commit aacc14f92b.

* delete middle version
2022-12-26 14:38:14 +08:00
Jane Ding
0b7b156f22 Revert "fix(TUP-37227):Issue building when items names too long (#5837)" (#5890)
This reverts commit 30aa2d25a6.
2022-12-23 11:43:03 +08:00
Jane Ding
30aa2d25a6 fix(TUP-37227):Issue building when items names too long (#5837)
* fix(TUP-37227):Issue building when items names too long
https://jira.talendforge.org/browse/TUP-37227

* fix(TUP-37227):Issue building when items names too long
https://jira.talendforge.org/browse/TUP-37227
2022-12-19 12:00:44 +08:00
19 changed files with 187 additions and 130 deletions

View File

@@ -16,6 +16,7 @@ import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -154,6 +155,8 @@ public interface ILibraryManagerService extends IService {
public boolean contains(String jarName);
public void clearCache();
public void deployLibsFromCustomComponents(File componentFolder, List<ModuleNeeded> modulesNeeded);
@Deprecated
public Set<String> list(boolean withComponent, IProgressMonitor... monitorWrap);

View File

@@ -139,10 +139,15 @@
<version>1.21</version>
</dependency>
<dependency>
<groupId>org.apache-extras.beanshell</groupId>
<artifactId>bsh</artifactId>
<version>2.0b6</version>
</dependency>
<groupId>org.apache-extras.beanshell</groupId>
<artifactId>bsh</artifactId>
<version>2.0b6</version>
</dependency>
<dependency>
<groupId>org.jboss.marshalling</groupId>
<artifactId>jboss-marshalling</artifactId>
<version>2.0.12.Final</version>
</dependency>
</dependencies>
<build>
<plugins>

View File

@@ -10,7 +10,7 @@
<artifactId>studio-tacokit-dependencies</artifactId>
<packaging>pom</packaging>
<properties>
<tacokit.components.version>1.27.16</tacokit.components.version>
<tacokit.components.version>1.27.18</tacokit.components.version>
</properties>
<repositories>
<repository>

View File

@@ -11,7 +11,7 @@
<packaging>pom</packaging>
<properties>
<tcomp.version>1.38.6</tcomp.version>
<tcomp.version>1.38.8</tcomp.version>
<slf4j.version>1.7.32</slf4j.version>
<log4j2.version>2.17.1</log4j2.version>
<reload4j.version>1.2.19</reload4j.version>

View File

@@ -6,23 +6,23 @@
<classpathentry exported="true" kind="lib" path="lib/wsdl4j-1.6.3.jar"/>
<classpathentry exported="true" kind="lib" path="lib/istack-commons-runtime-3.0.12.jar"/>
<classpathentry exported="true" kind="lib" path="lib/jaxb-runtime-2.3.4.jar"/>
<classpathentry exported="true" kind="lib" path="lib/woodstox-core-6.2.6.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-core-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-bindings-soap-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-bindings-xml-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-databinding-jaxb-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-features-clustering-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-frontend-jaxrs-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-frontend-jaxws-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-frontend-simple-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-rs-client-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-security-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-security-saml-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-transports-http-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-ws-addr-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-wsdl-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-ws-policy-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-ws-security-3.4.7.jar"/>
<classpathentry exported="true" kind="lib" path="lib/woodstox-core-6.4.0.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-core-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-bindings-soap-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-bindings-xml-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-databinding-jaxb-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-features-clustering-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-frontend-jaxrs-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-frontend-jaxws-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-frontend-simple-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-rs-client-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-security-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-security-saml-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-transports-http-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-ws-addr-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-wsdl-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-ws-policy-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/cxf-rt-ws-security-3.5.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/jakarta.activation-1.2.2.jar"/>
<classpathentry exported="true" kind="lib" path="lib/jakarta.activation-api-1.2.2.jar"/>
<classpathentry exported="true" kind="lib" path="lib/jakarta.annotation-api-1.3.5.jar"/>

View File

@@ -5,22 +5,22 @@ Bundle-SymbolicName: org.talend.libraries.apache.cxf;singleton:=true
Bundle-Version: 7.3.1.qualifier
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .,
lib/cxf-core-3.4.7.jar,
lib/cxf-rt-bindings-soap-3.4.7.jar,
lib/cxf-rt-bindings-xml-3.4.7.jar,
lib/cxf-rt-databinding-jaxb-3.4.7.jar,
lib/cxf-rt-features-clustering-3.4.7.jar,
lib/cxf-rt-frontend-jaxrs-3.4.7.jar,
lib/cxf-rt-frontend-jaxws-3.4.7.jar,
lib/cxf-rt-frontend-simple-3.4.7.jar,
lib/cxf-rt-rs-client-3.4.7.jar,
lib/cxf-rt-security-3.4.7.jar,
lib/cxf-rt-security-saml-3.4.7.jar,
lib/cxf-rt-transports-http-3.4.7.jar,
lib/cxf-rt-ws-addr-3.4.7.jar,
lib/cxf-rt-wsdl-3.4.7.jar,
lib/cxf-rt-ws-security-3.4.7.jar,
lib/cxf-rt-ws-policy-3.4.7.jar,
lib/cxf-core-3.5.5.jar,
lib/cxf-rt-bindings-soap-3.5.5.jar,
lib/cxf-rt-bindings-xml-3.5.5.jar,
lib/cxf-rt-databinding-jaxb-3.5.5.jar,
lib/cxf-rt-features-clustering-3.5.5.jar,
lib/cxf-rt-frontend-jaxrs-3.5.5.jar,
lib/cxf-rt-frontend-jaxws-3.5.5.jar,
lib/cxf-rt-frontend-simple-3.5.5.jar,
lib/cxf-rt-rs-client-3.5.5.jar,
lib/cxf-rt-security-3.5.5.jar,
lib/cxf-rt-security-saml-3.5.5.jar,
lib/cxf-rt-transports-http-3.5.5.jar,
lib/cxf-rt-ws-addr-3.5.5.jar,
lib/cxf-rt-wsdl-3.5.5.jar,
lib/cxf-rt-ws-security-3.5.5.jar,
lib/cxf-rt-ws-policy-3.5.5.jar,
lib/istack-commons-runtime-3.0.12.jar,
lib/jakarta.activation-1.2.2.jar,
lib/jakarta.activation-api-1.2.2.jar,
@@ -35,7 +35,7 @@ Bundle-ClassPath: .,
lib/stax2-api-4.2.1.jar,
lib/txw2-2.3.4.jar,
lib/xmlschema-core-2.2.5.jar,
lib/woodstox-core-6.2.6.jar,
lib/woodstox-core-6.4.0.jar,
lib/wsdl4j-1.6.3.jar
Export-Package: javax.jws,
javax.ws.rs,

View File

@@ -11,7 +11,7 @@
<packaging>eclipse-plugin</packaging>
<properties>
<cxf.version>3.4.7</cxf.version>
<cxf.version>3.5.5</cxf.version>
</properties>
<repositories>
@@ -170,7 +170,7 @@
<dependency>
<groupId>com.fasterxml.woodstox</groupId>
<artifactId>woodstox-core</artifactId>
<version>6.2.6</version>
<version>6.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.ws.xmlschema</groupId>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry exported="true" kind="lib" path="lib/advancedPersistentLookupLib-1.2.jar"/>
<classpathentry exported="true" kind="lib" path="lib/advancedPersistentLookupLib-1.4.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/>

View File

@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
Bundle-Name: org.talend.libraries.persist.lookup
Bundle-SymbolicName: org.talend.libraries.persist.lookup
Bundle-Version: 7.3.1.qualifier
Bundle-ClassPath: lib/advancedPersistentLookupLib-1.2.jar,
.
Bundle-ClassPath: .,
lib/advancedPersistentLookupLib-1.4.jar
Export-Package: org.talend.commons.utils.data.map,
org.talend.commons.utils.time,
org.talend.core.model.process,

View File

@@ -2,4 +2,6 @@ source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
lib/advancedPersistentLookupLib-1.4.jar,\
lib/advancedPersistentLookupLib-1.3.jar,\
lib/advancedPersistentLookupLib-1.2.jar

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jardesc>
<jar path="D:/studio_code/tcommon-studio-se/main/plugins/org.talend.libraries.persist.lookup/lib/advancedPersistentLookupLib-1.2.jar"/>
<jar path="D:/studio_code/tcommon-studio-se/main/plugins/org.talend.libraries.persist.lookup/lib/advancedPersistentLookupLib-1.4.jar"/>
<options buildIfNeeded="true" compress="true" descriptionLocation="/org.talend.libraries.persist.lookup/export_advancedPersistentLookupLib.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="true" saveDescription="false" storeRefactorings="false" useSourceFolders="false"/>
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
<selectedProjects/>

View File

@@ -2,6 +2,7 @@
<classpath>
<classpathentry kind="src" path="src/main/java"/>
<classpathentry kind="src" path="resources/java"/>
<classpathentry exported="true" kind="lib" path="lib/jboss-marshalling-2.0.12.Final.jar"/>
<classpathentry kind="lib" path="lib/crypto-utils.jar"/>
<classpathentry kind="lib" path="lib/slf4j-api-1.7.25.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>

View File

@@ -28,7 +28,8 @@ Eclipse-LazyStart: true
Bundle-ClassPath: .,
lib/crypto-utils.jar,
lib/slf4j-api-1.7.25.jar
Export-Package: org.talend.librariesmanager.emf.librariesindex,
Export-Package: org.jboss.marshalling,
org.talend.librariesmanager.emf.librariesindex,
org.talend.librariesmanager.librarydata,
org.talend.librariesmanager.maven,
org.talend.librariesmanager.model,
@@ -40,3 +41,5 @@ Export-Package: org.talend.librariesmanager.emf.librariesindex,
Import-Package: org.eclipse.emf.ecore.xmi.impl,
org.talend.osgi.hook.notification
Eclipse-BundleShape: dir
Bundle-ClassPath: lib/jboss-marshalling-2.0.12.Final.jar,
.

View File

@@ -69,6 +69,12 @@
name="crypto-utils-0.31.12.jar">
</library>
</systemRoutine>
<systemRoutine
name="IPersistableLookupRow">
<library
name="mvn:org.jboss.marshalling/jboss-marshalling/2.0.12.Final">
</library>
</systemRoutine>
</extension>
<extension
point="org.talend.core.runtime.artifact_handler">

View File

@@ -51,6 +51,11 @@
<version>1.7.25</version>
<overWrite>true</overWrite>
</artifactItem>
<artifactItem>
<groupId>org.jboss.marshalling</groupId>
<artifactId>jboss-marshalling</artifactId>
<version>2.0.12.Final</version>
</artifactItem>
</artifactItems>
</configuration>
</execution>

View File

@@ -5,6 +5,9 @@ import java.io.DataOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.jboss.marshalling.Marshaller;
import org.jboss.marshalling.Unmarshaller;
public interface IPersistableLookupRow<R> {
public void writeKeysData(ObjectOutputStream out);
@@ -19,4 +22,25 @@ public interface IPersistableLookupRow<R> {
public void copyKeysDataTo(R other);
default public void writeKeysData(Marshaller marshaller){
//sub-class need to override this method
throw new UnsupportedOperationException("Method need to be override");
}
default public void readKeysData(Unmarshaller in){
throw new UnsupportedOperationException("Method need to be override");
}
default public void writeValuesData(DataOutputStream dataOut, Marshaller objectOut){
throw new UnsupportedOperationException("Method need to be override");
}
default public void readValuesData(DataInputStream dataIn, Unmarshaller objectIn){
throw new UnsupportedOperationException("Method need to be override");
}
default public boolean supportMarshaller(){
//Override this method to return true after implement the Jboss methods above
return false;
}
}

View File

@@ -3,10 +3,28 @@ package routines.system;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.jboss.marshalling.Marshaller;
import org.jboss.marshalling.Unmarshaller;
public interface IPersistableRow<R> {
public void writeData(ObjectOutputStream out);
public void readData(ObjectInputStream in);
default public void writeData(Marshaller marshaller){
//sub-class need to override this method
throw new UnsupportedOperationException("Method need to be override");
}
default public void readData(Unmarshaller in){
throw new UnsupportedOperationException("Method need to be override");
}
default public boolean supportJboss(){
//Override this method to return true after implement the Jboss methods above
return false;
}
}

View File

@@ -1319,11 +1319,81 @@ public class LocalLibraryManager implements ILibraryManagerService, IChangedLibr
saveMavenIndex(mavenURIMap, monitorWrap);
savePlatfromURLIndex(platformURLMap, monitorWrap);
if (service != null) {
deployLibsFromCustomComponents(service, platformURLMap);
}
return mavenURIMap;
}
public void deployLibsFromCustomComponents(File componentFolder, List<ModuleNeeded> modulesNeeded) {
if (modulesNeeded == null || modulesNeeded.isEmpty()) {
return;
}
Map<File, Set<MavenArtifact>> needToDeploy = new HashMap<File, Set<MavenArtifact>>();
modulesNeeded.forEach(module -> {
if (module != null) {
boolean needDeploy = false;
String mvnUri = module.getMavenUri();
String jarPathFromMaven = getJarPathFromMaven(StringUtils.isNotBlank(mvnUri) ? mvnUri : module.getModuleName());
if (StringUtils.isBlank(jarPathFromMaven)) {
needDeploy = true;
} else {
File jarFromMaven = new File(jarPathFromMaven);
if (!jarFromMaven.exists()) {
needDeploy = true;
}
}
if (needDeploy) {
File deployFile = getDeployJarFileByModule(componentFolder, module);
if (deployFile != null) {
install(deployFile, mvnUri, false, true, null);
if (needToDeploy.get(deployFile) == null) {
needToDeploy.put(deployFile, new HashSet<MavenArtifact>());
}
if (StringUtils.isNotBlank(mvnUri)) {
MavenArtifact mavenArtifact = MavenUrlHelper.parseMvnUrl(mvnUri);
needToDeploy.get(deployFile).add(mavenArtifact);
} else {
Map<String, String> sourceAndMavenUri = new HashMap<>();
guessMavenRUIFromIndex(deployFile, true, sourceAndMavenUri);
Set<MavenArtifact> MavenArtifactSet = new HashSet<MavenArtifact>();
sourceAndMavenUri.keySet().forEach(mavenUri -> {
if (StringUtils.isNotBlank(mvnUri)) {
MavenArtifactSet.add(MavenUrlHelper.parseMvnUrl(mavenUri));
}
});
needToDeploy.get(deployFile).addAll(MavenArtifactSet);
}
}
}
}
});
if (!needToDeploy.isEmpty()) {
ShareComponentsLibsJob shareJob = new ShareComponentsLibsJob(
Messages.getString("LocalLibraryManager.shareLibsForCustomponents"), needToDeploy, deployer);
shareJob.schedule();
}
}
private File getDeployJarFileByModule(File componentFolder, ModuleNeeded module) {
String mvnUri = module.getMavenUri();
if (StringUtils.isNotBlank(mvnUri)) {
MavenArtifact mavenArtifact = MavenUrlHelper.parseMvnUrl(mvnUri);
String fileName = mavenArtifact.getFileName();
File jarFile = new File(componentFolder, fileName);
if (jarFile.exists()) {
return jarFile;
}
}
// try module name
File jarFile = new File(componentFolder, module.getModuleName());
if (jarFile.exists()) {
return jarFile;
}
return null;
}
/**
*
@@ -1382,86 +1452,6 @@ public class LocalLibraryManager implements ILibraryManagerService, IChangedLibr
return false;
}
private void deployLibsFromCustomComponents(IComponentsService service, Map<String, String> platformURLMap) {
boolean deployToRemote = true;
if (!LibrariesManagerUtils.shareLibsAtStartup()) {
log.info("Skip deploying libs from custom components");
deployToRemote = false;
}
Map<File, Set<MavenArtifact>> needToDeploy = new HashMap<File, Set<MavenArtifact>>();
List<ComponentProviderInfo> componentsFolders = service.getComponentsFactory().getComponentsProvidersInfo();
for (ComponentProviderInfo providerInfo : componentsFolders) {
String id = providerInfo.getId();
try {
File file = new File(providerInfo.getLocation());
if (isExtComponentProvider(id)) {
if (file.isDirectory()) {
List<File> jarFiles = FilesUtils.getJarFilesFromFolder(file, null);
if (jarFiles.size() > 0) {
for (File jarFile : jarFiles) {
String name = jarFile.getName();
if (!canDeployFromCustomComponentFolder(name) || platformURLMap.get(name) != null) {
continue;
}
collectLibModules(jarFile, needToDeploy);
}
}
} else {
if (!canDeployFromCustomComponentFolder(file.getName()) || platformURLMap.get(file.getName()) != null) {
continue;
}
collectLibModules(file, needToDeploy);
}
}
} catch (Exception e) {
ExceptionHandler.process(e);
continue;
}
}
// first install them locally
needToDeploy.forEach((k, v) -> {
try {
// install as release version if can't find mvn url from index
install(k, null, false, true);
} catch (Exception e) {
ExceptionHandler.process(e);
}
});
if (!deployToRemote) {
return;
}
ShareComponentsLibsJob shareJob = new ShareComponentsLibsJob(
Messages.getString("LocalLibraryManager.shareLibsForCustomponents"), needToDeploy, deployer);
shareJob.schedule();
}
private void collectLibModules(File jarFile, Map<File, Set<MavenArtifact>> needToDeploy) {
Map<String,String> mavenUris = new HashMap<String,String>();
guessMavenRUIFromIndex(jarFile, true, mavenUris);
Set<MavenArtifact> artifacts = new HashSet<MavenArtifact>();
for(String uri: mavenUris.keySet()) {
MavenArtifact art = MavenUrlHelper.parseMvnUrl(uri);
if(art!=null) {
artifacts.add(art);
}
}
needToDeploy.put(jarFile, artifacts);
}
private boolean canDeployFromCustomComponentFolder(String fileName) {
if (isSystemCacheFile(fileName) || isComponentDefinitionFileType(fileName)) {
return false;
}
return true;
}
private void warnDuplicated(List<ModuleNeeded> modules, Set<String> duplicates, String type) {
for (String lib : duplicates) {
Set<String> components = new HashSet<>();