Compare commits

...

18 Commits

Author SHA1 Message Date
Zhiwei Xue
f62e85356c feat(TUP-29014): bugfix 2021-03-11 (#4116)
* feat(TUP-29014):init custom jar cache before migration tasks

* feat(TUP-29014): bugfix 2021-03-11
2021-03-11 16:24:47 +08:00
Chao MENG
81a6422c0b item(TUP-30180): Studio slowness on merge operation (#4066)
* fix(TUP-29390): Improve the file commit logic in RepositoryWorkUnit (#3901)

fix(TUP-29390): Improve the file commit logic in RepositoryWorkUnit during Pull and Merge
https://jira.talendforge.org/browse/TUP-29390

* fix(TUP-30103): [7.1.1] Studio somtimes hangs for 20 seconds
https://jira.talendforge.org/browse/TUP-30103

* fix(TUP-30103): [7.1.1] Studio somtimes hangs for 20 seconds
https://jira.talendforge.org/browse/TUP-30103

Conflicts:
	main/plugins/org.talend.designer.maven/src/main/java/org/talend/designer/maven/tools/AggregatorPomsHelper.java
2021-03-11 09:51:38 +08:00
Zhiwei Xue
941c36921b feat(TUP-29014):fix junit failure (#4112) 2021-03-10 11:43:05 +08:00
sbliu
e01cecfb68 feat(TUP-30338) Data Collector improvement step 1
* log action activation, log perspective switch.
* reset performance record after install patch, read/write info from/to new performance file location.
* set default DATA_COLLECTOR_UPLOAD_PERIOD to 5.
* don't send data when closing studio.
* When there is no action or dialog popped , check data collector enable, network enable, data send period, if need sent, try to send data.
2021-03-10 10:34:56 +08:00
Zhiwei Xue
9d3fb2213b feat(TUP-29014): Add only compile code projects function for TDM (#4109) 2021-03-09 15:51:25 +08:00
sbliu
aa4ccadbaf fix(TUP-29586) Change repository context variable type would pop up job update dialog. 2021-03-09 14:22:49 +08:00
Zhiwei Xue
1c7f2a311c feat(TUP-29014): Only build and package beans/routines that are used in Route/Job (#4028)
* feat(TUP-29018): Rearrange single routines into jars

* feat(TUP-29019): Generation and Build: Build routine jars in different
maven projects.

* feat(TUP-29019): Build routine jars in different maven projects

* feat(TUP-29019): fix codesjar cache and update job maven project problem

* feat(TUP-29019): fix several issues

* feat(TUP-29943):codejars under recycle bin should be hierarchy (#3979)

* feat(TUP-29943):codejars under recycle bin should be hierarchy
https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29943):codejars under recycle bin should be hierarchy
https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29014): refactor codesjar resource cache

* feat(TUP-29943):delete codejar forever should also delete child code (#3985)

items, include delete forever from recycle bin and empty recycle bin
Restore code should also restore parent node codeJar
https://jira.talendforge.org/browse/TUP-29943
Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29943):Fail to import custom Routine jar (#3987)

https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29014): fix codesjar dependencies can't set required issue

* feat(TUP-29943):delete forever should also delete codejar folder (#3991)

should not have duplicate nodes in import dialog
https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29943):delete forever should also delete codejar folder (#3992)

https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29943):import no value present issue and import to change inner (#4000)

code
https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29019):fix missing codesjar module in CI without -pl

* feat(TUP-29019): improve update codesjar project logic

* feat(TUP-29014): fix generate pom and sync inner code issues

* feat(TUP-29014): fix opeing ref inner codes issue

* feat(TUP-29014): fix missing codesjars module for regenerate poms issue

* feat(TUP-29943):delete folder issue and build job routinesJar (#4003)

* feat(TUP-29943):delete folder issue and build job routinesJar
relationship
https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29943):make impact analysis work for beansjar
https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29014):fix several import issue and build code jar problem

* feat(TUP-29014): avoid to fail all install if some code jar projects got
problem

* feat(TUP-29943): rename codejar should update package and folder path (#4012)

for inner code
https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29943):export and import to deploy libs issue (#4020)

https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29014):fix retrieve jar from nexus and aggregate build code jar
project issues

* feat(TUP-29014):fix several missing class in jar for custom jar issues

* feat(TUP-29014): update ref code projects after resolved dependencies

* Revert "feat(TUP-29014): update ref code projects after resolved dependencies"

This reverts commit e9256e359f.

* feat(TUP-29014): support shot class name for custom jars in component

* feat(TUP-29943):rename issues (#4044)

* feat(TUP-29943):rename issues
https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29943)disable duplicate for codejar and innercode
https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* fix(TUP-29014):fix generating code error.

* feat(TUP-29014): improve update codesjar project performance and fix
regression

* feat(TUP-29014):fix rename regressions and improve import performance

* feat(TUP-29943):fix some copy paste issues (#4069)

https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29014):fix codesjar modules not share problem

* feat(TUP-29014):fix git collaborative work issues

* feat(TUP-29943):image issue (#4071)

https://jira.talendforge.org/browse/TUP-29943

Signed-off-by: jding-tlnd <jding@talend.com>

* feat(TUP-29014):fix compilation error

* feat(TUP-29014):fix git pull deadlock and ref inner code sync issues

* fix(TESB-32252):Bundle is not compatible with this blueprint extender

* fix(TUP-30597):Fix junit failures caused by dependency management (#4099)

feature

* feat(TUP-29014):fix several git reset issues

* feat(TUP-29014): bugfix 2021-03-05

* feat(TUP-29014): bugfix 2021-03-08

* feat(TUP-29014): bugfix 2021-03-08 2

* feat(TUP-29014):bugfix 2021-03-09

Co-authored-by: Jane Ding <jding@talend.com>
2021-03-09 12:12:58 +08:00
hzhao-talendbj
0b7cba2a9d fix(TUP-29719): upgrade jackson to 2.11.4 (#4077) 2021-03-09 11:59:36 +08:00
nrousseau
f8dd9f0c1a Jzhang/73/tup 30093 (#4084)
* fix(TUP-30093)upgrade the commons-codec plugin

* TUP-30093 change crypto-utils

Co-authored-by: jiezhang-tlnd <jie.zhang@talend.com>
Co-authored-by: hzhao-talendbj <hzhao@talend.com>
2021-03-09 11:53:17 +08:00
bhe-talendbj
9c12a2e19e chore(TUP-27154): Upgrade commons-beanutils (#4017)
* chore(TUP-27154): Upgrade commons-beanutils

* TUP-27154 add include GroupIds to filter beanutils in generated in lib
folder

Co-authored-by: hzhao-talendbj <hzhao@talend.com>
2021-03-08 14:32:11 +08:00
Dmytro Sylaiev
a2132cb833 feat(TDI-45721): Bump TCK version for monthly (#4105) 2021-03-05 14:02:06 +02:00
jiezhang-tlnd
ed4655f2aa chore(TUP-27791 )remove feature (#4039) 2021-03-05 17:11:55 +08:00
jiezhang-tlnd
910e3fb601 TUP-26534 (#3400) (#4016)
* TUP-26534

* TUP-26534  revert for EHiveWithTezJars

* remove unknown version

Co-authored-by: hzhao-talendbj <49395568+hzhao-talendbj@users.noreply.github.com>
Co-authored-by: hzhao-talendbj <hzhao@talend.com>
2021-03-05 14:43:20 +08:00
hzhao-talendbj
bda6b0a1a7 fix(TUP-30269) Snowflake components having schema cannot retrieve column (#4076)
* fix(TUP-30269) Snowflake components having schema cannot retrieve column
name in Japanese

* TUP-30269 fix when uncheck allowspecialchar will generate column0 always

* TUP-30269 add junit
2021-03-04 15:29:25 +08:00
Emmanuel GALLOIS
4ad4d3e5b2 feat(TDI-45704): bump component-runtime to 1.30.0 (#4091) 2021-03-03 10:05:59 +01:00
wang wei
8031d9adb3 fix(TDI-45563): Runtime Lineage: Compile error seen with "RESPONSE_HEADERS"(#4046) 2021-03-03 16:11:02 +08:00
jiezhang-tlnd
74232f3dc3 chore(TUP-27224)Update Daikon Crypto Utils to 1.15.0 (#4034)
* chore(TUP-27224)Update Daikon Crypto Utils to 1.15.0

* chore(TUP-27224)Update Daikon Crypto Utils to 1.15.0

* fix(TUP-27224)Update Daikon Crypto Utils to 1.15.0
2021-03-01 15:04:33 +08:00
bhe-talendbj
b2e5ab5630 chore(TUP-30230): Remove org.talend.libraries.apache.batik (#4014)
* chore(TUP-30230): Remove org.talend.libraries.apache.batik

* chore(TUP-30230): Remove org.talend.libraries.apache.batik
2021-02-26 14:39:18 +08:00
180 changed files with 5058 additions and 980 deletions

View File

@@ -6,7 +6,6 @@
<license url="http://www.example.com/license">[Enter License Description here.]</license>
<plugin id="org.talend.libraries.jdbc.access" download-size="0" install-size="0" version="0.0.0"/>
<plugin id="org.talend.libraries.jdbc.as400" download-size="0" install-size="0" version="0.0.0"/>
<plugin id="org.talend.libraries.jdbc.derby" download-size="0" install-size="0" version="0.0.0"/>
<plugin id="org.talend.libraries.jdbc.exasol" download-size="0" install-size="0" version="0.0.0"/>
<plugin id="org.talend.libraries.jdbc.h2" download-size="0" install-size="0" version="0.0.0"/>
<plugin id="org.talend.libraries.jdbc.hsql" download-size="0" install-size="0" version="0.0.0"/>

View File

@@ -12,7 +12,7 @@
<import plugin="com.thoughtworks.paranamer" version="0.0.0" match="greaterOrEqual"/>
<import plugin="jackson-core-asl" version="0.0.0" match="greaterOrEqual"/>
<import plugin="jackson-mapper-asl" version="0.0.0" match="greaterOrEqual"/>
<import plugin="org.apache.commons.codec" version="0.0.0" match="greaterOrEqual"/>
<import plugin="org.apache.commons.codec" version="1.14.0" match="greaterOrEqual"/>
<import plugin="org.apache.commons.compress" version="1.10.0" match="greaterOrEqual"/>
<import plugin="org.apache.commons.lang" version="0.0.0" match="greaterOrEqual"/>
<import plugin="org.apache.commons.lang3" version="0.0.0" match="greaterOrEqual"/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 B

View File

@@ -77,6 +77,7 @@ public enum ECoreImage implements IImage {
ROUTES_ICON("/icons1/routes_icon.png"), //$NON-NLS-1$
ROUTINE_ICON("/icons1/routine.png"), //$NON-NLS-1$
ROUTINE_EDITOR_ICON("/icons1/routine_editor.png"), //$NON-NLS-1$
ROUTINESJAR_ICON("/icons1/routinesjar.png"), //$NON-NLS-1$
JOB_SCRIPTS_ICON("/icons1/job_scripts.png"), //$NON-NLS-1$
JOB_SCRIPTS_TOOLBAR_ICON("/icons1/job_script_toolbar.png"), //$NON-NLS-1$
FTP_ICON("/icons1/ftp.png"), //$NON-NLS-1$

View File

@@ -92,7 +92,7 @@
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.11.0</version>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>

View File

@@ -13,13 +13,13 @@
package org.talend.commons.utils.time;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Properties;
import java.util.Random;
import java.util.concurrent.TimeUnit;
@@ -82,7 +82,7 @@ public class PerformanceStatisticUtil {
public static void recordStartupEpapsedTime(double elapsedTimeInSeconds) {
File file = getRecordingFile();
Properties props = read(file, true);
Properties props = PropertiesFileUtil.read(file, true);
String propCount = props.getProperty(StatisticKeys.STARTUP_COUNT.get(), "0");
String propMax = props.getProperty(StatisticKeys.STARTUP_MAX.get(), "0");
String propAverage = props.getProperty(StatisticKeys.STARTUP_AVERAGE.get(), "0");
@@ -99,7 +99,7 @@ public class PerformanceStatisticUtil {
props.setProperty(StatisticKeys.STARTUP_MAX.get(), "" + iPropMax);
props.setProperty(StatisticKeys.STARTUP_AVERAGE.get(), "" + iPropAverage);
store(file, props);
PropertiesFileUtil.store(file, props);
}
public static File getRecordingFile() {
@@ -108,75 +108,41 @@ public class PerformanceStatisticUtil {
}
String configurationLocation = Platform.getConfigurationLocation().getURL().getPath();
File file = new File(configurationLocation + "/" + recordingFileName);
File file = new File(configurationLocation + "/data_collector/" + recordingFileName);
File oldFile = new File(configurationLocation + "/" + recordingFileName);
if(oldFile.exists()) {
if(!file.exists()) {
if(!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try {
Files.move(Paths.get(oldFile.toURI()), Paths.get(file.toURI()), StandardCopyOption.ATOMIC_MOVE);
} catch (IOException e) {
CommonExceptionHandler.log(e.getMessage());
}
}
try {
Files.deleteIfExists(Paths.get(oldFile.toURI()));
} catch (IOException e) {
CommonExceptionHandler.log(e.getMessage());
}
}
return file;
}
public static void setRecordingFile(File _recordingFile) {
recordingFile = _recordingFile;
}
public static synchronized Properties read(File recordFile, boolean createIfNotExist) {
Properties props = new Properties();
if (recordFile != null && exist(recordFile, createIfNotExist)) {
FileInputStream inStream = null;
try {
inStream = new FileInputStream(recordFile);
props.load(inStream);
} catch (Exception e) {
CommonExceptionHandler.log(e.getMessage());
} finally {
if (inStream != null) {
try {
inStream.close();
} catch (IOException e) {//
}
}
}
public static void reset() {
File _recordingFile = getRecordingFile();
try {
Files.deleteIfExists(Paths.get(_recordingFile.toURI()));
} catch (IOException e) {
CommonExceptionHandler.log(e.getMessage());
}
return props;
}
public static synchronized void store(File recordFile, Properties props) {
if (props == null) {
return;
}
if (recordFile != null && exist(recordFile, true)) {
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(recordFile);
props.store(outputStream, "");
} catch (IOException e) {
CommonExceptionHandler.log(e.getMessage());
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
//
}
}
}
}
}
private static boolean exist(File recordFile, boolean createIfNotExist) {
boolean exists = recordFile.exists();
if (!exists && createIfNotExist) {
try {
exists = recordFile.createNewFile();
if (!exists) {
throw new FileNotFoundException(recordFile.getName());
}
} catch (Exception e) {
CommonExceptionHandler.log(e.getMessage());
return false;
}
}
return exists;
}
private static Lock lock = new ReentrantLock();
@@ -210,7 +176,7 @@ public class PerformanceStatisticUtil {
private static void _measureIO() {
File file = getRecordingFile();
Properties props = read(file, true);
Properties props = PropertiesFileUtil.read(file, true);
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
File workspace = root.getLocation().makeAbsolute().toFile();
@@ -221,7 +187,7 @@ public class PerformanceStatisticUtil {
measureWrite(props, testFile);
measureRead(props, testFile);
store(file, props);
PropertiesFileUtil.store(file, props);
}
}

View File

@@ -0,0 +1,93 @@
// ============================================================================
//
// Copyright (C) 2006-2021 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.commons.utils.time;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import org.talend.commons.exception.CommonExceptionHandler;
/**
* DOC sbliu class global comment. Detailled comment
*/
public class PropertiesFileUtil {
public static synchronized Properties read(File recordFile, boolean createIfNotExist) {
Properties props = new Properties();
if (recordFile != null && exist(recordFile, createIfNotExist)) {
FileInputStream inStream = null;
try {
inStream = new FileInputStream(recordFile);
props.load(inStream);
} catch (Exception e) {
CommonExceptionHandler.log(e.getMessage());
} finally {
if (inStream != null) {
try {
inStream.close();
} catch (IOException e) {//
}
}
}
}
return props;
}
public static synchronized void store(File recordFile, Properties props) {
if (props == null) {
return;
}
if (recordFile != null && exist(recordFile, true)) {
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(recordFile);
props.store(outputStream, "");
} catch (IOException e) {
CommonExceptionHandler.log(e.getMessage());
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
//
}
}
}
}
}
public static boolean exist(File recordFile, boolean createIfNotExist) {
boolean exists = recordFile.exists();
if (!exists && createIfNotExist) {
try {
if(!recordFile.getParentFile().exists()) {
recordFile.getParentFile().mkdirs();
}
exists = recordFile.createNewFile();
if (!exists) {
throw new FileNotFoundException(recordFile.getName());
}
} catch (Exception e) {
CommonExceptionHandler.log(e.getMessage());
return false;
}
}
return exists;
}
}

View File

@@ -21,6 +21,7 @@ import org.talend.core.model.properties.Item;
import org.talend.core.model.relationship.AbstractJobItemRelationshipHandler;
import org.talend.core.model.relationship.Relation;
import org.talend.core.model.relationship.RelationshipItemBuilder;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.designer.core.model.utils.emf.talendfile.ProcessType;
import org.talend.designer.core.model.utils.emf.talendfile.RoutinesParameterType;
@@ -47,14 +48,24 @@ public class JobRoutinesItemRelationshipHandler extends AbstractJobItemRelations
Map<String, String> currentSystemRoutinesMap = RelationshipItemBuilder.getInstance().getCurrentSystemRoutinesMap();
for (Object o : processType.getParameters().getRoutinesParameter()) {
RoutinesParameterType itemInfor = (RoutinesParameterType) o;
if (currentSystemRoutinesMap.containsValue(itemInfor.getName())) {
if (itemInfor.getName() != null && currentSystemRoutinesMap.containsValue(itemInfor.getName())) {
// exclude system routines relation
continue;
}
Relation addedRelation = new Relation();
addedRelation.setId(itemInfor.getName());
addedRelation.setType(RelationshipItemBuilder.ROUTINE_RELATION);
if (ERepositoryObjectType.ROUTINESJAR != null
&& ERepositoryObjectType.ROUTINESJAR.getType().equals(itemInfor.getType())) {
addedRelation.setId(itemInfor.getId());
addedRelation.setType(RelationshipItemBuilder.ROUTINES_JAR_RELATION);
} else if (ERepositoryObjectType.BEANSJAR != null
&& ERepositoryObjectType.BEANSJAR.getType().equals(itemInfor.getType())) {
addedRelation.setId(itemInfor.getId());
addedRelation.setType(RelationshipItemBuilder.BEANS_JAR_RELATION);
} else {
addedRelation.setId(itemInfor.getName());
addedRelation.setType(RelationshipItemBuilder.ROUTINE_RELATION);
}
addedRelation.setVersion(RelationshipItemBuilder.LATEST_VERSION);
relationSet.add(addedRelation);

View File

@@ -15,6 +15,7 @@ package org.talend.core.repository.model;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -186,7 +187,7 @@ public interface IRepositoryFactory {
* @throws PersistenceException
*/
public List<IRepositoryViewObject> getAll(Project project, ERepositoryObjectType type, boolean withDeleted,
boolean allVersions) throws PersistenceException;
boolean allVersions, IFolder... folders) throws PersistenceException;
/**
* Deletes logically the given object. <code>isDeleted</code> on this object will now returned <code>true</code>.

View File

@@ -20,6 +20,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.apache.commons.lang.ArrayUtils;
@@ -675,6 +676,9 @@ public class ProjectRepositoryNode extends RepositoryNode implements IProjectRep
}
}
List<IRepositoryViewObject> codeObjectList = new ArrayList<IRepositoryViewObject>();
Map<String, List<RepositoryNode>> labelCodeJarMap = new HashMap<String, List<RepositoryNode>>();
for (IRepositoryViewObject currentObject : elements) {
RepositoryNode parent = getFolder(currentObject.getRepositoryObjectType(), currentObject.getPath(), rootNodes);
RepositoryNode parentNode = parent;
@@ -682,20 +686,69 @@ public class ProjectRepositoryNode extends RepositoryNode implements IProjectRep
parentNode = rootNode;
}
if (currentObject.isDeleted()) {
boolean isCodeJarType = false;
ERepositoryObjectType repositoryObjectType = currentObject.getRepositoryObjectType();
if (ERepositoryObjectType.getAllTypesOfCodes().contains(repositoryObjectType)) {
codeObjectList.add(currentObject);
continue;
} else if (ERepositoryObjectType.getAllTypesOfCodesJar().contains(repositoryObjectType)) {
isCodeJarType = true;
}
RepositoryNode repNode = new RepositoryNode(new RepositoryViewObject(currentObject.getProperty()), parentNode,
ENodeType.REPOSITORY_ELEMENT);
repNode.setProperties(EProperties.CONTENT_TYPE, currentObject.getRepositoryObjectType());
repNode.setProperties(EProperties.LABEL, currentObject.getLabel());
parentNode.getChildren().add(repNode);
repNode.setParent(parentNode);
if (isCodeJarType) {
String label = currentObject.getProperty().getLabel();
if (labelCodeJarMap.get(label) == null) {
labelCodeJarMap.put(label, new ArrayList<RepositoryNode>());
}
labelCodeJarMap.get(label).add(repNode);
}
} else {
addDeletedSubItems(currentObject.getProperty().getItem(), parentNode);
}
}
addDeletedCode(rootNode, codeObjectList, labelCodeJarMap);
objects.removeAll(elements);
addDeletedTestCases(rootNode, objects);
}
private void addDeletedCode(RepositoryNode rootNode, List<IRepositoryViewObject> codeObjectList, Map<String, List<RepositoryNode>> labelCodeJarMap) {
List<IRepositoryNode> rootNodes = rootNode.getChildren();
for (IRepositoryViewObject codeObject : codeObjectList) {
ERepositoryObjectType objectType = codeObject.getRepositoryObjectType();
RepositoryNode parent = getFolder(codeObject.getRepositoryObjectType(), codeObject.getPath(), rootNodes);
RepositoryNode parentNode = parent;
if (parentNode == null) {
parentNode = rootNode;
}
Item parentItem = (Item) codeObject.getProperty().getItem().getParent();
String folderItemLabel = parentItem.getProperty().getLabel();
if (labelCodeJarMap.get(folderItemLabel) != null) {
Optional node = labelCodeJarMap.get(folderItemLabel).stream()
.filter(n -> ERepositoryObjectType.CodeTypeEnum.isCodeRepositoryObjectTypeMatch(n.getObjectType(),
objectType))
.findFirst();
if (node.isPresent()) {
parentNode = (RepositoryNode) node.get();
}
}
RepositoryNode repNode = new RepositoryNode(new RepositoryViewObject(codeObject.getProperty()), parentNode,
ENodeType.REPOSITORY_ELEMENT);
repNode.setProperties(EProperties.CONTENT_TYPE, objectType);
repNode.setProperties(EProperties.LABEL, codeObject.getLabel());
parentNode.getChildren().add(repNode);
repNode.setParent(parentNode);
}
}
/**
* DOC nrousseau Comment method "addDeletedElements".
*

View File

@@ -25,6 +25,7 @@ import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
@@ -106,6 +107,7 @@ import org.talend.core.model.properties.ProcessItem;
import org.talend.core.model.properties.ProjectReference;
import org.talend.core.model.properties.PropertiesPackage;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.properties.SpagoBiServer;
import org.talend.core.model.properties.Status;
import org.talend.core.model.properties.User;
@@ -138,6 +140,7 @@ import org.talend.core.runtime.util.ItemDateParser;
import org.talend.core.runtime.util.SharedStudioUtils;
import org.talend.core.service.ICoreUIService;
import org.talend.core.service.IUpdateService;
import org.talend.core.utils.CodesJarResourceCache;
import org.talend.cwm.helper.SubItemHelper;
import org.talend.cwm.helper.TableHelper;
import org.talend.designer.runprocess.IRunProcessService;
@@ -1348,6 +1351,41 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
return this.repositoryFactoryFromProvider.getAll(projectManager.getCurrentProject(), type, withDeleted, allVersions);
}
@Override
public List<IRepositoryViewObject> getAll(Project project, ERepositoryObjectType type, boolean withDeleted,
boolean allVersions, IFolder... folders) throws PersistenceException {
return this.repositoryFactoryFromProvider.getAll(project, type, withDeleted, allVersions, folders);
}
@Override
public List<IRepositoryViewObject> getAllCodesJars(ERepositoryObjectType type) throws PersistenceException {
return getAllCodesJars(projectManager.getCurrentProject(), type);
}
@Override
public List<IRepositoryViewObject> getAllCodesJars(Project project, ERepositoryObjectType type) throws PersistenceException {
return getAll(project, type).stream().filter(obj -> !(obj.getProperty().getItem() instanceof RoutineItem))
.collect(Collectors.toList());
}
@Override
public List<IRepositoryViewObject> getAllInnerCodes(ERepositoryObjectType codesJarType, Property jarProperty)
throws PersistenceException {
return getAllInnerCodes(projectManager.getCurrentProject(), codesJarType, jarProperty);
}
@Override
public List<IRepositoryViewObject> getAllInnerCodes(Project project, ERepositoryObjectType codesJarType, Property jarProperty)
throws PersistenceException {
// empty folder won't be commit in git, create if not exist
IFolder folder = ResourceUtils.getProject(project).getFolder(ERepositoryObjectType.getFolderName(codesJarType))
.getFolder(jarProperty.getLabel());
if (!folder.exists()) {
ResourceUtils.createFolder(folder);
}
return repositoryFactoryFromProvider.getAll(project, codesJarType, false, false, folder);
}
@Override
public List<String> getFolders(ERepositoryObjectType type) throws PersistenceException {
return getFolders(projectManager.getCurrentProject(), type);
@@ -2213,6 +2251,8 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
ExceptionHandler.process(e);
}
CodesJarResourceCache.initCodesJarCache();
currentMonitor = subMonitor.newChild(1, SubMonitor.SUPPRESS_NONE);
currentMonitor.beginTask("Execute before logon migrations tasks", 1); //$NON-NLS-1$
ProjectManager.getInstance().getMigrationRecords().clear();

View File

@@ -36,7 +36,6 @@ import org.eclipse.swt.widgets.Display;
import org.talend.commons.exception.BusinessException;
import org.talend.commons.exception.LoginException;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.exception.SystemException;
import org.talend.commons.runtime.model.repository.ERepositoryStatus;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.core.GlobalServiceRegister;
@@ -54,11 +53,16 @@ import org.talend.core.model.properties.SQLPatternItem;
import org.talend.core.model.relationship.RelationshipItemBuilder;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.routines.CodesJarInfo;
import org.talend.core.model.routines.RoutinesUtil;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.repository.ui.dialog.PastSelectorDialog;
import org.talend.core.repository.utils.RoutineUtils;
import org.talend.core.runtime.services.IDesignerMavenService;
import org.talend.core.runtime.services.IGenericDBService;
import org.talend.core.ui.ICDCProviderService;
import org.talend.core.ui.ITestContainerProviderService;
import org.talend.core.utils.CodesJarResourceCache;
import org.talend.designer.codegen.ICodeGeneratorService;
import org.talend.repository.RepositoryWorkUnit;
import org.talend.repository.model.IProxyRepositoryFactory;
@@ -125,6 +129,44 @@ public class CopyObjectAction {
// return false;
// }
// disable copy for codejar
ERepositoryObjectType sourceObjectType = objectToCopy.getRepositoryObjectType();
if (ERepositoryObjectType.getAllTypesOfCodesJar().contains(sourceObjectType)) {
return false;
}
// disable paste between global code and custom code
if (ERepositoryObjectType.getAllTypesOfCodes().contains(sourceObjectType) && targetNode != null) {
IRepositoryViewObject targetObject = targetNode.getObject();
boolean isInnerCodeSourceNode = RoutinesUtil.isInnerCodes(objectToCopy.getProperty());
if (targetObject != null) {
if (sourceObjectType.equals(targetObject.getRepositoryObjectType())) {
return isInnerCodeSourceNode && RoutinesUtil.isInnerCodes(targetObject.getProperty());
}
if (isInnerCodeSourceNode
&& !ERepositoryObjectType.getAllTypesOfCodesJar().contains(targetObject.getRepositoryObjectType())) {
return false;
}
if (!isInnerCodeSourceNode
&& ERepositoryObjectType.getAllTypesOfCodesJar().contains(targetObject.getRepositoryObjectType())) {
return false;
}
} else {
// system folder node
if (isInnerCodeSourceNode) {
return false;
} else {
ERepositoryObjectType targetType = ((ERepositoryObjectType) targetNode
.getProperties(EProperties.CONTENT_TYPE));
if (ERepositoryObjectType.getAllTypesOfCodesJar().contains(targetType)) {
return false;
}
}
}
}
// Cannot copy system routines:
if (objectToCopy.getRepositoryObjectType() == ERepositoryObjectType.ROUTINES) {
Property property = objectToCopy.getProperty();
@@ -193,7 +235,8 @@ public class CopyObjectAction {
}
// for bug 0005454: Copy paste with keyboard in the repository view doesn't work.
if (targetNode.getType() == ENodeType.REPOSITORY_ELEMENT) {
if (targetNode.getType() == ENodeType.REPOSITORY_ELEMENT
&& !ERepositoryObjectType.getAllTypesOfCodesJar().contains(targetNode.getObjectType())) {
targetNode = targetNode.getParent();
}
@@ -471,9 +514,23 @@ public class CopyObjectAction {
ICodeGeneratorService.class);
if (codeGenService != null) {
codeGenService.createRoutineSynchronizer().renameRoutineClass(item);
boolean isInnerCode = RoutinesUtil.isInnerCodes(item.getProperty());
if (isInnerCode) {
RoutineUtils.changeInnerCodePackage(item, true);
}
try {
codeGenService.createRoutineSynchronizer().syncRoutine(item, true);
} catch (SystemException e) {
if (isInnerCode) {
CodesJarInfo info = CodesJarResourceCache.getCodesJarByInnerCode(item);
if (info.getProperty() != null) {
IDesignerMavenService designerMavenService = IDesignerMavenService.get();
if (designerMavenService != null) {
designerMavenService.updateCodeJarMavenProject(info.getProperty(), false);
}
}
}
} catch (Exception e) {
ExceptionHandler.process(e);
}
}

View File

@@ -111,7 +111,8 @@ public class CreateFolderAction extends AContextualAction {
|| property.equals(ERepositoryObjectType.JOB_DOC) || property.equals(ERepositoryObjectType.JOBLET_DOC)
|| ERepositoryObjectType.SQLPATTERNS.equals(property)
|| ERepositoryObjectType.REFERENCED_PROJECTS.equals(property)
|| ERepositoryObjectType.SVN_ROOT.equals(property)) {
|| ERepositoryObjectType.SVN_ROOT.equals(property) || ERepositoryObjectType.ROUTINESJAR.equals(property)
|| property.equals(ERepositoryObjectType.BEANSJAR)) {
canWork = false;
} else if (property != null
&& GlobalServiceRegister.getDefault().isServiceRegistered(ICamelDesignerCoreService.class)) {

View File

@@ -21,6 +21,7 @@ import java.util.List;
import java.util.Set;
import org.apache.commons.collections.map.MultiKeyMap;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
@@ -54,6 +55,7 @@ import org.talend.commons.ui.runtime.exception.MessageBoxExceptionHandler;
import org.talend.commons.ui.runtime.image.EImage;
import org.talend.commons.ui.runtime.image.ImageProvider;
import org.talend.commons.utils.data.container.RootContainer;
import org.talend.commons.utils.workbench.resources.ResourceUtils;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.IESBService;
import org.talend.core.ITDQRepositoryService;
@@ -714,6 +716,7 @@ public class DeleteAction extends AContextualAction {
removeConnFromSQLExplorer(repositoryNode);
List<IRepositoryViewObject> batchDeleteObjectList = new ArrayList<IRepositoryViewObject>();
deleteTestCases(factory, deleteActionCache, repositoryNode, null, batchDeleteObjectList);
deleteCodeSubItem(factory, deleteActionCache, repositoryNode, null, true);
return true;
}
@@ -1456,10 +1459,11 @@ public class DeleteAction extends AContextualAction {
ITestContainerProviderService testService = (ITestContainerProviderService) GlobalServiceRegister.getDefault()
.getService(ITestContainerProviderService.class);
if(testService != null){
testService.deleteDataFiles(objToDelete);
}
testService.deleteDataFiles(objToDelete);
}
// delete codejar forever need to delete subitem also
deleteCodeSubItem(factory, deleteActionCache, currentJobNode, confirm, false);
if (!ProjectManager.getInstance().getCurrentProject().isLocal()) {
// if remote,batch delete later
@@ -1482,14 +1486,47 @@ public class DeleteAction extends AContextualAction {
factory.deleteObjectLogical(objToDelete);
updateRelatedViews();
removeConnFromSQLExplorer(currentJobNode);
List<IRepositoryViewObject> deleteObjectList = new ArrayList<IRepositoryViewObject>();
deleteTestCases(factory, deleteActionCache, currentJobNode, confirm, null);
deleteCodeSubItem(factory, deleteActionCache, currentJobNode, confirm, true);
}
}
return needReturn;
}
private void deleteCodeSubItem(IProxyRepositoryFactory factory, DeleteActionCache deleteActionCache,
final IRepositoryNode currentJobNode, Boolean confirm, boolean logicalDelete)
throws PersistenceException, BusinessException {
if (!ERepositoryObjectType.getAllTypesOfCodesJar().contains(currentJobNode.getObjectType())) {
return;
}
if (!currentJobNode.getChildren().isEmpty()) {
List<IRepositoryViewObject> deleteObjectList = new ArrayList<IRepositoryViewObject>();
for (IRepositoryNode child : currentJobNode.getChildren()) {
deleteElements(factory, deleteActionCache, (RepositoryNode) child, confirm, deleteObjectList);
}
if (deleteObjectList != null && deleteObjectList.size() > 0) {
factory.batchDeleteObjectPhysical4Remote(ProjectManager.getInstance().getCurrentProject(), deleteObjectList);
}
}
// delete forever to delete codeJar folder
if (!logicalDelete) {
IFolder folder = ResourceUtils
.getFolder(ResourceUtils.getProject(ProjectManager.getInstance().getCurrentProject()),
ERepositoryObjectType.getFolderName(currentJobNode.getObjectType()), true)
.getFolder(currentJobNode.getObject().getProperty().getLabel());
if (folder != null) {
try {
folder.delete(false, null);
} catch (CoreException e) {
throw new PersistenceException(e);
}
}
}
}
private void deleteTestCases(IProxyRepositoryFactory factory, DeleteActionCache deleteActionCache,
final IRepositoryNode currentJobNode, Boolean confirm, List<IRepositoryViewObject> batchDeleteObjectList)
throws PersistenceException, BusinessException {

View File

@@ -74,6 +74,7 @@ import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryContentHandler;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.repository.RepositoryContentManager;
import org.talend.core.model.routines.RoutinesUtil;
import org.talend.core.repository.i18n.Messages;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.repository.ui.dialog.DuplicateDialog;
@@ -145,8 +146,14 @@ public class DuplicateAction extends AContextualAction {
canWork = false;
} else if (((StructuredSelection) selection).toArray().length == 1) {
Object obj = ((StructuredSelection) selection).toList().get(0);
RepositoryNode sourceNode = (RepositoryNode) obj;
// disable duplicate for codejar / innercode now
if (ERepositoryObjectType.getAllTypesOfCodesJar().contains(sourceNode.getObjectType())
|| sourceNode.getObject() != null && sourceNode.getObject().getProperty() != null
&& RoutinesUtil.isInnerCodes(sourceNode.getObject().getProperty())) {
canWork = false;
}
if (canWork) {
RepositoryNode sourceNode = (RepositoryNode) obj;
if (!CopyObjectAction.getInstance().validateAction(sourceNode, null)) {
canWork = false;
} else if (node.getProperties(EProperties.CONTENT_TYPE) == ERepositoryObjectType.JOB_DOC

View File

@@ -16,6 +16,7 @@ import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
@@ -45,6 +46,7 @@ import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.commons.ui.runtime.exception.MessageBoxExceptionHandler;
import org.talend.commons.ui.runtime.image.ECoreImage;
import org.talend.commons.ui.runtime.image.ImageProvider;
import org.talend.commons.utils.workbench.resources.ResourceUtils;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.ITDQRepositoryService;
import org.talend.core.model.properties.ConnectionItem;
@@ -343,6 +345,7 @@ public class EmptyRecycleBinAction extends AContextualAction {
testService.deleteDataFiles(objToDelete);
}
}
deleteCodeSubItem(factory, currentNode);
if (!ProjectManager.getInstance().getCurrentProject().isLocal()) {
// if remote, batch delete later
batchDeleteObjectList.add(objToDelete);
@@ -355,6 +358,36 @@ public class EmptyRecycleBinAction extends AContextualAction {
}
}
private void deleteCodeSubItem(IProxyRepositoryFactory factory, final IRepositoryNode currentNode)
throws PersistenceException, BusinessException {
if (!ERepositoryObjectType.getAllTypesOfCodesJar().contains(currentNode.getObjectType())) {
return;
}
if (!currentNode.getChildren().isEmpty()) {
List<IRepositoryViewObject> deleteObjectList = new ArrayList<IRepositoryViewObject>();
for (IRepositoryNode child : currentNode.getChildren()) {
deleteElements(factory, (RepositoryNode) child, deleteObjectList);
}
if (deleteObjectList != null && deleteObjectList.size() > 0) {
factory.batchDeleteObjectPhysical4Remote(ProjectManager.getInstance().getCurrentProject(), deleteObjectList);
}
}
// delete forever to delete codeJar folder
IFolder folder = ResourceUtils
.getFolder(ResourceUtils.getProject(ProjectManager.getInstance().getCurrentProject()),
ERepositoryObjectType.getFolderName(currentNode.getObjectType()), true)
.getFolder(currentNode.getObject().getProperty().getLabel());
if (folder != null) {
try {
folder.delete(false, null);
} catch (CoreException e) {
throw new PersistenceException(e);
}
}
}
protected boolean isRelation(IEditorInput editorInput, String repoNodeProjectLabel, String repoNodeId) {
IRepoViewLinker[] allRepoViewLinkers = RepoViewLinkerRegistryReader.getInstance().getAllRepoViewLinkers();
for (IRepoViewLinker linker : allRepoViewLinkers) {

View File

@@ -193,7 +193,8 @@ public class RestoreAction extends AContextualAction {
node = node.getParent();
if ((node.getObject().getProperty().getItem() instanceof FolderItem)) {
node.getObject().getProperty().getItem().getState().setDeleted(false);
} else if (isTestcase) {
} else if (isTestcase
|| ERepositoryObjectType.getAllTypesOfCodesJar().contains(node.getObjectType())) {
restoreNode(node);
}
}

View File

@@ -389,6 +389,14 @@ public class RepositoryLabelProvider extends LabelProvider implements IColorProv
case STABLE_SYSTEM_FOLDER:
case SYSTEM_FOLDER:
ERepositoryObjectType contentType = node.getContentType();
if (contentType != null) {
// special setting for system codeJar node
if (contentType.equals(ERepositoryObjectType.ROUTINESJAR)) {
nodeIcon = RepositoryImageProvider.getIcon(ERepositoryObjectType.ROUTINES);
} else if (contentType.equals(ERepositoryObjectType.BEANSJAR)) {
nodeIcon = RepositoryImageProvider.getIcon(ERepositoryObjectType.BEANS);
}
}
if (nodeIcon == null || EImage.DEFAULT_IMAGE.equals(nodeIcon)) {
Image image = getImageFromFramework(contentType);
if (image != null) {

View File

@@ -22,6 +22,7 @@ import org.talend.core.model.properties.ByteArray;
import org.talend.core.model.properties.FileItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.ProcessItem;
import org.talend.core.model.properties.RoutinesJarItem;
import org.talend.core.model.repository.AbstractRepositoryContentHandler;
import org.talend.core.model.repository.ERepositoryObjectType;
@@ -66,6 +67,13 @@ public abstract class AbstractResourceRepositoryContentHandler extends AbstractR
return itemResource;
}
protected Resource save(RoutinesJarItem item) {
final Resource itemResource = getXmiResourceManager().getItemResource(item);
itemResource.getContents().clear();
itemResource.getContents().add(item.getRoutinesJarType());
return itemResource;
}
protected Resource saveScreenShots(ProcessItem item) throws PersistenceException {
Resource itemResource = getXmiResourceManager().getScreenshotResource(item, true, true);
EMap screenshots = item.getProcess().getScreenshots();
@@ -76,7 +84,7 @@ public abstract class AbstractResourceRepositoryContentHandler extends AbstractR
return itemResource;
}
private XmiResourceManager getXmiResourceManager() {
protected XmiResourceManager getXmiResourceManager() {
if (null == xmiResourceManager) {
xmiResourceManager = new XmiResourceManager();
}

View File

@@ -81,6 +81,12 @@ public class ProjectDataJsonProvider {
return strBuilder.toString();
}
public static String getMigrationTaskIndexPath() {
StringBuilder strBuilder = new StringBuilder();
strBuilder.append(FileConstants.SETTINGS_FOLDER_NAME).append("/").append(FileConstants.MIGRATION_TASK_FILE_NAME); //$NON-NLS-1$
return strBuilder.toString();
}
public static void saveProjectData(Project project) throws PersistenceException {
saveProjectData(project, CONTENT_ALL);
}

View File

@@ -12,6 +12,10 @@
// ============================================================================
package org.talend.core.repository.utils;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternCompiler;
@@ -26,37 +30,65 @@ import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.runtime.services.IDesignerMavenService;
/**
* DOC nrousseau class global comment. Detailled comment
*/
public final class RoutineUtils {
private static final String DEFAULT_PACKAGE_REGEX = "package(\\s)+" + JavaUtils.JAVA_ROUTINES_DIRECTORY //$NON-NLS-1$
+ "\\.((\\w)+)(\\s)*;"; //$NON-NLS-1$
private static final String DEFAULT_PACKAGE_STRING = "package " + JavaUtils.JAVA_ROUTINES_DIRECTORY + ";"; //$NON-NLS-1$ //$NON-NLS-2$
private static final String INNER_ROUTINES_PACKAGE_REGEX = "package\\s+([^;]+);";
public static void changeRoutinesPackage(Item item) {
List<ERepositoryObjectType> allowedTypes = new ArrayList<ERepositoryObjectType>();
allowedTypes.add(ERepositoryObjectType.ROUTINES);
doChangeRoutinesPackage(item, DEFAULT_PACKAGE_REGEX, DEFAULT_PACKAGE_STRING, allowedTypes, false, true);
}
public static void changeInnerCodePackage(Item item, boolean avoidSave) {
changeInnerCodePackage(item, avoidSave, true);
}
public static void changeInnerCodePackage(Item item, boolean avoidSave, boolean commitMode) {
IDesignerMavenService service = IDesignerMavenService.get();
if (service != null && item instanceof RoutineItem) {
RoutineItem routineItem = (RoutineItem) item;
String codesJarPackageByInnerCode = service.getCodesJarPackageByInnerCode(routineItem);
if (StringUtils.isNotBlank(codesJarPackageByInnerCode)) {
String newPackageString = "package " + StringUtils.replace(codesJarPackageByInnerCode, "/", ".") + ";";
if (!routineItem.isBuiltIn()) {
String routineContent = new String(routineItem.getContent().getInnerContent());
if (routineContent != null && routineContent.contains(newPackageString)) {
return;
}
}
doChangeRoutinesPackage(item, INNER_ROUTINES_PACKAGE_REGEX, newPackageString,
ERepositoryObjectType.getAllTypesOfCodes(), avoidSave, commitMode);
}
}
}
public static void doChangeRoutinesPackage(Item item, String packageRegex, String newPackage,
List<ERepositoryObjectType> allowedTypes, boolean avoidSave, boolean commitMode) {
if (item == null) {
return;
}
ERepositoryObjectType itemType = ERepositoryObjectType.getItemType(item);
if (ERepositoryObjectType.ROUTINES.equals(itemType) && item instanceof RoutineItem) {
if (allowedTypes != null && allowedTypes.contains(itemType) && item instanceof RoutineItem) {
RoutineItem rItem = (RoutineItem) item;
if (!rItem.isBuiltIn()) {
//
String routineContent = new String(rItem.getContent().getInnerContent());
//
// String curProjectName =
// currentProject.getTechnicalLabel().toLowerCase();
String oldPackage = "package(\\s)+" + JavaUtils.JAVA_ROUTINES_DIRECTORY + "\\.((\\w)+)(\\s)*;"; //$NON-NLS-1$ //$NON-NLS-2$
// String newPackage = "package " +
// JavaUtils.JAVA_ROUTINES_DIRECTORY + "." + curProjectName +
// ";";
String newPackage = "package " + JavaUtils.JAVA_ROUTINES_DIRECTORY + ";"; //$NON-NLS-1$ //$NON-NLS-2$
try {
PatternCompiler compiler = new Perl5Compiler();
Perl5Matcher matcher = new Perl5Matcher();
matcher.setMultiline(true);
Pattern pattern = compiler.compile(oldPackage);
Pattern pattern = compiler.compile(packageRegex);
if (matcher.contains(routineContent, pattern)) {
// String group = matcher.getMatch().group(2);
@@ -67,7 +99,14 @@ public final class RoutineUtils {
rItem.getContent().setInnerContent(routineContent.getBytes());
ProxyRepositoryFactory repFactory = ProxyRepositoryFactory.getInstance();
repFactory.save(rItem);
if (!avoidSave) {
if (commitMode) {
repFactory.save(rItem);
} else {
// avoid deadlock in git pull event listener
new XmiResourceManager().saveResource(rItem.eResource());
}
}
// }
}
} catch (MalformedPatternException e) {

View File

@@ -70,6 +70,7 @@ import org.talend.core.model.properties.TDQItem;
import org.talend.core.model.properties.ValidationRulesConnectionItem;
import org.talend.core.model.properties.helper.ByteArrayResource;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.routines.RoutinesUtil;
import org.talend.core.repository.constants.FileConstants;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.repository.utils.ResourceFilenameHelper.FileName;
@@ -209,7 +210,7 @@ public class XmiResourceManager {
* @return
* @throws PersistenceException
*/
private IPath getFolderPath(IProject project, ERepositoryObjectType repositoryObjectType, IPath relativePath)
private IPath getFolderPath(IProject project, ERepositoryObjectType repositoryObjectType, IPath relativePath, Item item)
throws PersistenceException {
ERepositoryObjectType type = repositoryObjectType;
if (ERepositoryObjectType.TDQ_SYSTEM_INDICATORS.equals(repositoryObjectType)
@@ -218,6 +219,10 @@ public class XmiResourceManager {
} else if (ERepositoryObjectType.TDQ_PATTERN_REGEX.equals(repositoryObjectType)
|| ERepositoryObjectType.TDQ_PATTERN_SQL.equals(repositoryObjectType)) {
type = ERepositoryObjectType.TDQ_PATTERN_ELEMENT;
} else if (type == ERepositoryObjectType.ROUTINES && RoutinesUtil.isInnerCodes(item.getProperty())) {
type = ERepositoryObjectType.ROUTINESJAR;
} else if (type == ERepositoryObjectType.BEANS && RoutinesUtil.isInnerCodes(item.getProperty())) {
type = ERepositoryObjectType.BEANSJAR;
}
IFolder folder = project.getFolder(ERepositoryObjectType.getFolderName(type)).getFolder(relativePath);
return folder.getFullPath();
@@ -704,7 +709,7 @@ public class XmiResourceManager {
// MOD mzhao 2010-11-22, suppport TDQ item file extensions.(.ana, .rep, etc)
private URI getItemResourceURI(IProject project, ERepositoryObjectType repositoryObjectType, IPath path, Item item)
throws PersistenceException {
IPath folderPath = getFolderPath(project, repositoryObjectType, path);
IPath folderPath = getFolderPath(project, repositoryObjectType, path, item);
FileName fileName = ResourceFilenameHelper.create(item.getProperty());
IPath resourcePath = null;
if (item.getFileExtension() == null) {
@@ -720,7 +725,7 @@ public class XmiResourceManager {
@Deprecated
private URI getItemResourceURI(IProject project, ERepositoryObjectType repositoryObjectType, IPath path, Item item,
String fileExtension) throws PersistenceException {
IPath folderPath = getFolderPath(project, repositoryObjectType, path);
IPath folderPath = getFolderPath(project, repositoryObjectType, path, item);
FileName fileName = ResourceFilenameHelper.create(item.getProperty());
IPath resourcePath = ResourceFilenameHelper
.getExpectedFilePath(fileName, folderPath, fileExtension, item.isNeedVersion());
@@ -730,7 +735,7 @@ public class XmiResourceManager {
// added by dlin 2011-7-14 to create the uri of file of .screenshot
private URI getScreenshotResourceURI(IProject project, ERepositoryObjectType repositoryObjectType, IPath path, Item item,
String... fileExtension) throws PersistenceException {
IPath folderPath = getFolderPath(project, repositoryObjectType, path);
IPath folderPath = getFolderPath(project, repositoryObjectType, path, item);
FileName fileName = ResourceFilenameHelper.create(item.getProperty());
IPath resourcePath = ResourceFilenameHelper.getExpectedFilePath(fileName, folderPath, FileConstants.SCREENSHOT_EXTENSION,
item.isNeedVersion());

View File

@@ -95,6 +95,7 @@ Export-Package: org.talend.commons.utils.generation,
org.talend.repository.documentation.generation,
org.talend.repository.model,
org.talend.repository.model.nodes,
org.talend.repository.token,
org.talend.repository.ui.actions,
org.talend.repository.ui.dialog,
org.talend.repository.ui.login.connections,

View File

@@ -89,6 +89,10 @@ public final class JavaUtils {
/** Java Routines Directory. */
public static final String JAVA_ROUTINES_DIRECTORY = "routines"; //$NON-NLS-1$
// TODO check refrerences of JAVA_ROUTINES_DIRECTORY
/** Java Routines Jar Directory. */
public static final String JAVA_ROUTINESJAR_DIRECTORY = "routinesjar"; //$NON-NLS-1$
/** Java Pig Directory. */
public static final String JAVA_PIG_DIRECTORY = "pig"; //$NON-NLS-1$
@@ -98,6 +102,9 @@ public final class JavaUtils {
/** Java Beans Directory. */
public static final String JAVA_BEANS_DIRECTORY = "beans"; //$NON-NLS-1$
/** Java Beans Jar Directory. */
public static final String JAVA_BEANSJAR_DIRECTORY = "beansjar"; //$NON-NLS-1$
/** Java SQLTemplate Directory. */
public static final String JAVA_SQLPATTERNS_DIRECTORY = "sqltemplates"; //$NON-NLS-1$

View File

@@ -27,6 +27,7 @@ import org.talend.core.model.process.IElement;
import org.talend.core.model.process.INode;
import org.talend.core.model.process.IProcess;
import org.talend.core.model.process.Problem;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.designer.codegen.PigTemplate;
@@ -117,6 +118,10 @@ public interface ILibrariesService extends IService {
Set<ModuleNeeded> getCodesModuleNeededs(ERepositoryObjectType type);
Set<ModuleNeeded> getAllCodesJarModuleNeededs();
Set<ModuleNeeded> getCodesJarModuleNeededs(Property property);
List<ModuleNeeded> getModuleNeeded(String id, boolean isGroup);
public void deployProjectLibrary(File source) throws IOException;

View File

@@ -49,6 +49,7 @@ import orgomg.cwm.objectmodel.core.TaggedValue;
*/
public final class MetadataToolAvroHelper {
private static final String TALEND_DB_COLUMN_NAME = "talend.field.dbColumnName";
/**
* @return An Avro schema with enriched properties from the incoming metadata table.
*/
@@ -451,19 +452,16 @@ public final class MetadataToolAvroHelper {
table.setTableType(prop);
}
// Add the columns.
List<org.talend.core.model.metadata.builder.connection.MetadataColumn> columns = new ArrayList<>(in.getFields().size());
for (Schema.Field f : in.getFields()) {
columns.add(convertFromAvro(f, table));
table.getColumns().add(convertFromAvro(f, table));
}
boolean isDynamic = AvroUtils.isIncludeAllFields(in);
if (isDynamic) {
org.talend.core.model.metadata.builder.connection.MetadataColumn col = convertFromAvroForDynamic(in);
// get dynamic position
int dynPosition = Integer.valueOf(in.getProp(DiSchemaConstants.TALEND6_DYNAMIC_COLUMN_POSITION));
columns.add(dynPosition, col);
table.getColumns().add(dynPosition, col);
}
table.getColumns().addAll(columns);
return table;
}
@@ -574,7 +572,12 @@ public final class MetadataToolAvroHelper {
// Set the defaults values to the name (the only information guaranteed to be available in every field).
col.setId(field.name());
col.setLabel(field.name());
String dbColumnlable = null;
if (MetadataToolHelper.isAllowSpecificCharacters() && null != (dbColumnlable = field.getProp(TALEND_DB_COLUMN_NAME))) {
col.setLabel(dbColumnlable);
} else {
col.setLabel(field.name());
}
col.setName(field.name());
Schema nonnullable = AvroUtils.unwrapIfNullable(in);
LogicalType logicalType = LogicalTypes.fromSchemaIgnoreInvalid(nonnullable);

View File

@@ -280,7 +280,7 @@ public final class MetadataToolHelper {
return isAllowSpecificCharacters() || Pattern.matches(RepositoryConstants.COLUMN_NAME_PATTERN, name);
}
private static boolean isAllowSpecificCharacters() {
public static boolean isAllowSpecificCharacters() {
IEclipsePreferences coreUIPluginNode = new InstanceScope().getNode(ITalendCorePrefConstants.CoreUIPlugin_ID);
return coreUIPluginNode
.getBoolean(IRepositoryPrefConstants.ALLOW_SPECIFIC_CHARACTERS_FOR_SCHEMA_COLUMNS, false);

View File

@@ -51,7 +51,6 @@ import org.talend.designer.core.model.utils.emf.talendfile.NodeType;
import org.talend.designer.core.model.utils.emf.talendfile.ProcessType;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.repository.model.IRepositoryNode;
/**
* This class store all relationships between jobs/joblets and other items from the repository. Be sure to update the
@@ -102,6 +101,10 @@ public class RelationshipItemBuilder {
public static final String ROUTINE_RELATION = "routine"; //$NON-NLS-1$
public static final String ROUTINES_JAR_RELATION = "routinesJar"; //$NON-NLS-1$
public static final String BEANS_JAR_RELATION = "beansJar"; //$NON-NLS-1$
public static final String MAPPER_RELATION = "mapper"; //$NON-NLS-1$
public static final String SURVIVOR_RELATION = "survivorshipRuleRelation"; //$NON-NLS-1$

View File

@@ -61,6 +61,7 @@ import org.talend.core.model.properties.ProcessItem;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.RegExFileConnectionItem;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.properties.RoutinesJarItem;
import org.talend.core.model.properties.RulesItem;
import org.talend.core.model.properties.SAPConnectionItem;
import org.talend.core.model.properties.SQLPatternItem;
@@ -443,8 +444,19 @@ public class ERepositoryObjectType extends DynaEnum<ERepositoryObjectType> {
public final static ERepositoryObjectType ROUTINES = ERepositoryObjectType.valueOf("ROUTINES"); //$NON-NLS-1$
public final static ERepositoryObjectType ROUTINESJAR = ERepositoryObjectType.valueOf("ROUTINESJAR"); //$NON-NLS-1$
/**
* <font color="red">This value may be <b>null</b> in some licenses, <b>should add NPE check</b></font>
*/
public final static ERepositoryObjectType BEANS = ERepositoryObjectType.valueOf("BEANS"); //$NON-NLS-1$
/**
* <font color="red">This value may be <b>null</b> in some licenses, <b>should add NPE check</b></font>
*/
// TODO need and register it in extension or not?
public final static ERepositoryObjectType BEANSJAR = ERepositoryObjectType.valueOf("BEANSJAR"); //$NON-NLS-1$
public final static ERepositoryObjectType METADATA_HEADER_FOOTER = ERepositoryObjectType.valueOf("METADATA_HEADER_FOOTER"); //$NON-NLS-1$
public final static ERepositoryObjectType JOB_SCRIPT = ERepositoryObjectType.valueOf("JOB_SCRIPT"); //$NON-NLS-1$
@@ -936,7 +948,7 @@ public class ERepositoryObjectType extends DynaEnum<ERepositoryObjectType> {
* @return
*/
public static ERepositoryObjectType getItemType(Item item) {
// FIXME update all inner codes related callers
ERepositoryObjectType repObjType = getTDQRepObjType(item);
if (repObjType != null) {
return repObjType;
@@ -1003,6 +1015,11 @@ public class ERepositoryObjectType extends DynaEnum<ERepositoryObjectType> {
// return BEANS;
// }
@Override
public Object caseRoutinesJarItem(RoutinesJarItem object) {
return ROUTINESJAR;
}
@Override
public Object caseJobScriptItem(JobScriptItem object) {
return JOB_SCRIPT;
@@ -1505,11 +1522,66 @@ public class ERepositoryObjectType extends DynaEnum<ERepositoryObjectType> {
if (ERepositoryObjectType.ROUTINES != null) {
allTypes.add(ERepositoryObjectType.ROUTINES);
}
ERepositoryObjectType beansType = ERepositoryObjectType.valueOf("BEANS"); //$NON-NLS-1$
if (beansType != null) {
allTypes.add(beansType);
if (ERepositoryObjectType.BEANS != null) {
allTypes.add(ERepositoryObjectType.BEANS);
}
return allTypes;
}
public static List<ERepositoryObjectType> getAllTypesOfCodesJar() {
List<ERepositoryObjectType> allTypes = new ArrayList<ERepositoryObjectType>();
if (ERepositoryObjectType.ROUTINESJAR != null) {
allTypes.add(ERepositoryObjectType.ROUTINESJAR);
}
if (ERepositoryObjectType.BEANSJAR != null) {
allTypes.add(ERepositoryObjectType.BEANSJAR);
}
return allTypes;
}
public enum CodeTypeEnum {
Routines("ROUTINESJAR", "ROUTINES"),
Beans("BEANSJAR", "BEANS");
private String codeJarType;
private String codeType;
private CodeTypeEnum(String codeJarType, String codeType) {
this.codeJarType = codeJarType;
this.codeType = codeType;
}
public static boolean isCodeRepositoryObjectTypeMatch(ERepositoryObjectType jarType, ERepositoryObjectType codeType) {
if (jarType == null || codeType == null) {
return false;
}
for (CodeTypeEnum cType : CodeTypeEnum.values()) {
if (cType.getCodeJarType().equals(jarType.getType())) {
return cType.getCodeType().equals(codeType.getType());
}
}
return false;
}
/**
* Getter for codeJarType.
*
* @return the codeJarType
*/
public String getCodeJarType() {
return codeJarType;
}
/**
* Getter for codeType.
*
* @return the codeType
*/
public String getCodeType() {
return codeType;
}
}
}

View File

@@ -0,0 +1,118 @@
// ============================================================================
//
// Copyright (C) 2006-2021 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.core.model.routines;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.repository.ProjectManager;
/**
* Could get most of codesjar's attribute in EMF model but some are lost when model is unloaded. Store those attributes
* in this bean.
*/
public class CodesJarInfo {
private Property property;
private String projectTechName;
private String id;
private String label;
private String version;
private ERepositoryObjectType type;
private CodesJarInfo() {
}
public static CodesJarInfo create(Property property) {
CodesJarInfo info = new CodesJarInfo();
info.property = property;
info.projectTechName = ProjectManager.getInstance().getProject(property).getTechnicalLabel();
info.id = property.getId();
info.label = property.getLabel();
info.version = property.getVersion();
info.type = ERepositoryObjectType.getItemType(property.getItem());
return info;
}
public Property getProperty() {
return property;
}
public String getProjectTechName() {
return projectTechName;
}
public String getId() {
return id;
}
public String getLabel() {
return label;
}
public String getVersion() {
return version;
}
public ERepositoryObjectType getType() {
return type;
}
public boolean isInCurrentMainProject() {
return projectTechName.equals(ProjectManager.getInstance().getCurrentProject().getTechnicalLabel());
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((projectTechName == null) ? 0 : projectTechName.hashCode());
result = prime * result + ((property == null) ? 0 : property.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
CodesJarInfo other = (CodesJarInfo) obj;
if (projectTechName == null && other.projectTechName != null) {
return false;
} else if (!projectTechName.equals(other.projectTechName)) {
return false;
}
if (property == null && other.property != null) {
return false;
} else if (property != null && other.property != null) {
if (!property.getId().equals(other.property.getId()) || !property.getLabel().equals(other.property.getLabel())
|| !property.getVersion().equals(other.property.getVersion())) {
return false;
}
}
return true;
}
}

View File

@@ -12,11 +12,9 @@
// ============================================================================
package org.talend.core.model.routines;
import java.util.Set;
import java.util.Vector;
import org.talend.core.IService;
import org.talend.core.model.general.ModuleNeeded;
/**
*
@@ -26,5 +24,4 @@ public interface IRoutinesService extends IService {
public Vector getAccents();
Set<ModuleNeeded> getRunningModules();
}

View File

@@ -120,8 +120,12 @@ public class RoutineLibraryMananger {
initialized = true;
}
}
public boolean needDeploy(URL fileUrl) throws IOException, Exception{
return needDeploy(fileUrl, null);
}
public boolean needDeploy(URL fileUrl) throws IOException, Exception {
public boolean needDeploy(URL fileUrl, String mvnUrl) throws IOException, Exception {
File file = new File(fileUrl.getFile());
ILibraryManagerService libManagerService = null;
if (GlobalServiceRegister.getDefault().isServiceRegistered(ILibraryManagerService.class)) {
@@ -129,19 +133,21 @@ public class RoutineLibraryMananger {
.getService(ILibraryManagerService.class);
}
if (libManagerService != null) {
Map<String, String> sourceAndMavenUri = new HashMap<>();
libManagerService.guessMavenRUIFromIndex(file, sourceAndMavenUri);
String mavUri = null;
boolean isSnapshot = false;
for (String key : sourceAndMavenUri.keySet()) {
if (sourceAndMavenUri.get(key).equals(file.getPath())) {
mavUri = key;
break;
String mavUri = mvnUrl;
if (StringUtils.isBlank(mvnUrl)) {
Map<String, String> sourceAndMavenUri = new HashMap<>();
libManagerService.guessMavenRUIFromIndex(file, sourceAndMavenUri);
for (String key : sourceAndMavenUri.keySet()) {
if (sourceAndMavenUri.get(key).equals(file.getPath())) {
mavUri = key;
break;
}
}
if (mavUri == null) {
return true;
}
}
if (mavUri == null) {
return true;
}
boolean isSnapshot = false;
final MavenArtifact parseMvnUrl = MavenUrlHelper.parseMvnUrl(mavUri);
if (parseMvnUrl != null) {
if (parseMvnUrl.getVersion() != null && parseMvnUrl.getVersion().endsWith(MavenConstants.SNAPSHOT)) {

View File

@@ -13,6 +13,7 @@
package org.talend.core.model.routines;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -20,12 +21,16 @@ import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.exception.SystemException;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.model.general.Project;
import org.talend.core.model.process.JobInfo;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.JobletProcessItem;
import org.talend.core.model.properties.ProcessItem;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.repository.ERepositoryObjectType;
@@ -204,6 +209,7 @@ public final class RoutinesUtil {
}
private static RoutinesParameterType createItemInforType(RoutineItem routineItem) {
// no need to update
Property property = routineItem.getProperty();
RoutinesParameterType itemRecordType = TalendFileFactory.eINSTANCE.createRoutinesParameterType();
@@ -353,4 +359,54 @@ public final class RoutinesUtil {
}
}
}
@SuppressWarnings("unchecked")
public static void setInnerCodes(Property property, ERepositoryObjectType type) {
if (type == null) {
property.getAdditionalProperties().removeKey("JAR_TYPE");
} else {
property.getAdditionalProperties().put("JAR_TYPE", type.name()); //$NON-NLS-1$
}
}
public static ERepositoryObjectType getInnerCodeType(Property property) {
Object type = property.getAdditionalProperties().get("JAR_TYPE"); //$NON-NLS-1$
if (type != null) {
return ERepositoryObjectType.getAllTypesOfCodesJar().stream().filter(t -> t.name().equals(type)).findFirst().get();
}
return null;
}
public static boolean isInnerCodes(Property property) {
Object isInnerCodes = property.getAdditionalProperties().get("JAR_TYPE"); //$NON-NLS-1$
return isInnerCodes != null;
}
public static String getCodesJarLabelByInnerCode(Item innerCodeItem) {
return new Path(innerCodeItem.getState().getPath()).segment(0);
}
public static List<RoutinesParameterType> getRoutinesParametersFromJobInfo(JobInfo info) {
Item item = null;
if (info.getJobletProperty() != null) {
item = info.getJobletProperty().getItem();
} else if (info.getProcessItem() != null) {
item = info.getProcessItem();
}
return getRoutinesParametersFromItem(item);
}
public static List<RoutinesParameterType> getRoutinesParametersFromItem(Item item) {
List<RoutinesParameterType> routinesParameters = null;
if (item == null) {
routinesParameters = Collections.emptyList();
}
if (item instanceof JobletProcessItem) {
routinesParameters = ((JobletProcessItem) item).getJobletProcess().getParameters().getRoutinesParameter();
} else if (item instanceof ProcessItem) {
routinesParameters = ((ProcessItem) item).getProcess().getParameters().getRoutinesParameter();
}
return routinesParameters;
}
}

View File

@@ -207,6 +207,10 @@ public final class ContextParameterUtils {
}
private static ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
public static ScriptEngine getScriptEngine() {
return engine;
}
public static String convertContext2Literal4AnyVar(final String code, final IContext context) {
if (code == null) {

View File

@@ -27,6 +27,9 @@ import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.model.components.ComponentCategory;
import org.talend.core.model.components.IComponent;
@@ -1005,6 +1008,15 @@ public class NodeUtil {
//suppose all memo fields are processed well already, no need to go though this with dangerous
if (!isMemo && !org.talend.core.model.utils.ContextParameterUtils.isDynamic(value)) {
//https://jira.talendforge.org/browse/TDI-45563
//now can't get the var real value for "out1.A" in code generation time, so need to ignore it for runtime value log
//here consider the performance, only do it for some special case
if(itemFromTable && "VALUE".equals(ep.getName())) {
if(!isValidLiteralValue(value)) {
return "\"\"";//return empty string as can't get the real runtime value
}
}
if(value.length() > 1 && value.startsWith("\"") && value.endsWith("\"")) {
if(itemFromTable && "ARGS".equals(ep.getName())) {
value = value.substring(1, value.length());
@@ -1015,7 +1027,7 @@ public class NodeUtil {
return value;
}
} else {
return "\"" + checkStringQuotationMarks(value) + "\"";
return "\"" + checkStringQuotationMarks(value) + "\"";
}
}
@@ -1027,6 +1039,17 @@ public class NodeUtil {
return value;
}
private static boolean isValidLiteralValue(String value) {
ScriptEngine se = ContextParameterUtils.getScriptEngine();
if(se==null) return true;
try {
se.eval(value);
return true;
} catch (ScriptException e) {
return false;
}
}
private static String checkStringQuotationMarks(String str) {
String result = str;
if (result.contains("\"")) {

View File

@@ -114,7 +114,7 @@ public interface ITalendCorePrefConstants {
public static final String DATA_COLLECTOR_PREVIEW = "data_collector_preview"; //$NON-NLS-1$
public static final String DATA_COLLECTOR = "data_collector"; //$NON-NLS-1$
public static final String EXCHANGE_CHECK_TIS_VERSION = "exchange_check_tis_version"; //$NON-NLS-1$
public static final String EXCHANGE_DOWNLOADED_CHECK_UPDATES = "exchange_downloaded_check_updates"; //$NON-NLS-1$

View File

@@ -390,4 +390,34 @@ public class MavenUrlHelper {
}
return rVersion;
}
public static String getCoordinate(String mavenUri) {
if (!isMvnUrl(mavenUri)) {
mavenUri = generateMvnUrlForJarName(mavenUri);
}
MavenArtifact artifact = parseMvnUrl(mavenUri);
String groupId = artifact.getGroupId();
String artifactId = artifact.getArtifactId();
String type = artifact.getType();
String version = artifact.getVersion();
String classifier = artifact.getClassifier();
String separator = ":"; //$NON-NLS-1$
String coordinate = groupId + separator + artifactId;
if (StringUtils.isNotBlank(type)) {
coordinate += separator + type;
}
if (StringUtils.isNotBlank(classifier)) {
coordinate += separator + classifier;
}
if (StringUtils.isNotBlank(version)) {
if (version.endsWith("-SNAPSHOT")) {
version = version.substring(0, version.indexOf("-SNAPSHOT"));
}
coordinate += separator + version;
}
return coordinate;
}
}

View File

@@ -30,6 +30,8 @@ public interface ITalendProcessJavaProject {
IJavaProject getJavaProject();
boolean exists();
IProject getProject();
Property getPropery();

View File

@@ -28,9 +28,15 @@ public class LastGenerationInfo {
private HashMap<String, Set<ModuleNeeded>> modulesNeededPerJob;
private HashMap<String, Set<ModuleNeeded>> modulesNeededWithSubjobPerJob;
private HashMap<String, Set<String>> routinesNeededPerJob;
private HashMap<String, Set<ModuleNeeded>> modulesNeededWithSubjobPerJob;
private HashMap<String, Set<String>> routinesNeededWithSubjobPerJob;
private HashMap<String, Set<ModuleNeeded>> codesJarModulesNeededPerJob;
private HashMap<String, Set<ModuleNeeded>> codesJarModulesNeededWithSubjobPerJob;
private HashMap<String, Set<ModuleNeeded>> highPriorityModuleNeededPerJob;
@@ -38,8 +44,6 @@ public class LastGenerationInfo {
private HashMap<String, Set<ModuleNeeded>> testcaseModuleNeeded;
private HashMap<String, Set<String>> routinesNeededWithSubjobPerJob;
private HashMap<String, Set<String>> contextPerJob;
private HashMap<String, Boolean> useDynamic, useRules;
@@ -54,16 +58,18 @@ public class LastGenerationInfo {
private LastGenerationInfo() {
modulesNeededPerJob = new HashMap<String, Set<ModuleNeeded>>();
contextPerJob = new HashMap<String, Set<String>>();
modulesNeededWithSubjobPerJob = new HashMap<String, Set<ModuleNeeded>>();
contextPerJob = new HashMap<>();
modulesNeededWithSubjobPerJob = new HashMap<>();
highPriorityModuleNeededPerJob = new HashMap<>();
highPriorityModuleNeeded = new HashMap<>();
testcaseModuleNeeded = new HashMap<>();
lastGeneratedjobs = new HashSet<JobInfo>();
routinesNeededPerJob = new HashMap<String, Set<String>>();
routinesNeededWithSubjobPerJob = new HashMap<String, Set<String>>();
useDynamic = new HashMap<String, Boolean>();
useRules = new HashMap<String, Boolean>();
lastGeneratedjobs = new HashSet<>();
routinesNeededPerJob = new HashMap<>();
routinesNeededWithSubjobPerJob = new HashMap<>();
codesJarModulesNeededPerJob = new HashMap<>();
codesJarModulesNeededWithSubjobPerJob = new HashMap<>();
useDynamic = new HashMap<>();
useRules = new HashMap<>();
}
public static LastGenerationInfo getInstance() {
@@ -74,10 +80,11 @@ public class LastGenerationInfo {
}
/**
*
* @return the modulesNeededPerJob
*/
// TODO check callers to see if need to add operations for codejars
public Set<ModuleNeeded> getModulesNeededWithSubjobPerJob(String jobId, String jobVersion) {
String key = this.getProcessKey(jobId, jobVersion);
if (!modulesNeededWithSubjobPerJob.containsKey(key)) {
modulesNeededWithSubjobPerJob.put(key, new HashSet<ModuleNeeded>());
@@ -85,6 +92,20 @@ public class LastGenerationInfo {
return modulesNeededWithSubjobPerJob.get(key);
}
/**
* Sets the modulesNeededWithSubjobPerJob.
*
* @param modulesNeededWithSubjobPerJob the modulesNeededWithSubjobPerJob to set
*/
public void setModulesNeededWithSubjobPerJob(String jobId, String jobVersion, Set<ModuleNeeded> modulesNeeded) {
String key = this.getProcessKey(jobId, jobVersion);
if (modulesNeeded == null) {
modulesNeededWithSubjobPerJob.put(key, null);
} else {
modulesNeededWithSubjobPerJob.put(key, new HashSet<ModuleNeeded>(modulesNeeded));
}
}
/**
*
* @return the modulesNeededPerJob
@@ -97,19 +118,6 @@ public class LastGenerationInfo {
return modulesNeededPerJob.get(key);
}
/**
* Getter for contextPerJob.
*
* @return the contextPerJob
*/
public Set<String> getContextPerJob(String jobId, String jobVersion) {
String key = this.getProcessKey(jobId, jobVersion);
if (!contextPerJob.containsKey(key)) {
contextPerJob.put(key, new HashSet<String>());
}
return contextPerJob.get(key);
}
/**
* Sets the modulesNeededPerJob.
*
@@ -121,17 +129,16 @@ public class LastGenerationInfo {
}
/**
* Sets the modulesNeededWithSubjobPerJob.
* Getter for contextPerJob.
*
* @param modulesNeededWithSubjobPerJob the modulesNeededWithSubjobPerJob to set
* @return the contextPerJob
*/
public void setModulesNeededWithSubjobPerJob(String jobId, String jobVersion, Set<ModuleNeeded> modulesNeeded) {
public Set<String> getContextPerJob(String jobId, String jobVersion) {
String key = this.getProcessKey(jobId, jobVersion);
if (modulesNeeded == null) {
modulesNeededWithSubjobPerJob.put(key, null);
} else {
modulesNeededWithSubjobPerJob.put(key, new HashSet<ModuleNeeded>(modulesNeeded));
if (!contextPerJob.containsKey(key)) {
contextPerJob.put(key, new HashSet<String>());
}
return contextPerJob.get(key);
}
/**
@@ -241,6 +248,64 @@ public class LastGenerationInfo {
return routinesNeededPerJob.get(key);
}
/**
* Sets the routinesNeededPerJob.
*
* @param modulesNeededPerJob the modulesNeededPerJob to set
*/
public void setRoutinesNeededPerJob(String jobId, String jobVersion, Set<String> modulesNeeded) {
String key = this.getProcessKey(jobId, jobVersion);
routinesNeededPerJob.put(key, new HashSet<String>(modulesNeeded));
}
/**
*
* @return the modulesNeededPerJob
*/
public Set<String> getRoutinesNeededWithSubjobPerJob(String jobId, String jobVersion) {
String key = this.getProcessKey(jobId, jobVersion);
if (!routinesNeededWithSubjobPerJob.containsKey(key)) {
routinesNeededWithSubjobPerJob.put(key, new HashSet<String>());
}
return routinesNeededWithSubjobPerJob.get(key);
}
/**
* Sets the routinesNeededPerJob.
*
* @param modulesNeededPerJob the modulesNeededPerJob to set
*/
public void setRoutinesNeededWithSubjobPerJob(String jobId, String jobVersion, Set<String> modulesNeeded) {
String key = this.getProcessKey(jobId, jobVersion);
routinesNeededWithSubjobPerJob.put(key, new HashSet<String>(modulesNeeded));
}
public Set<ModuleNeeded> getCodesJarModulesNeededPerJob(String jobId, String jobVersion) {
String key = this.getProcessKey(jobId, jobVersion);
if (!codesJarModulesNeededPerJob.containsKey(key)) {
codesJarModulesNeededPerJob.put(key, new HashSet<>());
}
return codesJarModulesNeededPerJob.get(key);
}
public void setCodesJarModulesNeededPerJob(String jobId, String jobVersion, Set<ModuleNeeded> modulesNeeded) {
String key = this.getProcessKey(jobId, jobVersion);
codesJarModulesNeededPerJob.put(key, new HashSet<>(modulesNeeded));
}
public Set<ModuleNeeded> getCodesJarModulesNeededWithSubjobPerJob(String jobId, String jobVersion) {
String key = this.getProcessKey(jobId, jobVersion);
if (!codesJarModulesNeededWithSubjobPerJob.containsKey(key)) {
codesJarModulesNeededWithSubjobPerJob.put(key, new HashSet<>());
}
return codesJarModulesNeededWithSubjobPerJob.get(key);
}
public void setCodesJarModulesNeededWithSubjobPerJob(String jobId, String jobVersion, Set<ModuleNeeded> modulesNeeded) {
String key = this.getProcessKey(jobId, jobVersion);
codesJarModulesNeededWithSubjobPerJob.put(key, new HashSet<>(modulesNeeded));
}
public Set<ModuleNeeded> getHighPriorityModuleNeededPerJob(String jobId, String jobVersion) {
String key = getProcessKey(jobId, jobVersion);
if (!highPriorityModuleNeededPerJob.containsKey(key)) {
@@ -295,38 +360,6 @@ public class LastGenerationInfo {
return pureJobId + "_" + jobVersion; //$NON-NLS-1$
}
/**
* Sets the routinesNeededPerJob.
*
* @param modulesNeededPerJob the modulesNeededPerJob to set
*/
public void setRoutinesNeededPerJob(String jobId, String jobVersion, Set<String> modulesNeeded) {
String key = this.getProcessKey(jobId, jobVersion);
routinesNeededPerJob.put(key, new HashSet<String>(modulesNeeded));
}
/**
*
* @return the modulesNeededPerJob
*/
public Set<String> getRoutinesNeededWithSubjobPerJob(String jobId, String jobVersion) {
String key = this.getProcessKey(jobId, jobVersion);
if (!routinesNeededWithSubjobPerJob.containsKey(key)) {
routinesNeededWithSubjobPerJob.put(key, new HashSet<String>());
}
return routinesNeededWithSubjobPerJob.get(key);
}
/**
* Sets the routinesNeededPerJob.
*
* @param modulesNeededPerJob the modulesNeededPerJob to set
*/
public void setRoutinesNeededWithSubjobPerJob(String jobId, String jobVersion, Set<String> modulesNeeded) {
String key = this.getProcessKey(jobId, jobVersion);
routinesNeededWithSubjobPerJob.put(key, new HashSet<String>(modulesNeeded));
}
public void clearCaches() {
clearHighPriorityModuleNeeded();
modulesNeededPerJob.clear();

View File

@@ -74,4 +74,10 @@ public interface TalendProcessOptionConstants {
public static final int MODULES_EXCLUDE_SHADED = 1 << 5;
/**
* NOTE with this option, still won't get codesjar modules of related joblet TODO check all callers to find a way to
* include those
*/
public static final int MODULES_WITH_CODESJAR = 1 << 6;
}

View File

@@ -0,0 +1,36 @@
// ============================================================================
//
// Copyright (C) 2006-2019 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.core.runtime.services;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.IService;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.RoutineItem;
public interface IDesignerMavenService extends IService {
String getCodesJarPackageByInnerCode(RoutineItem innerCodeItem);
String getImportGAVPackageForCodesJar(String projectTechName, Item codesJarItem);
void updateCodeJarMavenProject(Property codeJarProperty, boolean needReSync) throws Exception;
public static IDesignerMavenService get() {
if (GlobalServiceRegister.getDefault().isServiceRegistered(IDesignerMavenService.class)) {
return GlobalServiceRegister.getDefault().getService(IDesignerMavenService.class);
}
return null;
}
}

View File

@@ -22,6 +22,7 @@ import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.ui.IEditorPart;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.IService;
import org.talend.core.model.components.IComponent;
import org.talend.core.model.general.ModuleNeeded;
@@ -135,4 +136,11 @@ public interface ITestContainerProviderService extends IService {
public List<NodeType> getOriginalNodes(ProcessType process);
public static ITestContainerProviderService get() {
if (GlobalServiceRegister.getDefault().isServiceRegistered(ITestContainerProviderService.class)) {
return GlobalServiceRegister.getDefault().getService(ITestContainerProviderService.class);
}
return null;
}
}

View File

@@ -0,0 +1,163 @@
package org.talend.core.utils;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.model.general.Project;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.routines.CodesJarInfo;
import org.talend.core.model.routines.RoutinesUtil;
import org.talend.designer.runprocess.IRunProcessService;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.repository.model.IProxyRepositoryService;
public class CodesJarResourceCache {
private static final Set<CodesJarInfo> CACHE = new LinkedHashSet<>();
private static final Object LOCK = new Object();
private static boolean isListenerAdded;
private static PropertyChangeListener listener;
public static void initCodesJarCache() {
synchronized (LOCK) {
CACHE.clear();
List<Project> allProjects = new ArrayList<>();
allProjects.addAll(ProjectManager.getInstance().getAllReferencedProjects(true));
allProjects.add(ProjectManager.getInstance().getCurrentProject());
try {
for (Project project : allProjects) {
for (ERepositoryObjectType codesJarType : ERepositoryObjectType.getAllTypesOfCodesJar()) {
List<IRepositoryViewObject> objects = getProxyRepositoryFactory().getAllCodesJars(project, codesJarType);
for (IRepositoryViewObject obj : objects) {
CACHE.add(CodesJarInfo.create(obj.getProperty()));
}
}
}
addCodesJarChangeListener();
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
}
}
public static Set<CodesJarInfo> getAllCodesJars() {
synchronized (LOCK) {
return new LinkedHashSet<>(CACHE);
}
}
public static CodesJarInfo getCodesJarById(String id) {
synchronized (LOCK) {
Optional<CodesJarInfo> optional = CACHE.stream().filter(info -> info.getProperty().getId().equals(id))
.findFirst();
if (optional.isPresent()) {
return optional.get();
}
ExceptionHandler.process(new Exception("Codes jar id [" + id + "] is not found!")); //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
}
public static CodesJarInfo getCodesJarByLabel(ERepositoryObjectType type, String projectTechName, String label) {
synchronized (LOCK) {
Optional<CodesJarInfo> optional = CACHE.stream().filter(
info -> ERepositoryObjectType.getItemType(info.getProperty().getItem()) == type
&& info.getProperty().getLabel().equals(label) && info.getProjectTechName().equals(projectTechName))
.findFirst();
if (optional.isPresent()) {
return optional.get();
}
return null;
}
}
public static CodesJarInfo getCodesJarByInnerCode(RoutineItem routineItem) throws PersistenceException {
String codesJarName = RoutinesUtil.getCodesJarLabelByInnerCode(routineItem);
String projectTechName = ProjectManager.getInstance().getProject(routineItem).getTechnicalLabel();
return getAllCodesJars().stream()
.filter(info -> info.getProperty().getLabel().equals(codesJarName)
&& info.getProjectTechName().equals(projectTechName))
.findFirst().get();
}
public static void addToCache(Property newProperty) {
synchronized (LOCK) {
Iterator<CodesJarInfo> iterator = CACHE.iterator();
while (iterator.hasNext()) {
Property oldProperty = iterator.next().getProperty();
if (newProperty.getId().equals(oldProperty.getId()) && newProperty.getLabel().equals(oldProperty.getLabel())
&& newProperty.getVersion().equals(oldProperty.getVersion())) {
iterator.remove();
}
}
CACHE.add(CodesJarInfo.create(newProperty));
}
}
public static void updateCache(String oldId, String oldLabel, String oldVersion, Property newProperty) {
synchronized (LOCK) {
Iterator<CodesJarInfo> iterator = CACHE.iterator();
while (iterator.hasNext()) {
Property oldProperty = iterator.next().getProperty();
if ((oldId == null || (oldId != null && oldId.equals(oldProperty.getId())))
&& oldLabel.equals(oldProperty.getLabel())
&& oldVersion.equals(oldProperty.getVersion())) {
iterator.remove();
}
}
CACHE.add(CodesJarInfo.create(newProperty));
}
}
public static void removeCache(Property property) {
synchronized (LOCK) {
Iterator<CodesJarInfo> iterator = CACHE.iterator();
while (iterator.hasNext()) {
Property oldProperty = iterator.next().getProperty();
if (oldProperty.getId().equals(property.getId()) && oldProperty.getLabel().equals(property.getLabel())
&& oldProperty.getVersion().equals(property.getVersion())) {
iterator.remove();
}
}
}
}
private static IProxyRepositoryFactory getProxyRepositoryFactory() {
if (GlobalServiceRegister.getDefault().isServiceRegistered(IProxyRepositoryService.class)) {
return GlobalServiceRegister.getDefault().getService(IProxyRepositoryService.class).getProxyRepositoryFactory();
}
return null;
}
public static void addCodesJarChangeListener() {
if (!isListenerAdded) {
synchronized (LOCK) {
if (!isListenerAdded) {
if (listener == null) {
if (GlobalServiceRegister.getDefault().isServiceRegistered(IRunProcessService.class)) {
IRunProcessService service = GlobalServiceRegister.getDefault().getService(IRunProcessService.class);
listener = service.addCodesJarChangeListener();
isListenerAdded = true;
}
}
}
}
}
}
}

View File

@@ -20,6 +20,7 @@ import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -36,6 +37,7 @@ import org.talend.commons.utils.VersionUtils;
import org.talend.commons.utils.encoding.CharsetToolkit;
import org.talend.commons.utils.generation.JavaUtils;
import org.talend.commons.utils.resource.FileExtensions;
import org.talend.commons.utils.workbench.resources.ResourceUtils;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.IService;
import org.talend.core.model.general.Project;
@@ -46,14 +48,19 @@ import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.routines.CodesJarInfo;
import org.talend.core.model.routines.RoutinesUtil;
import org.talend.core.model.utils.JavaResourcesHelper;
import org.talend.core.runtime.process.ITalendProcessJavaProject;
import org.talend.core.runtime.repository.item.ItemProductKeys;
import org.talend.core.runtime.services.IDesignerMavenService;
import org.talend.core.runtime.util.ItemDateParser;
import org.talend.core.ui.branding.IBrandingService;
import org.talend.core.utils.CodesJarResourceCache;
import org.talend.designer.core.ICamelDesignerCoreService;
import org.talend.designer.runprocess.IRunProcessService;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.repository.model.IRepositoryService;
import org.talend.repository.model.RepositoryNodeUtilities;
@@ -141,6 +148,9 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer
}
protected IFile getRoutineFile(RoutineItem routineItem, String projectTechName) throws SystemException {
if (RoutinesUtil.isInnerCodes(routineItem.getProperty())) {
return getInnerCodeFile(routineItem);
}
ITalendProcessJavaProject talendProcessJavaProject = getRunProcessService()
.getTalendCodeJavaProject(ERepositoryObjectType.getItemType(routineItem), projectTechName);
if (talendProcessJavaProject == null) {
@@ -150,6 +160,24 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer
return routineFolder.getFile(routineItem.getProperty().getLabel() + JavaUtils.JAVA_EXTENSION);
}
protected IFile getInnerCodeFile(RoutineItem routineItem) throws SystemException {
CodesJarInfo info = CodesJarResourceCache.getCodesJarByInnerCode(routineItem);
ITalendProcessJavaProject talendProcessJavaProject = getRunProcessService().getTalendCodesJarJavaProject(info);
if (talendProcessJavaProject == null) {
return null;
}
IFolder routineFolder = talendProcessJavaProject.getSrcSubFolder(null, getInnerCodePackage(routineItem));
return routineFolder.getFile(routineItem.getProperty().getLabel() + JavaUtils.JAVA_EXTENSION);
}
private String getInnerCodePackage(RoutineItem innerCodeItem) {
if (GlobalServiceRegister.getDefault().isServiceRegistered(IDesignerMavenService.class)) {
IDesignerMavenService service = GlobalServiceRegister.getDefault().getService(IDesignerMavenService.class);
return service.getCodesJarPackageByInnerCode(innerCodeItem);
}
return null;
}
private IFile getProcessFile(ProcessItem item) throws SystemException {
final ITalendProcessJavaProject talendProcessJavaProject = getRunProcessService().getTalendJobJavaProject(item.getProperty());
if (talendProcessJavaProject == null) {
@@ -173,15 +201,23 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer
@Override
public IFile getRoutinesFile(Item item) throws SystemException {
// from talend project
if (item instanceof RoutineItem) {
final RoutineItem routineItem = (RoutineItem) item;
final IProject project = ResourcesPlugin.getWorkspace().getRoot()
.getProject(ProjectManager.getInstance().getProject(routineItem).getTechnicalLabel());
IFolder folder = project
.getFolder(ERepositoryObjectType.getFolderName(ERepositoryObjectType.getItemType(routineItem)));
ERepositoryObjectType type;
ERepositoryObjectType innerCodeType = RoutinesUtil.getInnerCodeType(item.getProperty());
if (innerCodeType != null) {
type = innerCodeType;
} else {
type = ERepositoryObjectType.getItemType(routineItem);
}
IFolder folder = project.getFolder(ERepositoryObjectType.getFolderName(type));
IPath ipath = RepositoryNodeUtilities.getPath(routineItem.getProperty().getId());
if (ipath == null)
if (ipath == null) {
return null;
}
final String folderPath = ipath.toString();
if (folderPath != null && !folderPath.trim().isEmpty()) {
folder = folder.getFolder(folderPath);
@@ -232,14 +268,46 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer
}
}
protected void syncInnerCodeItems(boolean forceUpdate) throws SystemException {
IProxyRepositoryFactory factory = getRepositoryService().getProxyRepositoryFactory();
for (CodesJarInfo info : CodesJarResourceCache.getAllCodesJars()) {
Property property = info.getProperty();
String projectTechName = info.getProjectTechName();
Project project = ProjectManager.getInstance().getProjectFromProjectTechLabel(projectTechName);
ERepositoryObjectType codesJarType = ERepositoryObjectType.getItemType(property.getItem());
List<IRepositoryViewObject> innerCodesObjects = factory.getAllInnerCodes(project, codesJarType, property);
for (IRepositoryViewObject codesObj : innerCodesObjects) {
RoutineItem codeItem = (RoutineItem) codesObj.getProperty().getItem();
syncRoutine(codeItem, projectTechName, true, forceUpdate);
}
}
}
private void doSyncRoutine(RoutineItem routineItem, String projectTechName, boolean copyToTemp) throws SystemException {
try {
IFile file = getRoutineFile(routineItem, projectTechName);
if (file == null) {
return;
}
File itemFile = null;
if (routineItem.eResource() == null) {
return;
if (!RoutinesUtil.isInnerCodes(routineItem.getProperty())) {
return;
}
CodesJarInfo info = CodesJarResourceCache.getCodesJarByInnerCode(routineItem);
Property codesJarProperty = info.getProperty();
IFolder innerCodeFolder = ResourceUtils.getFolder(ResourceUtils.getProject(info.getProjectTechName()),
ERepositoryObjectType.getFolderName(ERepositoryObjectType.getItemType(codesJarProperty.getItem())) + "/"
+ codesJarProperty.getLabel(),
true);
IFile innerCodeFile = innerCodeFolder
.getFile(routineItem.getProperty().getLabel() + "_" + routineItem.getProperty().getVersion() + ".item");
if (innerCodeFile.exists()) {
itemFile = innerCodeFile.getLocation().toFile();
}
if (itemFile == null) {
return;
}
}
Property property = routineItem.getProperty();
Date modifiedDate = ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getModifiedKey());
@@ -252,9 +320,11 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer
}
if (copyToTemp) {
String uri = routineItem.eResource().getURI().trimFileExtension()
.appendFileExtension(FileExtensions.ITEM_EXTENSION).toPlatformString(false);
File itemFile = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(uri).toFile();
if (itemFile == null) {
String uri = routineItem.eResource().getURI().trimFileExtension()
.appendFileExtension(FileExtensions.ITEM_EXTENSION).toPlatformString(false);
itemFile = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(uri).toFile();
}
byte[] buf = routineItem.getContent().getInnerContent();
String charset = null;
if (itemFile.exists()) {
@@ -292,8 +362,13 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer
@Override
public void deleteRoutinefile(IRepositoryViewObject objToDelete) {
Item item = objToDelete.getProperty().getItem();
if (RoutinesUtil.isInnerCodes(item.getProperty())) {
deleteInnerCodeFile(item);
return;
}
try {
ITalendProcessJavaProject talendProcessJavaProject = getRunProcessService().getTalendCodeJavaProject(ERepositoryObjectType.getItemType(item));
ITalendProcessJavaProject talendProcessJavaProject = getRunProcessService()
.getTalendCodeJavaProject(ERepositoryObjectType.getItemType(item));
if (talendProcessJavaProject == null) {
return;
}
@@ -306,6 +381,15 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer
}
}
private void deleteInnerCodeFile(Item item) {
try {
IFile file = getInnerCodeFile((RoutineItem) item);
file.delete(true, null);
} catch (CoreException | SystemException e) {
ExceptionHandler.process(e);
}
}
protected boolean isRoutineUptodate(RoutineItem routineItem) {
Date refDate = getRefDate(routineItem);
if (refDate == null) {

View File

@@ -53,4 +53,8 @@ public interface ITalendSynchronizer {
void deleteRoutinefile(IRepositoryViewObject objToDelete);
void syncAllInnerCodes() throws SystemException;
void syncAllInnerCodesForLogOn() throws SystemException;
}

View File

@@ -43,6 +43,8 @@ public interface ICamelDesignerCoreService extends IService {
public boolean isInstanceofCamelBeans(Item item);
boolean isInstanceofCamelBeansJar(Item item);
/**
* Synchronized Route resource
*

View File

@@ -157,7 +157,9 @@ public interface IDesignerCoreService extends IService {
public void reloadParamFromProjectSettings(ParametersType processType, String paramName);
public Set<ModuleNeeded> getNeededLibrariesForProcess(IProcess process, boolean withChildrens);
public Set<ModuleNeeded> getNeededLibrariesForProcess(IProcess process, int options);
public Set<ModuleNeeded> getCodesJarNeededLibrariesForProcess(Item item);
public Set<ModuleNeeded> getNeededModules(INode node, boolean withChildrens);

View File

@@ -299,6 +299,8 @@ public interface IProcessor {
String[] getJVMArgs();
Set<ModuleNeeded> getNeededModules(int options);
Set<ModuleNeeded> getCodesJarModulesNeededOfJoblets();
public void updateModulesAfterSetLog4j(Collection<ModuleNeeded> modulesNeeded);
@@ -306,6 +308,8 @@ public interface IProcessor {
Set<JobInfo> getBuildFirstChildrenJobs();
Set<JobInfo> getBuildChildrenJobsAndJoblets();
/**
* used for old build job system. after maven build, can be removed.
*/

View File

@@ -12,6 +12,7 @@
// ============================================================================
package org.talend.designer.runprocess;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.Set;
@@ -37,8 +38,8 @@ import org.talend.core.model.process.IProcess2;
import org.talend.core.model.process.JobInfo;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.routines.CodesJarInfo;
import org.talend.core.runtime.process.ITalendProcessJavaProject;
import org.talend.core.runtime.projectsetting.ProjectPreferenceManager;
@@ -131,7 +132,7 @@ public interface IRunProcessService extends IService {
public void updateLibraries(Set<ModuleNeeded> jobModuleList, IProcess process, Set<ModuleNeeded> alreadyRetrievedModules)
throws ProcessorException;
public void updateLibraries(RoutineItem routineItem);
public void updateLibraries(Item routineItem);
public void refreshView();
@@ -201,6 +202,7 @@ public interface IRunProcessService extends IService {
ProjectPreferenceManager getProjectPreferenceManager();
@Deprecated
Set<String> getLibJarsForBD(IProcess process);
void updateProjectPomWithTemplate();
@@ -215,8 +217,16 @@ public interface IRunProcessService extends IService {
ITalendProcessJavaProject getTalendCodeJavaProject(ERepositoryObjectType type, String projectTechName);
ITalendProcessJavaProject getTalendCodesJarJavaProject(CodesJarInfo info);
ITalendProcessJavaProject getTalendJobJavaProject(Property property);
ITalendProcessJavaProject getExistingTalendJobProject(Property property);
ITalendProcessJavaProject getExistingTalendCodesJarProject(CodesJarInfo info);
PropertyChangeListener addCodesJarChangeListener();
IFolder getCodeSrcFolder(ERepositoryObjectType type, String projectTechName);
ITalendProcessJavaProject getTempJavaProject();
@@ -255,4 +265,9 @@ public interface IRunProcessService extends IService {
return null;
}
void deleteTalendCodesJarProject(CodesJarInfo info, boolean deleteContent);
void deleteTalendCodesJarProject(ERepositoryObjectType type, String projectTechName, String codesJarName,
boolean deleteContent);
}

View File

@@ -427,6 +427,18 @@ public final class ProjectManager {
return isInMainProject(getCurrentProject(), object);
}
/**
* could get the right comparing result if resource is unloaded
*/
public boolean isResourceInCurrentMainProject(EObject object) {
org.talend.core.model.properties.Project project = getProject(object);
Project mainProject = getCurrentProject();
if (project != null && mainProject != null) {
return project.getTechnicalLabel().equals(mainProject.getEmfProject().getTechnicalLabel());
}
return false;
}
public boolean isInMainProject(Project mainProject, EObject object) {
if (object != null) {
org.talend.core.model.properties.Project project = getProject(mainProject, object);

View File

@@ -12,6 +12,8 @@
// ============================================================================
package org.talend.repository;
import java.util.Set;
import org.talend.commons.exception.LoginException;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.model.general.Project;
@@ -45,6 +47,8 @@ public abstract class RepositoryWorkUnit<T> {
private boolean refreshRepository = true; // added for TDI-27085
private Set<String> specifiedCommitFiles;
/**
* Usefull for some save only actions, where we're sure everything is up to date.
*/
@@ -194,6 +198,13 @@ public abstract class RepositoryWorkUnit<T> {
this.refreshRepository = refreshRepository;
}
public Set<String> getSpecifiedCommitFiles() {
return specifiedCommitFiles;
}
public void setSpecifiedCommitFiles(Set<String> specifiedCommitFiles) {
this.specifiedCommitFiles = specifiedCommitFiles;
}
/**
* Getter for avoidUpdateLocks.

View File

@@ -17,6 +17,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.IPath;
import org.talend.commons.exception.BusinessException;
import org.talend.commons.exception.LoginException;
@@ -206,6 +207,8 @@ public interface IProxyRepositoryFactory {
*/
public abstract void deleteObjectLogical(IRepositoryViewObject objToDelete) throws PersistenceException, BusinessException;
// TODO need to remove codesjar and related routine node to bin, or just show codesjar node?
// if delete inner routine, show node itself only
public abstract void deleteObjectLogical(Project project, IRepositoryViewObject objToDelete) throws PersistenceException,
BusinessException;
@@ -213,6 +216,7 @@ public interface IProxyRepositoryFactory {
throws PersistenceException, BusinessException;
public abstract void deleteObjectPhysical(IRepositoryViewObject objToDelete) throws PersistenceException;
// TODO if delete codesjar item should delete all related routines
public abstract void deleteObjectPhysical(IRepositoryViewObject objToDelete, String version) throws PersistenceException;
@@ -305,6 +309,20 @@ public interface IProxyRepositoryFactory {
public abstract List<IRepositoryViewObject> getAll(Project project, ERepositoryObjectType type, boolean withDeleted,
boolean allVersions) throws PersistenceException;
public abstract List<IRepositoryViewObject> getAll(Project project, ERepositoryObjectType type, boolean withDeleted,
boolean allVersions, IFolder... folders) throws PersistenceException;
public abstract List<IRepositoryViewObject> getAllCodesJars(ERepositoryObjectType type) throws PersistenceException;
public abstract List<IRepositoryViewObject> getAllCodesJars(Project project, ERepositoryObjectType type)
throws PersistenceException;
public abstract List<IRepositoryViewObject> getAllInnerCodes(ERepositoryObjectType codesJarType, Property jarProperty)
throws PersistenceException;
public abstract List<IRepositoryViewObject> getAllInnerCodes(Project project, ERepositoryObjectType codesJarType,
Property jarProperty) throws PersistenceException;
public abstract List<String> getFolders(ERepositoryObjectType type) throws PersistenceException;
/**

View File

@@ -128,7 +128,8 @@ public class RepositoryConstants {
|| type == ERepositoryObjectType.JOB_SCRIPT) {
return CODE_ITEM_PATTERN;
} else if (type == ERepositoryObjectType.ROUTINES
|| "BEANS".equals(type.getType())) {
|| "BEANS".equals(type.getType()) || type == ERepositoryObjectType.ROUTINESJAR
|| (type != null && type == ERepositoryObjectType.BEANSJAR)) {
// for bug 10356
return ROUTINES_ITEM_PATTERN;
} else if (type == ERepositoryObjectType.TDQ_JRAXML_ELEMENT || type == ERepositoryObjectType.TDQ_DATA_PROFILING

View File

@@ -46,6 +46,7 @@ import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryPrefConstants;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.repository.ISubRepositoryObject;
import org.talend.core.model.routines.RoutinesUtil;
import org.talend.core.model.utils.RepositoryManagerHelper;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.core.runtime.i18n.Messages;
@@ -108,6 +109,11 @@ public class RepositoryNodeUtilities {
} else {
if (/* !isMetadataLabel(label) && */node.getType() != ENodeType.REPOSITORY_ELEMENT) {
return getPath(node.getParent()).append(label);
} else if (ERepositoryObjectType.getAllTypesOfCodesJar().contains(node.getContentType())) {
if (RoutinesUtil.isInnerCodes(node.getObject().getProperty())) {
return new Path(node.getObject().getProperty().getItem().getState().getPath());
}
return new Path(node.getObject().getLabel());
} else {
return getPath(node.getParent());
}

View File

@@ -0,0 +1,57 @@
// ============================================================================
//
// Copyright (C) 2006-2021 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.repository.token;
import java.io.File;
import java.util.Properties;
import org.eclipse.core.runtime.Platform;
import org.talend.commons.utils.time.PropertiesFileUtil;
/**
* DOC sbliu class global comment. Detailled comment
*/
public class RepositoryActionLogger {
private static String recordingFileName = "actions";
private static File recordingFile;
public static final String PREFIX_PERSPECITVE = "perspective.";
public static final String PREFIX_ACTION = "action.";
public static File getRecordingFile() {
if (recordingFile == null) {
String configurationLocation = Platform.getConfigurationLocation().getURL().getPath();
recordingFile = new File(configurationLocation + "/data_collector/" + recordingFileName);
}
return recordingFile;
}
private static void log(String action) {
new Thread(() -> {
Properties props = PropertiesFileUtil.read(getRecordingFile(), false);
int count = Integer.parseInt(props.getProperty(action, "0"));
props.put(action, count + 1 + "");
PropertiesFileUtil.store(getRecordingFile(), props);
}).start();
}
public static void logPerspective(String perspective) {
log(PREFIX_PERSPECITVE + perspective);
}
public static void logAction(String action) {
log(PREFIX_ACTION + action);
}
}

View File

@@ -65,6 +65,7 @@ import org.talend.repository.model.IRepositoryNode.ENodeType;
import org.talend.repository.model.IRepositoryNode.EProperties;
import org.talend.repository.model.RepositoryConstants;
import org.talend.repository.model.RepositoryNode;
import org.talend.repository.token.RepositoryActionLogger;
import org.talend.repository.ui.views.IJobSettingsView;
import org.talend.repository.ui.views.IRepositoryView;
@@ -638,6 +639,7 @@ public abstract class AContextualAction extends Action implements ITreeContextua
@Override
public void run() {
String name = "User action : " + getText(); //$NON-NLS-1$
RepositoryActionLogger.logAction(getClass().getName());
oldItem = null;
// if (node == null) {

View File

@@ -30,6 +30,12 @@
id="org.talend.core.ui.token.PerformanceProvider"
name="performance">
</provider>
<provider
collector="org.talend.core.ui.token.RepositroyActionsTokenCollector"
description="collect DI/DQ actions/numbers of action done, also collect perspective switch"
id="org.talend.core.ui.token.RepositroyActionsTokenCollector"
name="actions">
</provider>
</extension>
<extension

View File

@@ -260,7 +260,6 @@ public class ExtendedContextColumnPropertyAccessor<R> implements IColumnProperty
return;
}
String newType = getRealType((String) newValue);
contextPara.setType(newType);
Command cmd = new SetContextTypeCommand(manager, contextPara, newType);
runCommand(cmd, manager);
@@ -460,6 +459,9 @@ public class ExtendedContextColumnPropertyAccessor<R> implements IColumnProperty
for (IContext context : modelManager.getContextManager().getListContext()) {
for (IContextParameter contextParameter : context.getContextParameterList()) {
if (param.getName().equals(contextParameter.getName())) {
if(!param.getType().equals(newValue) ) {
modified = true;
}
oldValue = param.getType();
contextParameter.setType(newValue);
}

View File

@@ -31,8 +31,7 @@ public class TalendDataCollectorPreferenceInitializer extends AbstractPreference
public void initializeDefaultPreferences() {
IPreferenceStore preferenceStore = CoreUIPlugin.getDefault().getPreferenceStore();
preferenceStore.setDefault(ITalendCorePrefConstants.DATA_COLLECTOR_ENABLED, true);
preferenceStore.setDefault(ITalendCorePrefConstants.DATA_COLLECTOR_UPLOAD_PERIOD, 10);
preferenceStore.setDefault(ITalendCorePrefConstants.DATA_COLLECTOR_UPLOAD_PERIOD, 5);
}
}

View File

@@ -34,4 +34,9 @@ public interface ITokenCollector {
* collect the values from different provider.
*/
public JSONObject collect() throws Exception;
/**
* reset cached collected data
*/
public default void reset() {}
}

View File

@@ -17,6 +17,7 @@ import java.util.Properties;
import org.talend.commons.exception.CommonExceptionHandler;
import org.talend.commons.utils.time.PerformanceStatisticUtil;
import org.talend.commons.utils.time.PerformanceStatisticUtil.StatisticKeys;
import org.talend.commons.utils.time.PropertiesFileUtil;
import oshi.SystemInfo;
import oshi.hardware.Baseboard;
@@ -60,7 +61,7 @@ public class PerformanceTokenCollector extends AbstractTokenCollector {
//
JSONObject jsonObjectIOInfo = new JSONObject();
Properties props = PerformanceStatisticUtil.read(PerformanceStatisticUtil.getRecordingFile(),false);
Properties props = PropertiesFileUtil.read(PerformanceStatisticUtil.getRecordingFile(),false);
jsonObjectIOInfo.put(StatisticKeys.STARTUP_AVERAGE.get(), props.getProperty(StatisticKeys.STARTUP_AVERAGE.get()));
jsonObjectIOInfo.put(StatisticKeys.STARTUP_MAX.get(), props.getProperty(StatisticKeys.STARTUP_MAX.get()));
jsonObjectIOInfo.put(StatisticKeys.IO_R_MB_SEC.get(), props.getProperty(StatisticKeys.IO_R_MB_SEC.get()));
@@ -79,5 +80,10 @@ public class PerformanceTokenCollector extends AbstractTokenCollector {
CommonExceptionHandler.log(e.getMessage());
}
}
@Override
public void reset() {
PerformanceStatisticUtil.reset();
}
}

View File

@@ -0,0 +1,52 @@
// ============================================================================
//
// Copyright (C) 2006-2020 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.core.ui.token;
import java.util.Map.Entry;
import java.util.Properties;
import org.talend.commons.utils.time.PropertiesFileUtil;
import org.talend.repository.token.RepositoryActionLogger;
import us.monoid.json.JSONObject;
/**
* DOC sbliu class global comment. Detailled comment
*/
public class RepositroyActionsTokenCollector extends AbstractTokenCollector {
@Override
public JSONObject collect() throws Exception {
JSONObject tokenStudioObject = new JSONObject();
//
JSONObject jsonObjectActionInfo = new JSONObject();
JSONObject jsonObjectPerspectiveInfo = new JSONObject();
Properties props = PropertiesFileUtil.read(RepositoryActionLogger.getRecordingFile(), false);
if(!props.isEmpty()) {
for(Entry<Object, Object> entry: props.entrySet()) {
String key = (String)entry.getKey();
if(key.startsWith(RepositoryActionLogger.PREFIX_ACTION)) {
key = key.substring(RepositoryActionLogger.PREFIX_ACTION.length());
jsonObjectActionInfo.put(key, entry.getValue());
} else if(key.startsWith(RepositoryActionLogger.PREFIX_PERSPECITVE)) {
key = key.substring(RepositoryActionLogger.PREFIX_PERSPECITVE.length());
jsonObjectPerspectiveInfo.put(key, entry.getValue());
}
}
}
tokenStudioObject.put("actions", jsonObjectActionInfo);
tokenStudioObject.put("perspectives", jsonObjectPerspectiveInfo);
return tokenStudioObject;
}
}

View File

@@ -28,6 +28,7 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.lang3.StringUtils;
@@ -63,6 +64,7 @@ import org.talend.commons.utils.network.NetworkUtil;
import org.talend.commons.utils.network.TalendProxySelector;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.prefs.ITalendCorePrefConstants;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.ui.CoreUIPlugin;
import org.talend.core.ui.branding.IBrandingService;
@@ -109,7 +111,7 @@ public final class TokenCollectorFactory {
idWithPluginMap.put(id, pluginName);
} else {
log.log(Priority.WARN, "there is id: " + id + " to have been existed in plugin:" + idWithPluginMap.get(id) //$NON-NLS-1$ //$NON-NLS-2$
+ " current plugin is:" + pluginName + " will ignore this extension."); //$NON-NLS-1$ //$NON-NLS-2$
+ " (current plugin is:" + pluginName + "), will ignore this extension."); //$NON-NLS-1$ //$NON-NLS-2$
}
}
@@ -125,7 +127,72 @@ public final class TokenCollectorFactory {
public TokenInforProvider[] getProviders() {
return providers.values().toArray(new TokenInforProvider[0]);
}
private final int magic_mainthreadStackTraceNum = 28;
private Thread monitorSendThread = new Thread(new Runnable() {
public void run() {
while (true) {
try {
long millis = 12 * 60 * 60 * 1000L;//check every half day
millis = Long.getLong("studio.token.send", millis);
if (dataCollectorEnabled()) {
if (isTimeToSend()) {//need send
if(studioInIdle()) {
//if free, send in background
send(true);
} else {
Thread.sleep(10000L);
continue;
}
}
}
Thread.sleep(millis);
} catch (InterruptedException e) {
ExceptionHandler.process(e);
} catch(Exception e) {
ExceptionHandler.process(e);
}
}
}
});
private boolean studioInIdle() {
ProxyRepositoryFactory repoFactory = ProxyRepositoryFactory.getInstance();
boolean repositoryBusy = repoFactory.isRepositoryBusy();
boolean threadIdle = false;
Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces();
if (allStackTraces != null) {
Optional<Thread> mainThread = allStackTraces.keySet().stream()
.filter(t -> t.isAlive() && !t.isDaemon() && t.getName().equalsIgnoreCase("main")).findFirst();
if (mainThread.isPresent()) {
threadIdle = (magic_mainthreadStackTraceNum >= mainThread.get().getStackTrace().length);
}
}
return !repositoryBusy && threadIdle;
}
private boolean isTimeToSend() {
Date lastDate = lastSendDate();
final IPreferenceStore preferenceStore = CoreUIPlugin.getDefault().getPreferenceStore();
int days = preferenceStore.getInt(ITalendCorePrefConstants.DATA_COLLECTOR_UPLOAD_PERIOD);
Date curDate = new Date();
Date expectedSendDate = curDate;
if (days > 0 && lastDate != null) {
expectedSendDate = TokenInforUtil.getDateAfter(lastDate, days);
}
if (expectedSendDate.compareTo(curDate) < 0) {
return true;
}
return false;
}
public void monitor() {
monitorSendThread.start();
}
public void priorCollect() throws Exception {
if (isActiveAndValid(false)) { //
for (TokenInforProvider tip : getProviders()) {
@@ -161,31 +228,22 @@ public final class TokenCollectorFactory {
}
private boolean isActiveAndValid(boolean timeExpired) {
final IPreferenceStore preferenceStore = CoreUIPlugin.getDefault().getPreferenceStore();
if (preferenceStore.getBoolean(ITalendCorePrefConstants.DATA_COLLECTOR_ENABLED)) {
String last = preferenceStore.getString(ITalendCorePrefConstants.DATA_COLLECTOR_LAST_TIME);
int days = preferenceStore.getInt(ITalendCorePrefConstants.DATA_COLLECTOR_UPLOAD_PERIOD);
long syncNb = preferenceStore.getLong(DefaultTokenCollector.COLLECTOR_SYNC_NB);
if (syncNb < 15) {
days = 2;
}
Date lastDate = null;
if (last != null && !"".equals(last.trim())) { //$NON-NLS-1$
// parse the last date;
try {
lastDate = DATE_FORMAT.parse(last);
} catch (ParseException ee) {
//
}
}
Date curDate = new Date();
Date addedDate = curDate;
if (days > 0 && lastDate != null) {
addedDate = TokenInforUtil.getDateAfter(lastDate, days);
}
if (dataCollectorEnabled()) {
//
if (timeExpired) {
Date lastDate = lastSendDate();
final IPreferenceStore preferenceStore = CoreUIPlugin.getDefault().getPreferenceStore();
int days = preferenceStore.getInt(ITalendCorePrefConstants.DATA_COLLECTOR_UPLOAD_PERIOD);
long syncNb = preferenceStore.getLong(DefaultTokenCollector.COLLECTOR_SYNC_NB);
if (syncNb < 15) {
days = 2;
}
Date curDate = new Date();
Date addedDate = curDate;
if (days > 0 && lastDate != null) {
addedDate = TokenInforUtil.getDateAfter(lastDate, days);
}
if (addedDate.compareTo(curDate) <= 0) {
return true;
}
@@ -196,6 +254,26 @@ public final class TokenCollectorFactory {
return false;
}
private boolean dataCollectorEnabled() {
final IPreferenceStore preferenceStore = CoreUIPlugin.getDefault().getPreferenceStore();
return preferenceStore.getBoolean(ITalendCorePrefConstants.DATA_COLLECTOR_ENABLED);
}
private Date lastSendDate() {
final IPreferenceStore preferenceStore = CoreUIPlugin.getDefault().getPreferenceStore();
String last = preferenceStore.getString(ITalendCorePrefConstants.DATA_COLLECTOR_LAST_TIME);
Date lastDate = null;
if (last != null && !"".equals(last.trim())) { //$NON-NLS-1$
// parse the last date;
try {
lastDate = DATE_FORMAT.parse(last);
} catch (ParseException ee) {
//
}
}
return lastDate;
}
public boolean process() {
boolean result = false;
@@ -364,5 +442,18 @@ public final class TokenCollectorFactory {
}
}
}
public void reset() {
for (TokenInforProvider tip : getProviders()) {
ITokenCollector collector = tip.getCollector();
if (collector != null) {
try {
collector.reset();
} catch (Exception e) {
ExceptionHandler.process(e);
}
}
}
}
}

View File

@@ -279,7 +279,9 @@ public class CoreService implements ICoreService {
if (GlobalServiceRegister.getDefault().isServiceRegistered(ICodeGeneratorService.class)) {
ICodeGeneratorService codeGenService = (ICodeGeneratorService) GlobalServiceRegister.getDefault().getService(
ICodeGeneratorService.class);
codeGenService.createRoutineSynchronizer().syncAllRoutinesForLogOn();
ITalendSynchronizer talendSynchronizer = codeGenService.createRoutineSynchronizer();
talendSynchronizer.syncAllRoutinesForLogOn();
talendSynchronizer.syncAllInnerCodesForLogOn();
}
}

View File

@@ -17,7 +17,9 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.eclipse.emf.common.util.EList;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.CorePlugin;
@@ -26,9 +28,18 @@ import org.talend.core.language.LanguageManager;
import org.talend.core.model.general.ILibrariesService;
import org.talend.core.model.general.Project;
import org.talend.core.model.process.IProcess;
import org.talend.core.model.process.IProcess2;
import org.talend.core.model.process.JobInfo;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.JobletProcessItem;
import org.talend.core.model.properties.ProcessItem;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.runtime.services.IDesignerMavenService;
import org.talend.core.ui.ITestContainerProviderService;
import org.talend.core.utils.CodesJarResourceCache;
import org.talend.designer.core.model.utils.emf.talendfile.RoutinesParameterType;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.IProxyRepositoryFactory;
@@ -109,6 +120,47 @@ public final class CodeGeneratorRoutine {
return new ArrayList<String>(neededRoutines);
}
@SuppressWarnings("unchecked")
public static List<String> getRequiredCodesJarName(IProcess process) {
IDesignerMavenService designerMavenService = IDesignerMavenService.get();
List<String> neededCodesJars = new ArrayList<>();
if (process instanceof IProcess2) {
List<Item> all = new ArrayList<>();
Item currentItem = ((IProcess2) process).getProperty().getItem();
all.add(currentItem);
if (currentItem instanceof ProcessItem) {
ITestContainerProviderService testContainerService = ITestContainerProviderService.get();
if (testContainerService != null && testContainerService.isTestContainerItem(currentItem)) {
try {
all.add(testContainerService.getParentJobItem(currentItem));
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
}
all.addAll(ProcessorUtilities.getChildrenJobInfo(currentItem, false, true).stream().filter(JobInfo::isJoblet)
.map(info -> info.getJobletProperty().getItem()).collect(Collectors.toSet()));
all.forEach(item -> {
EList<RoutinesParameterType> routinesParameterTypes = null;
if (item instanceof ProcessItem && ((ProcessItem) item).getProcess() != null
&& ((ProcessItem) item).getProcess().getParameters() != null) {
routinesParameterTypes = ((ProcessItem) item).getProcess().getParameters().getRoutinesParameter();
} else if (item instanceof JobletProcessItem && ((JobletProcessItem) item).getJobletProcess() != null
&& ((JobletProcessItem) item).getJobletProcess().getParameters() != null) {
routinesParameterTypes = ((JobletProcessItem) item).getJobletProcess().getParameters()
.getRoutinesParameter();
}
if (routinesParameterTypes != null) {
routinesParameterTypes.stream().filter(r -> r.getType() != null)
.map(r -> CodesJarResourceCache.getCodesJarById(r.getId())).filter(info -> info != null)
.forEach(info -> neededCodesJars.add(designerMavenService.getImportGAVPackageForCodesJar(
info.getProjectTechName(), info.getProperty().getItem())));
}
});
}
}
return neededCodesJars;
}
/**
*
* Deprecate for won't use pigudf any more

View File

@@ -147,6 +147,9 @@ public class ProcessorUtilities {
public static final String PROP_MAPPINGS_URL = "talend.mappings.url"; //$NON-NLS-1$
/**
* For generating code in CI without param -pl
*/
public static final int GENERATE_MAIN_ONLY = TalendProcessOptionConstants.GENERATE_MAIN_ONLY;
public static final int GENERATE_WITH_FIRST_CHILD = TalendProcessOptionConstants.GENERATE_WITH_FIRST_CHILD;
@@ -562,14 +565,26 @@ public class ProcessorUtilities {
}
// TDI-26513:For the Dynamic schema,need to check the currentProcess(job or joblet)
checkMetadataDynamic(currentProcess, jobInfo);
Set<ModuleNeeded> neededLibraries =
CorePlugin.getDefault().getDesignerCoreService().getNeededLibrariesForProcess(currentProcess, false);
Set<ModuleNeeded> neededLibraries = CorePlugin.getDefault().getDesignerCoreService()
.getNeededLibrariesForProcess(currentProcess, TalendProcessOptionConstants.MODULES_DEFAULT);
if (neededLibraries != null) {
LastGenerationInfo.getInstance().setModulesNeededWithSubjobPerJob(jobInfo.getJobId(),
jobInfo.getJobVersion(), neededLibraries);
LastGenerationInfo.getInstance().setModulesNeededPerJob(jobInfo.getJobId(), jobInfo.getJobVersion(),
neededLibraries);
// get all codesjars needed modules
Set<ModuleNeeded> codesJarModules = CorePlugin.getDefault().getDesignerCoreService()
.getCodesJarNeededLibrariesForProcess(selectedProcessItem);
// get codesjar libraries from related joblets
codesJarModules.addAll(processor.getCodesJarModulesNeededOfJoblets());
LastGenerationInfo.getInstance().setCodesJarModulesNeededWithSubjobPerJob(jobInfo.getJobId(), jobInfo.getJobVersion(),
codesJarModules);
LastGenerationInfo.getInstance().setCodesJarModulesNeededPerJob(jobInfo.getJobId(), jobInfo.getJobVersion(),
codesJarModules);
neededLibraries.addAll(codesJarModules);
// get all job testcases needed modules
Set<ModuleNeeded> testcaseModules = getAllJobTestcaseModules(selectedProcessItem);
LastGenerationInfo.getInstance().setTestcaseModuleNeeded(jobInfo.getJobId(), jobInfo.getJobVersion(),
@@ -920,16 +935,16 @@ public class ProcessorUtilities {
return true;
}
if (service != null && service.isSupportDynamicType(node)) {
IElementParameter mappingParam = node.getElementParameterFromField(EParameterFieldType.MAPPING_TYPE);
if (mappingParam != null) {
for (IMetadataTable metadataTable : node.getMetadataList()) {
for (IMetadataColumn column : metadataTable.getListColumns()) {
if ("id_Dynamic".equals(column.getTalendType())) {
return true;
}
}
}
}
IElementParameter mappingParam = node.getElementParameterFromField(EParameterFieldType.MAPPING_TYPE);
if (mappingParam != null) {
for (IMetadataTable metadataTable : node.getMetadataList()) {
for (IMetadataColumn column : metadataTable.getListColumns()) {
if ("id_Dynamic".equals(column.getTalendType())) {
return true;
}
}
}
}
}
}
return hasDynamicMetadata;
@@ -1083,20 +1098,20 @@ public class ProcessorUtilities {
}
return context;
}
private static IContext checkCleanSecureContextParameterValue(IContext currentContext, JobInfo jobInfo) {
JobInfo job = null;
if (jobInfo.getFatherJobInfo() == null) {
job = jobInfo;
job = jobInfo;
} else {
job = getRootJob(jobInfo);
if (job.getProcess() == null || "route".equalsIgnoreCase(job.getProcess().getElementName())) {
// cleanup context only for child jobs which are referenced
// by tRunJob component or for Joblets (see TESB-29718 for details)
return currentContext;
}
job = getRootJob(jobInfo);
if (job.getProcess() == null || "route".equalsIgnoreCase(job.getProcess().getElementName())) {
// cleanup context only for child jobs which are referenced
// by tRunJob component or for Joblets (see TESB-29718 for details)
return currentContext;
}
}
if (job.getArgumentsMap() == null
@@ -1119,9 +1134,9 @@ public class ProcessorUtilities {
}
private static JobInfo getRootJob(JobInfo jobInfo) {
if (jobInfo != null && jobInfo.getFatherJobInfo() != null) {
return getRootJob(jobInfo.getFatherJobInfo());
if (jobInfo != null && jobInfo.getFatherJobInfo() != null) {
return getRootJob(jobInfo.getFatherJobInfo());
}
return jobInfo;
@@ -1296,15 +1311,37 @@ public class ProcessorUtilities {
}
checkMetadataDynamic(currentProcess, jobInfo);
Set<ModuleNeeded> neededLibraries =
CorePlugin.getDefault().getDesignerCoreService().getNeededLibrariesForProcess(currentProcess,
isCIMode && BitwiseOptionUtils.containOption(option, GENERATE_MAIN_ONLY));
if (neededLibraries != null) {
int options = TalendProcessOptionConstants.MODULES_DEFAULT;
if (isCIMode && BitwiseOptionUtils.containOption(option, GENERATE_MAIN_ONLY)) {
options |= TalendProcessOptionConstants.MODULES_WITH_CHILDREN;
}
Set<ModuleNeeded> neededLibraries = new HashSet<>();
Set<ModuleNeeded> processLibraries = CorePlugin.getDefault().getDesignerCoreService()
.getNeededLibrariesForProcess(currentProcess, options);
if (processLibraries != null) {
neededLibraries.addAll(processLibraries);
LastGenerationInfo.getInstance().setModulesNeededWithSubjobPerJob(jobInfo.getJobId(),
jobInfo.getJobVersion(), neededLibraries);
LastGenerationInfo.getInstance().setModulesNeededPerJob(jobInfo.getJobId(), jobInfo.getJobVersion(),
neededLibraries);
// get all codesjars needed modules
Set<ModuleNeeded> codesJarLibraries;
if (BitwiseOptionUtils.containOption(option, GENERATE_MAIN_ONLY)) {
codesJarLibraries = CorePlugin.getDefault().getDesignerCoreService().getNeededLibrariesForProcess(
currentProcess, option |= TalendProcessOptionConstants.MODULES_WITH_CODESJAR);
codesJarLibraries.removeAll(processLibraries);
} else {
codesJarLibraries = CorePlugin.getDefault().getDesignerCoreService()
.getCodesJarNeededLibrariesForProcess(selectedProcessItem);
}
codesJarLibraries.addAll(processor.getCodesJarModulesNeededOfJoblets());
LastGenerationInfo.getInstance().setCodesJarModulesNeededWithSubjobPerJob(jobInfo.getJobId(),
jobInfo.getJobVersion(), codesJarLibraries);
LastGenerationInfo.getInstance().setCodesJarModulesNeededPerJob(jobInfo.getJobId(), jobInfo.getJobVersion(),
codesJarLibraries);
neededLibraries.addAll(codesJarLibraries);
// get all job testcases needed modules
Set<ModuleNeeded> testcaseModules = getAllJobTestcaseModules(selectedProcessItem);
LastGenerationInfo.getInstance().setTestcaseModuleNeeded(jobInfo.getJobId(), jobInfo.getJobVersion(),
@@ -1418,7 +1455,7 @@ public class ProcessorUtilities {
}
}
private static Set<ModuleNeeded> getAllJobTestcaseModules(ProcessItem selectedProcessItem) {
private static Set<ModuleNeeded> getAllJobTestcaseModules(ProcessItem selectedProcessItem) {
Set<ModuleNeeded> neededLibraries = new HashSet<>();
if (GlobalServiceRegister.getDefault().isServiceRegistered(ITestContainerProviderService.class)) {
ITestContainerProviderService testcontainerService =
@@ -1814,6 +1851,11 @@ public class ProcessorUtilities {
generationInfo.getModulesNeededWithSubjobPerJob(jobInfo.getJobId(), jobInfo.getJobVersion()).addAll(
subjobModules);
Set<ModuleNeeded> subCodesJarModules = generationInfo.getCodesJarModulesNeededWithSubjobPerJob(subJobInfo.getJobId(),
subJobInfo.getJobVersion());
generationInfo.getCodesJarModulesNeededWithSubjobPerJob(jobInfo.getJobId(), jobInfo.getJobVersion())
.addAll(subCodesJarModules);
Set<String> subjobRoutineModules =
generationInfo.getRoutinesNeededWithSubjobPerJob(subJobInfo.getJobId(), subJobInfo.getJobVersion());
generationInfo.getRoutinesNeededWithSubjobPerJob(jobInfo.getJobId(), jobInfo.getJobVersion()).addAll(
@@ -2491,13 +2533,13 @@ public class ProcessorUtilities {
// see bug 0004939: making tRunjobs work loop will cause a error of "out of memory" .
private static Set<JobInfo> getAllJobInfo(ProcessType ptype, JobInfo parentJobInfo, Set<JobInfo> jobInfos,
boolean firstChildOnly) {
boolean firstChildOnly, boolean includeJoblet) {
if (ptype == null) {
return jobInfos;
}
// trunjob component
EList<NodeType> nodes = ptype.getNode();
getSubjobInfo(nodes, ptype, parentJobInfo, jobInfos,firstChildOnly);
getSubjobInfo(nodes, ptype, parentJobInfo, jobInfos, firstChildOnly, includeJoblet);
if (parentJobInfo.isTestContainer()
&& GlobalServiceRegister.getDefault().isServiceRegistered(ITestContainerProviderService.class)) {
@@ -2505,7 +2547,8 @@ public class ProcessorUtilities {
GlobalServiceRegister.getDefault().getService(
ITestContainerProviderService.class);
if (testContainerService != null) {
getSubjobInfo(testContainerService.getOriginalNodes(ptype), ptype, parentJobInfo, jobInfos,firstChildOnly);
getSubjobInfo(testContainerService.getOriginalNodes(ptype), ptype, parentJobInfo, jobInfos, firstChildOnly,
includeJoblet);
}
}
@@ -2537,7 +2580,7 @@ public class ProcessorUtilities {
}
private static Set<JobInfo> getSubjobInfo(List<NodeType> nodes, ProcessType ptype, JobInfo parentJobInfo, Set<JobInfo> jobInfos,
boolean firstChildOnly) {
boolean firstChildOnly, boolean includeJoblet) {
String jobletPaletteType = null;
String frameWork = ptype.getFramework();
if (StringUtils.isBlank(frameWork)) {
@@ -2547,7 +2590,7 @@ public class ProcessorUtilities {
} else if (frameWork.equals(HadoopConstants.FRAMEWORK_SPARK_STREAMING)) {
jobletPaletteType = ComponentCategory.CATEGORY_4_SPARKSTREAMING.getName();
}
for (NodeType node : nodes) {
for (NodeType node : nodes) {
boolean activate = true;
// check if node is active at least.
for (Object o : node.getElementParameter()) {
@@ -2590,7 +2633,7 @@ public class ProcessorUtilities {
jobInfos.add(jobInfo);
jobInfo.setFatherJobInfo(parentJobInfo);
if (!firstChildOnly) {
getAllJobInfo(processItem.getProcess(), jobInfo, jobInfos, firstChildOnly);
getAllJobInfo(processItem.getProcess(), jobInfo, jobInfos, firstChildOnly, includeJoblet);
}
}
}
@@ -2607,28 +2650,25 @@ public class ProcessorUtilities {
ProcessType jobletProcess = service.getJobletProcess(jobletComponent);
if (jobletComponent != null) {
if (!firstChildOnly) {
getAllJobInfo(jobletProcess, parentJobInfo, jobInfos, firstChildOnly);
} else {
getAllJobInfo(jobletProcess, parentJobInfo, jobInfos, firstChildOnly, includeJoblet);
}
if (firstChildOnly || (!firstChildOnly && includeJoblet)) {
Project project = null;
String componentName = node.getComponentName();
String[] array = componentName.split(":"); //$NON-NLS-1$
if (array.length == 2) {
// from ref project
String projectTechName = array[0];
project = ProjectManager.getInstance().getProjectFromProjectTechLabel(
projectTechName);
project = ProjectManager.getInstance().getProjectFromProjectTechLabel(projectTechName);
} else {
project = ProjectManager.getInstance().getCurrentProject();
}
Property property = service.getJobletComponentItem(jobletComponent);
Project currentProject = ProjectManager.getInstance().getCurrentProject();
if (project != null
&& !project.getTechnicalLabel().equals(currentProject.getTechnicalLabel())) {
if (project != null && !project.getTechnicalLabel().equals(currentProject.getTechnicalLabel())) {
try {
property = ProxyRepositoryFactory
.getInstance()
.getSpecificVersion(project, property.getId(), property.getVersion(),
true)
property = ProxyRepositoryFactory.getInstance()
.getSpecificVersion(project, property.getId(), property.getVersion(), true)
.getProperty();
} catch (PersistenceException e) {
ExceptionHandler.process(e);
@@ -2645,7 +2685,7 @@ public class ProcessorUtilities {
}
}
}
return jobInfos;
return jobInfos;
}
private static boolean isRouteletNode(NodeType node) {
@@ -2664,6 +2704,10 @@ public class ProcessorUtilities {
}
public static Set<JobInfo> getChildrenJobInfo(Item processItem, boolean firstChildOnly) {
return getChildrenJobInfo(processItem, firstChildOnly, false);
}
public static Set<JobInfo> getChildrenJobInfo(Item processItem, boolean firstChildOnly, boolean includeJoblet) {
// delegate to the new method, prevent dead loop method call. see bug 0004939: making tRunjobs work loop will
// cause a error of "out of memory" .
JobInfo parentJobInfo = null;
@@ -2692,7 +2736,7 @@ public class ProcessorUtilities {
}
}
if (parentJobInfo != null && processType != null) {
return getAllJobInfo(processType, parentJobInfo, new HashSet<JobInfo>(), firstChildOnly);
return getAllJobInfo(processType, parentJobInfo, new HashSet<JobInfo>(), firstChildOnly, includeJoblet);
}
return new HashSet<JobInfo>();
}
@@ -2931,9 +2975,12 @@ public class ProcessorUtilities {
public static void writeLog4j2ConfToFile(File configFile, Level rootLevel) throws IOException {
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
FileOutputStream configOs = new FileOutputStream(configFile);
final AppenderComponentBuilder appenderBuilder = builder.newAppender("Console", "Console").addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", "[%-5level] %d{HH:mm:ss} %logger{36}- %msg%n"));
final RootLoggerComponentBuilder rootLoggerBuilder = builder.newRootLogger(rootLevel).add(builder.newAppenderRef("Console"));
final AppenderComponentBuilder appenderBuilder = builder.newAppender("Console", "Console").addAttribute("target",
ConsoleAppender.Target.SYSTEM_OUT);
appenderBuilder
.add(builder.newLayout("PatternLayout").addAttribute("pattern", "[%-5level] %d{HH:mm:ss} %logger{36}- %msg%n"));
final RootLoggerComponentBuilder rootLoggerBuilder = builder.newRootLogger(rootLevel)
.add(builder.newAppenderRef("Console"));
builder.add(appenderBuilder);
builder.add(rootLoggerBuilder);
builder.writeXmlConfiguration(configOs);
@@ -2953,7 +3000,7 @@ public class ProcessorUtilities {
jarOs.closeEntry();
jarOs.close();
}
/**
* Generate a jar containing a log4j2 config file
*

View File

@@ -5999,20 +5999,17 @@
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="This subclass of Segment supports the full-function features that are limited to HDAM, HIDAM and HISAM databases: specifically logical children and secondary indexes."/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="deleteFlag" eType="#//cwmx/resource/imsdatabase/imstypes/FlagsType"
defaultValueLiteral="76">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="deleteFlag" eType="#//cwmx/resource/imsdatabase/imstypes/FlagsType">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="This attribute holds the value used for the delete rule."/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="insertFlag" eType="#//cwmx/resource/imsdatabase/imstypes/FlagsType"
defaultValueLiteral="76">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="insertFlag" eType="#//cwmx/resource/imsdatabase/imstypes/FlagsType">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="This attribute holds the value used for the insert rule. bidirectional is not used for the insert flag."/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="replaceFlag" eType="#//cwmx/resource/imsdatabase/imstypes/FlagsType"
defaultValueLiteral="76">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="replaceFlag" eType="#//cwmx/resource/imsdatabase/imstypes/FlagsType">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="This attribute holds the value used for the replace rule. bidirectional is not used for the replace flag."/>
</eAnnotations>

View File

@@ -19,6 +19,6 @@
<module>zip/pom.xml</module>
</modules>
<properties>
<m2.fasterxml.jackson.version>2.10.1</m2.fasterxml.jackson.version>
<m2.fasterxml.jackson.version>2.11.4</m2.fasterxml.jackson.version>
</properties>
</project>

View File

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

View File

@@ -11,7 +11,7 @@
<packaging>pom</packaging>
<properties>
<tcomp.version>1.29.1</tcomp.version>
<tcomp.version>1.30.0</tcomp.version>
<slf4j.version>1.7.25</slf4j.version>
</properties>

View File

@@ -19,5 +19,12 @@
priority="lowest">
</loginTask>
</extension>
<extension
point="org.talend.core.runtime.service">
<Service
class="org.talend.designer.maven.DesignerMavenService"
serviceId="IDesignerMavenService">
</Service>
</extension>
</plugin>

View File

@@ -0,0 +1,39 @@
// ============================================================================
//
// Copyright (C) 2006-2020 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.maven;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.runtime.services.IDesignerMavenService;
import org.talend.designer.maven.tools.CodesJarM2CacheManager;
import org.talend.designer.maven.utils.CodesJarMavenUtil;
public class DesignerMavenService implements IDesignerMavenService {
@Override
public String getCodesJarPackageByInnerCode(RoutineItem innerCodeItem) {
return CodesJarMavenUtil.getCodesJarPackageByInnerCode(innerCodeItem);
}
@Override
public String getImportGAVPackageForCodesJar(String projectTechName, Item codesJarItem) {
return CodesJarMavenUtil.getImportGAVPackageForCodesJar(projectTechName, codesJarItem);
}
@Override
public void updateCodeJarMavenProject(Property codeJarProperty, boolean needReSync) throws Exception {
CodesJarM2CacheManager.updateCodesJarProject(codeJarProperty, needReSync);
}
}

View File

@@ -26,8 +26,12 @@ public class TalendJavaProjectConstants {
public static final String DIR_ROUTINES = "routines"; //$NON-NLS-1$
public static final String DIR_ROUTINESJAR = "routinesjar"; //$NON-NLS-1$
public static final String DIR_BEANS = "beans"; //$NON-NLS-1$
public static final String DIR_BEANSJAR = "beansjar"; //$NON-NLS-1$
public static final String DIR_JOBS = "jobs"; //$NON-NLS-1$
public static final String DIR_PROCESS = "process"; //$NON-NLS-1$

View File

@@ -156,6 +156,10 @@ public interface TalendMavenConstants {
static final String DEFAULT_PIGUDF = "pigudf";
static final String DEFAULT_ROUTINESJAR = "routinesjar";
static final String DEFAULT_BEANSJAR = "beansjar";
static final String DEFAULT_JOB = "job";
static final String DEFAULT_JOBLET = "joblet";

View File

@@ -34,6 +34,7 @@ import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.m2e.core.MavenPlugin;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.utils.generation.JavaUtils;
import org.talend.core.model.properties.Property;
import org.talend.core.runtime.projectsetting.IProjectSettingPreferenceConstants;
import org.talend.core.runtime.projectsetting.IProjectSettingTemplateConstants;
import org.talend.designer.maven.DesignerMavenPlugin;
@@ -291,6 +292,14 @@ public class MavenTemplateManager {
return getCodesModelFromGeneralTemplate(defaultModel, projectTechName, "Routines", //$NON-NLS-1$
JavaUtils.JAVA_ROUTINES_DIRECTORY);
}
public static Model getRoutinesJarTempalteModel(Property property, String projectTechName) {
Model defaultModel = createDefaultCodesTempalteModel(
PomIdsHelper.getCodesGroupId(projectTechName, TalendMavenConstants.DEFAULT_ROUTINESJAR),
property.getLabel().toLowerCase(), PomIdsHelper.getCodesVersion(projectTechName));
return getCodesModelFromGeneralTemplate(defaultModel, projectTechName, property.getLabel().toLowerCase(),
JavaUtils.JAVA_ROUTINESJAR_DIRECTORY);
}
public static Model getBeansTempalteModel(String projectTechName) {
Model defaultModel = createDefaultCodesTempalteModel(
@@ -298,6 +307,14 @@ public class MavenTemplateManager {
TalendMavenConstants.DEFAULT_BEANS_ARTIFACT_ID, PomIdsHelper.getCodesVersion(projectTechName));
return getCodesModelFromGeneralTemplate(defaultModel, projectTechName, "Beans", JavaUtils.JAVA_BEANS_DIRECTORY); //$NON-NLS-1$
}
public static Model getBeansJarTempalteModel(Property property, String projectTechName) {
Model defaultModel = createDefaultCodesTempalteModel(
PomIdsHelper.getCodesGroupId(projectTechName, TalendMavenConstants.DEFAULT_BEANSJAR),
property.getLabel().toLowerCase(), PomIdsHelper.getCodesVersion(projectTechName));
return getCodesModelFromGeneralTemplate(defaultModel, projectTechName, property.getLabel().toLowerCase(),
JavaUtils.JAVA_BEANSJAR_DIRECTORY);
}
private static Model createDefaultCodesTempalteModel(String groupId, String artifactId, String version) {
Model templateRoutinesModel = new Model();

View File

@@ -58,6 +58,7 @@ import org.talend.core.context.Context;
import org.talend.core.context.RepositoryContext;
import org.talend.core.model.general.ILibrariesService;
import org.talend.core.model.general.ModuleNeeded;
import org.talend.core.model.general.ModuleNeeded.ELibraryInstallStatus;
import org.talend.core.model.general.Project;
import org.talend.core.model.process.ProcessUtils;
import org.talend.core.model.properties.Item;
@@ -67,6 +68,8 @@ import org.talend.core.model.relationship.Relation;
import org.talend.core.model.relationship.RelationshipItemBuilder;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.routines.CodesJarInfo;
import org.talend.core.model.routines.RoutinesUtil;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.repository.utils.ItemResourceUtil;
import org.talend.core.runtime.CoreRuntimePlugin;
@@ -77,7 +80,7 @@ import org.talend.core.runtime.process.TalendProcessArgumentConstant;
import org.talend.core.runtime.process.TalendProcessOptionConstants;
import org.talend.core.runtime.services.IFilterService;
import org.talend.core.ui.ITestContainerProviderService;
import org.talend.designer.core.ICamelDesignerCoreService;
import org.talend.core.utils.CodesJarResourceCache;
import org.talend.designer.maven.launch.MavenPomCommandLauncher;
import org.talend.designer.maven.model.MavenSystemFolders;
import org.talend.designer.maven.model.TalendJavaProjectConstants;
@@ -85,6 +88,7 @@ import org.talend.designer.maven.model.TalendMavenConstants;
import org.talend.designer.maven.template.MavenTemplateManager;
import org.talend.designer.maven.tools.creator.CreateMavenBeanPom;
import org.talend.designer.maven.tools.creator.CreateMavenRoutinePom;
import org.talend.designer.maven.utils.MavenProjectUtils;
import org.talend.designer.maven.utils.PomIdsHelper;
import org.talend.designer.maven.utils.PomUtil;
import org.talend.designer.runprocess.IRunProcessService;
@@ -164,34 +168,33 @@ public class AggregatorPomsHelper {
return getProjectPomsFolder().getFolder(DIR_AGGREGATORS);
}
public void updateCodeProjects(IProgressMonitor monitor) {
updateCodeProjects(monitor, false);
}
public void updateCodeProjects(IProgressMonitor monitor, boolean forceBuild) {
updateCodeProjects(monitor, forceBuild, false);
}
public void updateCodeProjects(IProgressMonitor monitor, boolean forceBuild, boolean ignoreM2Cache) {
updateCodeProjects(monitor, forceBuild, ignoreM2Cache, false);
}
public void updateCodeProjects(IProgressMonitor monitor, boolean forceBuild, boolean ignoreM2Cache, boolean buildIfNoUpdate) {
RepositoryWorkUnit workUnit = new RepositoryWorkUnit<Object>("update code project") { //$NON-NLS-1$
@Override
protected void run() {
Project currentProject = ProjectManager.getInstance().getCurrentProject();
for (ERepositoryObjectType codeType : ERepositoryObjectType.getAllTypesOfCodes()) {
try {
try {
for (ERepositoryObjectType codeType : ERepositoryObjectType.getAllTypesOfCodes()) {
ITalendProcessJavaProject codeProject = getCodesProject(codeType);
if (ERepositoryObjectType.ROUTINES == codeType) {
PomUtil.checkExistingLog4j2Dependencies4RoutinePom(projectTechName, codeProject.getProjectPom());
}
if (ignoreM2Cache || CodeM2CacheManager.needUpdateCodeProject(currentProject, codeType)) {
updateCodeProjectPom(monitor, codeType, codeProject.getProjectPom());
MavenProjectUtils.updateMavenProject(monitor, codeProject.getProject());
buildAndInstallCodesProject(monitor, codeType, true, forceBuild);
CodeM2CacheManager.updateCodeProjectCache(currentProject, codeType);
} else if (buildIfNoUpdate) {
buildAndInstallCodesProject(monitor, codeType, false, true);
}
} catch (Exception e) {
ExceptionHandler.process(e);
}
} catch (Exception e) {
ExceptionHandler.process(e);
}
}
};
@@ -204,16 +207,8 @@ public class AggregatorPomsHelper {
if (type != null) {
if (ERepositoryObjectType.ROUTINES == type) {
createRoutinesPom(pomFile, monitor);
} else {
if (GlobalServiceRegister.getDefault().isServiceRegistered(ICamelDesignerCoreService.class)) {
ICamelDesignerCoreService service =
(ICamelDesignerCoreService) GlobalServiceRegister.getDefault().getService(
ICamelDesignerCoreService.class);
ERepositoryObjectType beanType = service.getBeansType();
if (beanType != null && beanType == type) {
createBeansPom(pomFile, monitor);
}
}
} else if (ERepositoryObjectType.BEANS != null && ERepositoryObjectType.BEANS == type) {
createBeansPom(pomFile, monitor);
}
}
}
@@ -225,9 +220,16 @@ public class AggregatorPomsHelper {
ILibrariesService librariesService = GlobalServiceRegister.getDefault().getService(ILibrariesService.class);
ERepositoryObjectType.getAllTypesOfCodes()
.forEach(c -> neededModules.addAll(librariesService.getCodesModuleNeededs(c)));
neededModules.addAll(librariesService.getAllCodesJarModuleNeededs());
ILibraryManagerService repositoryBundleService = GlobalServiceRegister.getDefault()
.getService(ILibraryManagerService.class);
repositoryBundleService.installModules(neededModules, monitor);
repositoryBundleService.retrieve(neededModules, null, false);
Set<ModuleNeeded> toInstall = neededModules.stream()
.filter(module -> module.getDeployStatus() != ELibraryInstallStatus.DEPLOYED).collect(Collectors.toSet());
if (!toInstall.isEmpty()) {
repositoryBundleService.installModules(neededModules, monitor);
}
}
}
@@ -270,6 +272,35 @@ public class AggregatorPomsHelper {
}
}
// only compile for global/custom code projects
public static void buildCodesProject() {
IRunProcessService service = IRunProcessService.get();
if (service == null) {
return;
}
IProgressMonitor monitor = new NullProgressMonitor();
ERepositoryObjectType.getAllTypesOfCodes().forEach(type -> {
try {
buildAndInstallCodesProject(monitor, type, false, false);
} catch (Exception e) {
ExceptionHandler.process(e);
}
});
Set<CodesJarInfo> jarsToUpdate = CodesJarResourceCache.getAllCodesJars().stream()
.filter(info -> CodesJarM2CacheManager.needUpdateCodesJarProject(info)).collect(Collectors.toSet());
jarsToUpdate.stream().map(info -> service.getTalendCodesJarJavaProject(info)).forEach(p -> {
try {
p.buildModules(monitor, null, null);
} catch (Exception e) {
ExceptionHandler.process(e);
}
});
String currentProjectName = ProjectManager.getInstance().getCurrentProject().getTechnicalLabel();
jarsToUpdate.stream().filter(info -> !currentProjectName.equals(info.getProjectTechName()))
.forEach(info -> service.deleteTalendCodesJarProject(info, false));
}
public void updateRefProjectModules(List<ProjectReference> references, IProgressMonitor monitor) {
if (!needUpdateRefProjectModules()) {
return;
@@ -540,10 +571,15 @@ public class AggregatorPomsHelper {
if (codeType == ERepositoryObjectType.ROUTINES) {
return codesFolder.getFolder(DIR_ROUTINES);
}
if (codeType == ERepositoryObjectType.valueOf("BEANS")) { //$NON-NLS-1$
if (codeType == ERepositoryObjectType.BEANS) {
return codesFolder.getFolder(DIR_BEANS);
}
if (codeType == ERepositoryObjectType.ROUTINESJAR) {
return codesFolder.getFolder(DIR_ROUTINESJAR);
}
if (codeType == ERepositoryObjectType.BEANSJAR) {
return codesFolder.getFolder(DIR_BEANSJAR);
}
return null;
}
@@ -551,6 +587,16 @@ public class AggregatorPomsHelper {
return getCodeFolder(codeType).getFolder(MavenSystemFolders.JAVA.getPath());
}
public IFolder getCodesJarFolder(Property property) {
String codesJarName = property.getLabel();
ERepositoryObjectType type = ERepositoryObjectType.getItemType(property.getItem());
if (RoutinesUtil.isInnerCodes(property)) {
type = RoutinesUtil.getInnerCodeType(property);
codesJarName = RoutinesUtil.getCodesJarLabelByInnerCode(property.getItem());
}
return getCodeFolder(type).getFolder(codesJarName);
}
public IFolder getProcessFolder(ERepositoryObjectType type) {
return getProjectPomsFolder().getFolder(DIR_JOBS).getFolder(type.getFolder());
}
@@ -585,6 +631,12 @@ public class AggregatorPomsHelper {
* Use Function to get the relativePath from property at realtime, since the property may be changed
*/
public static IFolder getItemPomFolder(Property property, String realVersion, Function<Property, IPath> getItemRelativePath) {
return getItemPomFolder(property, ProjectManager.getInstance().getProject(property).getTechnicalLabel(), realVersion,
getItemRelativePath);
}
public static IFolder getItemPomFolder(Property property, String projectTechName, String realVersion,
Function<Property, IPath> getItemRelativePath) {
if (GlobalServiceRegister.getDefault().isServiceRegistered(ITestContainerProviderService.class)) {
ITestContainerProviderService testContainerService =
(ITestContainerProviderService) GlobalServiceRegister.getDefault().getService(
@@ -601,7 +653,6 @@ public class AggregatorPomsHelper {
}
}
String projectTechName = ProjectManager.getInstance().getProject(property).getTechnicalLabel();
AggregatorPomsHelper helper = new AggregatorPomsHelper(projectTechName);
IPath itemRelativePath = getItemRelativePath.apply(property);
String version = realVersion == null ? property.getVersion() : realVersion;
@@ -637,10 +688,6 @@ public class AggregatorPomsHelper {
}
}
public static String getCodeProjectId(ERepositoryObjectType codeType, String projectTechName) {
return projectTechName + "|" + codeType.name(); //$NON-NLS-1$
}
public static void checkJobPomCreation(ITalendProcessJavaProject jobProject) throws CoreException {
Model model = MavenPlugin.getMavenModelManager().readMavenModel(jobProject.getProjectPom());
boolean useTempPom = TalendJavaProjectConstants.TEMP_POM_ARTIFACT_ID.equals(model.getArtifactId());
@@ -869,6 +916,7 @@ public class AggregatorPomsHelper {
// codes pom
monitor.subTask("Synchronize code poms"); //$NON-NLS-1$
updateCodeProjects(monitor, true, true);
CodesJarM2CacheManager.updateCodesJarProject(monitor, true, true, true);
monitor.worked(1);
if (monitor.isCanceled()) {
return;
@@ -933,9 +981,13 @@ public class AggregatorPomsHelper {
if (service != null) {
modules.add(getModulePath(service.getTalendCodeJavaProject(ERepositoryObjectType.ROUTINES).getProjectPom()));
if (ProcessUtils.isRequiredBeans(null)) {
modules.add(getModulePath(service.getTalendCodeJavaProject(ERepositoryObjectType.valueOf("BEANS")) //$NON-NLS-1$
.getProjectPom()));
modules.add(getModulePath(service.getTalendCodeJavaProject(ERepositoryObjectType.BEANS).getProjectPom()));
}
String currentProjectTechName = ProjectManager.getInstance().getCurrentProject().getTechnicalLabel();
CodesJarResourceCache.getAllCodesJars().stream()
.filter(info -> info.getProjectTechName().equals(currentProjectTechName))
.forEach(info -> modules.add(
getModulePath(getCodesJarFolder(info.getProperty()).getFile(TalendMavenConstants.POM_FILE_NAME))));
}
}

View File

@@ -42,10 +42,17 @@ public class CodeM2CacheManager {
private static final String EMPTY_DATE;
private static File cacheFolder;
static {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(0);
EMPTY_DATE = ResourceHelper.dateFormat().format(c.getTime());
cacheFolder = new File(MavenPlugin.getMaven().getLocalRepositoryPath()).toPath().resolve(".codecache").resolve("codes")
.toFile();
if (!cacheFolder.exists()) {
cacheFolder.mkdirs();
}
}
public static boolean needUpdateCodeProject(Project project, ERepositoryObjectType codeType) {
@@ -68,7 +75,7 @@ public class CodeM2CacheManager {
String key = getKey(projectTechName, property);
String cacheValue = cache.getProperty(key);
if (cacheValue != null) {
Date currentDate = ResourceHelper.dateFormat().parse(getModifiedDate(projectTechName, property));
Date currentDate = ResourceHelper.dateFormat().parse(getModifiedDate(property));
Date cachedDate = ResourceHelper.dateFormat().parse(cacheValue);
if (currentDate.compareTo(cachedDate) != 0) {
return true;
@@ -92,7 +99,7 @@ public class CodeM2CacheManager {
for (IRepositoryViewObject codeItem : allCodes) {
Property property = codeItem.getProperty();
String key = getKey(projectTechName, property);
String value = getModifiedDate(projectTechName, property);
String value = getModifiedDate(property);
cache.put(key, value);
}
cache.store(out, StringUtils.EMPTY);
@@ -104,14 +111,14 @@ public class CodeM2CacheManager {
public static File getCacheFile(String projectTechName, ERepositoryObjectType codeType) {
String cacheFileName = PomIdsHelper.getProjectGroupId(projectTechName) + "." + codeType.name().toLowerCase() + "-" //$NON-NLS-1$ //$NON-NLS-2$
+ PomIdsHelper.getCodesVersion(projectTechName) + ".cache"; // $NON-NLS-1$
return new File(MavenPlugin.getMaven().getLocalRepositoryPath(), cacheFileName);
return new File(cacheFolder, cacheFileName);
}
private static String getKey(String projectTechName, Property property) {
return projectTechName + KEY_SEPERATOR + property.getId() + KEY_SEPERATOR + property.getVersion(); // $NON-NLS-1$
}
private static String getModifiedDate(String projectTechName, Property property) {
private static String getModifiedDate(Property property) {
String modifiedDate = (String) property.getAdditionalProperties().get(ItemProductKeys.DATE.getModifiedKey());
return StringUtils.isNotBlank(modifiedDate) ? modifiedDate : EMPTY_DATE;
}

View File

@@ -0,0 +1,480 @@
// ============================================================================
//
// Copyright (C) 2006-2020 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.maven.tools;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.EList;
import org.eclipse.m2e.core.MavenPlugin;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.model.general.Project;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.properties.RoutinesJarItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.routines.CodesJarInfo;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.repository.utils.RoutineUtils;
import org.talend.core.runtime.maven.MavenArtifact;
import org.talend.core.runtime.process.ITalendProcessJavaProject;
import org.talend.core.runtime.process.TalendProcessArgumentConstant;
import org.talend.core.runtime.repository.item.ItemProductKeys;
import org.talend.core.utils.CodesJarResourceCache;
import org.talend.cwm.helper.ResourceHelper;
import org.talend.designer.codegen.ICodeGeneratorService;
import org.talend.designer.codegen.ITalendSynchronizer;
import org.talend.designer.core.model.utils.emf.component.IMPORTType;
import org.talend.designer.maven.launch.MavenPomCommandLauncher;
import org.talend.designer.maven.model.TalendMavenConstants;
import org.talend.designer.maven.tools.creator.CreateMavenBeansJarPom;
import org.talend.designer.maven.tools.creator.CreateMavenRoutinesJarPom;
import org.talend.designer.maven.utils.PomIdsHelper;
import org.talend.designer.maven.utils.PomUtil;
import org.talend.designer.runprocess.IRunProcessService;
import org.talend.repository.ProjectManager;
import org.talend.repository.RepositoryWorkUnit;
import org.talend.utils.io.FilesUtils;
public class CodesJarM2CacheManager {
private static final String KEY_MODIFIED_DATE = "MODIFIED_DATE"; //$NON-NLS-1$
private static final String KEY_DEPENDENCY_LIST = "DEPENDENCY_LIST"; //$NON-NLS-1$
private static final String KEY_INNERCODE_PREFIX = "INNERCODE"; //$NON-NLS-1$
private static final String KEY_SEPERATOR = "|"; //$NON-NLS-1$
private static final String DEP_SEPERATOR = ","; //$NON-NLS-1$
private static final String EMPTY_DATE;
public final static String BUILD_AGGREGATOR_POM_NAME = "build-codesjar-aggregator.pom"; //$NON-NLS-1$
private static File cacheFolder;
static {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(0);
EMPTY_DATE = ResourceHelper.dateFormat().format(c.getTime());
cacheFolder = new File(MavenPlugin.getMaven().getLocalRepositoryPath()).toPath().resolve(".codecache").resolve("codesjar")
.toFile();
if (!cacheFolder.exists()) {
cacheFolder.mkdirs();
}
}
@SuppressWarnings("unchecked")
public static boolean needUpdateCodesJarProject(CodesJarInfo info) {
try {
Property property = info.getProperty();
String projectTechName = info.getProjectTechName();
File cacheFile = getCacheFile(projectTechName, property);
if (!cacheFile.exists()) {
return true;
}
DateFormat format = ResourceHelper.dateFormat();
Properties cache = new Properties();
cache.load(new FileInputStream(cacheFile));
String currentTime = getModifiedDate(property);
String cachedTime = cache.getProperty(KEY_MODIFIED_DATE);
// check codesjar modified date
if (cachedTime == null) {
return true;
}
if (format.parse(currentTime).compareTo(format.parse(cachedTime)) != 0) {
return true;
}
// check dependency list
String dependencies = cache.getProperty(KEY_DEPENDENCY_LIST);
List<String> cachedDepList;
if (dependencies == null) {
cachedDepList = Collections.emptyList();
} else {
cachedDepList = Arrays.asList(dependencies.split(DEP_SEPERATOR));
}
EList<IMPORTType> imports = ((RoutinesJarItem) property.getItem()).getRoutinesJarType().getImports();
List<String> currentDepList = imports.stream().map(IMPORTType::getMVN).collect(Collectors.toList());
if (cachedDepList.size() != currentDepList.size()) {
return true;
}
if (!cachedDepList.isEmpty() && !cachedDepList.stream().allMatch(s -> currentDepList.contains(s))) {
return true;
}
// // check inner codes
// ERepositoryObjectType codeType = ERepositoryObjectType.getItemType(property.getItem());
// Project project = ProjectManager.getInstance().getProjectFromProjectTechLabel(projectTechName);
// List<IRepositoryViewObject> currentInnerCodes =
// ProxyRepositoryFactory.getInstance().getAllInnerCodes(project,
// codeType, property);
// Map<Object, Object> cachedInnerCodes = cache.entrySet().stream()
// .filter(e -> e.getKey().toString().startsWith(KEY_INNERCODE_PREFIX))
// .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
// // check A/D
// if (currentInnerCodes.size() != cachedInnerCodes.size()) {
// return true;
// }
// // check M
// for (IRepositoryViewObject codeItem : currentInnerCodes) {
// Property innerCodeProperty = codeItem.getProperty();
// String key = getInnerCodeKey(projectTechName, innerCodeProperty);
// String cacheValue = (String) cachedInnerCodes.get(key);
// if (cacheValue != null) {
// Date currentDate = ResourceHelper.dateFormat().parse(getModifiedDate(innerCodeProperty));
// Date cachedDate = ResourceHelper.dateFormat().parse(cacheValue);
// if (currentDate.compareTo(cachedDate) != 0) {
// return true;
// }
// }
// }
} catch (IOException | ParseException e) {
ExceptionHandler.process(e);
// if any exception, still update in case breaking build job
return true;
}
return false;
}
@SuppressWarnings("unchecked")
public static void updateCodesJarProjectCache(CodesJarInfo info) {
Property property = info.getProperty();
String projectTechName = info.getProjectTechName();
Properties cache = new Properties();
File cacheFile = getCacheFile(projectTechName, property);
// update codesjar modified date
cache.setProperty(KEY_MODIFIED_DATE, getModifiedDate(property));
// update dependencies
EList<IMPORTType> imports = ((RoutinesJarItem) property.getItem()).getRoutinesJarType().getImports();
StringBuilder builder = new StringBuilder();
if (!imports.isEmpty()) {
imports.forEach(i -> builder.append(i.getMVN()).append(DEP_SEPERATOR));
cache.setProperty(KEY_DEPENDENCY_LIST, StringUtils.stripEnd(builder.toString(), DEP_SEPERATOR));
}
try (OutputStream out = new FileOutputStream(cacheFile)) {
// // update inner codes
// ERepositoryObjectType codeType = ERepositoryObjectType.getItemType(property.getItem());
// Project project = ProjectManager.getInstance().getProjectFromProjectTechLabel(projectTechName);
// List<IRepositoryViewObject> allInnerCodes =
// ProxyRepositoryFactory.getInstance().getAllInnerCodes(project, codeType,
// property);
// for (IRepositoryViewObject codeItem : allInnerCodes) {
// Property innerCodeProperty = codeItem.getProperty();
// String key = getInnerCodeKey(projectTechName, innerCodeProperty);
// String value = getModifiedDate(innerCodeProperty);
// cache.put(key, value);
// }
cache.store(out, StringUtils.EMPTY);
} catch (IOException e) {
ExceptionHandler.process(e);
}
}
public static void deleteCodesJarProjectCache(CodesJarInfo info) {
deleteCodesJarProjectCache(info.getProjectTechName(), ERepositoryObjectType.getItemType(info.getProperty().getItem()),
info.getProperty().getLabel());
}
public static void deleteCodesJarProjectCache(String projectTechName, ERepositoryObjectType type, String label) {
String baseName = ""; // $NON-NLS-1$
if (type == ERepositoryObjectType.ROUTINESJAR) {
baseName = TalendMavenConstants.DEFAULT_ROUTINESJAR;
} else if (type == ERepositoryObjectType.BEANSJAR) {
baseName = TalendMavenConstants.DEFAULT_BEANSJAR;
}
File cacheFile = getCacheFile(projectTechName, baseName, label);
if (cacheFile.exists()) {
cacheFile.delete();
}
MavenArtifact artifact = new MavenArtifact();
artifact.setGroupId(PomIdsHelper.getCodesJarGroupId(projectTechName, baseName));
artifact.setArtifactId(label.toLowerCase());
artifact.setVersion(PomIdsHelper.getCodesJarVersion(projectTechName));
File artifactFile = new File(PomUtil.getArtifactFullPath(artifact));
if (artifactFile.exists()) {
FilesUtils.deleteFolder(artifactFile.getParentFile().getParentFile(), true);
}
}
/**
* update code jar pom only when first time create project/dependencies changed
*/
public static void updateCodesJarProjectPom(IProgressMonitor monitor, CodesJarInfo info) {
try {
IFile pomFile = new AggregatorPomsHelper(info.getProjectTechName()).getCodesJarFolder(info.getProperty())
.getFile(TalendMavenConstants.POM_FILE_NAME);
ERepositoryObjectType type = ERepositoryObjectType.getItemType(info.getProperty().getItem());
if (type != null) {
if (ERepositoryObjectType.ROUTINESJAR == type) {
createRoutinesJarPom(info, pomFile, monitor);
} else if (ERepositoryObjectType.BEANSJAR != null && ERepositoryObjectType.BEANSJAR == type) {
createBeansJarPom(info, pomFile, monitor);
}
}
} catch (Exception e) {
ExceptionHandler.process(e);
}
}
private static void createRoutinesJarPom(CodesJarInfo info, IFile pomFile, IProgressMonitor monitor) throws Exception {
CreateMavenRoutinesJarPom createTemplatePom = new CreateMavenRoutinesJarPom(info.getProperty(), pomFile);
createTemplatePom.setProjectName(info.getProjectTechName());
createTemplatePom.create(monitor);
}
private static void createBeansJarPom(CodesJarInfo info, IFile pomFile, IProgressMonitor monitor) throws Exception {
CreateMavenBeansJarPom createTemplatePom = new CreateMavenBeansJarPom(info.getProperty(), pomFile);
createTemplatePom.setProjectName(info.getProjectTechName());
createTemplatePom.create(monitor);
}
public static void updateCodesJarProject(IProgressMonitor monitor) {
updateCodesJarProject(monitor, false, false, false);
}
public static void updateCodesJarProject(IProgressMonitor monitor, boolean forceBuild, boolean onlyCurrentProject,
boolean syncCode) {
Set<CodesJarInfo> toUpdate;
if (onlyCurrentProject) {
String currentProject = ProjectManager.getInstance().getCurrentProject().getTechnicalLabel();
toUpdate = CodesJarResourceCache.getAllCodesJars().stream().filter(
info -> info.getProjectTechName().equals(currentProject) && (forceBuild || needUpdateCodesJarProject(info)))
.collect(Collectors.toSet());
} else {
toUpdate = CodesJarResourceCache.getAllCodesJars().stream()
.filter(info -> forceBuild || needUpdateCodesJarProject(info)).collect(Collectors.toSet());
}
updateCodesJarProject(monitor, toUpdate, false, syncCode, false);
}
public static void updateCodesJarProject(Property property, boolean needReSync) throws Exception {
Set<CodesJarInfo> toUpdate = new HashSet<>();
toUpdate.add(CodesJarInfo.create(property));
updateCodesJarProject(new NullProgressMonitor(), toUpdate, false, needReSync, true);
}
public static void updateCodesJarProject(IProgressMonitor monitor, Set<CodesJarInfo> toUpdate, boolean generatePom,
boolean syncCode, boolean keepNonExistingProject) {
RepositoryWorkUnit<Object> workUnit = new RepositoryWorkUnit<Object>("update codesjar project") { //$NON-NLS-1$
@Override
protected void run() {
internalUpdateCodesJarProject(monitor, toUpdate, generatePom, syncCode, keepNonExistingProject);
}
};
workUnit.setAvoidUnloadResources(true);
ProxyRepositoryFactory.getInstance().executeRepositoryWorkUnit(workUnit);
}
public static void internalUpdateCodesJarProject(IProgressMonitor monitor, Set<CodesJarInfo> toUpdate, boolean generatePom,
boolean syncCode, boolean keepNonExistingProject) {
if (toUpdate.isEmpty()) {
return;
}
Set<ITalendProcessJavaProject> existingProjects = toUpdate.stream()
.map(info -> IRunProcessService.get().getExistingTalendCodesJarProject(info)).filter(p -> p != null)
.collect(Collectors.toSet());
try {
if (generatePom) {
// only for git update
toUpdate.forEach(info -> updateCodesJarProjectPom(monitor, info));
}
if (syncCode) {
toUpdate.forEach(info -> syncSourceCode(info));
}
// parallelBuild(monitor, projects);
install(toUpdate, monitor);
toUpdate.forEach(info -> updateCodesJarProjectCache(info));
} catch (Exception e) {
ExceptionHandler.process(e);
} finally {
if (!keepNonExistingProject) {
for (CodesJarInfo info : toUpdate) {
ITalendProcessJavaProject updatedProject = IRunProcessService.get().getExistingTalendCodesJarProject(info);
if (updatedProject != null && !existingProjects.contains(updatedProject)) {
IRunProcessService.get().deleteTalendCodesJarProject(info, false);
}
}
}
}
}
// TODO find a way to trigger parallel build
// not fully implemented, still build projects with build order
// but should be much faster than call ITalendProcessJavaProject.buildWholeCodeProject() one by one.
private static void parallelBuild(IProgressMonitor monitor, Set<IProject> projects) throws CoreException {
Set<IBuildConfiguration> configs = new HashSet<>(3);
for (IProject project : projects) {
configs.add(project.getActiveBuildConfig());
}
ResourcesPlugin.getWorkspace().build(configs.toArray(new IBuildConfiguration[configs.size()]),
IncrementalProjectBuilder.INCREMENTAL_BUILD, false, monitor);
// or just call buildParallel directly
// org.eclipse.core.internal.resources.Workspace workspace = (Workspace) ResourcesPlugin.getWorkspace();
// workspace.getBuildManager().buildParallel(configs, requestedConfigs, trigger, buildJobGroup, monitor);
}
private static void syncSourceCode(CodesJarInfo info) {
try {
Property property = info.getProperty();
String projectTechName = info.getProjectTechName();
ITalendProcessJavaProject codesJarProject = IRunProcessService.get().getTalendCodesJarJavaProject(info);
codesJarProject.cleanFolder(new NullProgressMonitor(), codesJarProject.getSrcFolder());
if (GlobalServiceRegister.getDefault().isServiceRegistered(ICodeGeneratorService.class)) {
ICodeGeneratorService codeGenService = (ICodeGeneratorService) GlobalServiceRegister.getDefault()
.getService(ICodeGeneratorService.class);
ITalendSynchronizer routineSynchronizer = codeGenService.createRoutineSynchronizer();
Project project = ProjectManager.getInstance().getProjectFromProjectTechLabel(projectTechName);
ERepositoryObjectType codesJarType = ERepositoryObjectType.getItemType(property.getItem());
List<IRepositoryViewObject> allInnerCodes = ProxyRepositoryFactory.getInstance().getAllInnerCodes(project,
codesJarType, property);
for (IRepositoryViewObject codesObj : allInnerCodes) {
RoutineItem codeItem = (RoutineItem) codesObj.getProperty().getItem();
RoutineUtils.changeInnerCodePackage(codeItem, false, false);
routineSynchronizer.syncRoutine(codeItem, true, true);
}
}
} catch (Exception e) {
ExceptionHandler.process(e);
}
}
private static void install(Set<CodesJarInfo> toUpdate, IProgressMonitor monitor) throws Exception {
if (toUpdate.isEmpty()) {
return;
}
IFile pomFile = createBuildAggregatorPom(toUpdate);
Set<ITalendProcessJavaProject> projects = toUpdate.stream()
.map(info -> IRunProcessService.get().getTalendCodesJarJavaProject(info)).collect(Collectors.toSet());
try {
for (ITalendProcessJavaProject project : projects) {
Model model = MavenPlugin.getMavenModelManager().readMavenModel(project.getProjectPom());
MavenArtifact artifact = new MavenArtifact();
artifact.setGroupId(model.getGroupId());
artifact.setArtifactId(model.getArtifactId());
artifact.setVersion(model.getVersion());
String artifactPath = PomUtil.getArtifactPath(artifact);
String localRepositoryPath = MavenPlugin.getMaven().getLocalRepositoryPath();
if (localRepositoryPath != null) {
File moduleFolder = new File(localRepositoryPath, artifactPath);
PomUtil.cleanLastUpdatedFile(moduleFolder.getParentFile());
}
}
Map<String, Object> argumentsMap = new HashMap<>();
argumentsMap.put(TalendProcessArgumentConstant.ARG_PROGRAM_ARGUMENTS,
"-fn -T 1 -f " + BUILD_AGGREGATOR_POM_NAME //$NON-NLS-1$
+ " -Dmaven.compiler.failOnError=false"/* + TalendMavenConstants.ARG_MAIN_SKIP */); //$NON-NLS-1$ //$NON-NLS-2$
MavenPomCommandLauncher mavenLauncher = new MavenPomCommandLauncher(pomFile, TalendMavenConstants.GOAL_INSTALL);
mavenLauncher.setArgumentsMap(argumentsMap);
mavenLauncher.setSkipTests(true);
mavenLauncher.execute(monitor);
} finally {
if (pomFile.exists()) {
pomFile.delete(true, false, monitor);
}
}
}
private static IFile createBuildAggregatorPom(Set<CodesJarInfo> toUpdate) throws Exception {
IFile pomFile = new AggregatorPomsHelper().getProjectPomsFolder().getFile(new Path(BUILD_AGGREGATOR_POM_NAME));
Model model = new Model();
model.setModelVersion("4.0.0"); //$NON-NLS-1$
model.setGroupId(TalendMavenConstants.DEFAULT_GROUP_ID);
model.setArtifactId("build.codesjar.aggregator"); //$NON-NLS-1$
model.setVersion("7.0.0"); //$NON-NLS-1$
model.setPackaging(TalendMavenConstants.PACKAGING_POM);
model.setModules(new ArrayList<String>());
toUpdate.stream().forEach(info -> model.getModules().add(getModulePath(info)));
Parent parent = new Parent();
parent.setGroupId(PomIdsHelper.getProjectGroupId());
parent.setArtifactId(PomIdsHelper.getProjectArtifactId());
parent.setVersion(PomIdsHelper.getProjectVersion());
model.setParent(parent);
PomUtil.savePom(null, model, pomFile);
return pomFile;
}
private static String getModulePath(CodesJarInfo info) {
String projectTechName = info.getProjectTechName();
IPath basePath = new AggregatorPomsHelper().getProjectPomsFolder().getLocation();
IPath codeJarProjectPath = new AggregatorPomsHelper(projectTechName).getCodesJarFolder(info.getProperty()).getLocation();
String modulePath = codeJarProjectPath.makeRelativeTo(basePath).toPortableString();
return modulePath;
}
public static File getCacheFile(String projectTechName, Property property) {
String cacheFileName = PomIdsHelper.getCodesJarGroupId(projectTechName, property.getItem()) + "." //$NON-NLS-1$
+ property.getLabel().toLowerCase() + "-" //$NON-NLS-1$
+ PomIdsHelper.getCodesVersion(projectTechName) + ".cache"; // $NON-NLS-1$
return new File(cacheFolder, cacheFileName);
}
private static File getCacheFile(String projectTechName, String baseName, String label) {
String cacheFileName = PomIdsHelper.getCodesJarGroupId(projectTechName, baseName) + "." //$NON-NLS-1$
+ label.toLowerCase() + "-" //$NON-NLS-1$
+ PomIdsHelper.getCodesVersion(projectTechName) + ".cache"; // $NON-NLS-1$
return new File(cacheFolder, cacheFileName);
}
private static String getInnerCodeKey(String projectTechName, Property property) {
return KEY_INNERCODE_PREFIX + KEY_SEPERATOR + property.getId() + KEY_SEPERATOR + property.getVersion();
}
private static String getModifiedDate(Property property) {
String modifiedDate = (String) property.getAdditionalProperties().get(ItemProductKeys.DATE.getModifiedKey());
return StringUtils.isNotBlank(modifiedDate) ? modifiedDate : EMPTY_DATE;
}
}

View File

@@ -183,7 +183,7 @@ public class MavenPomSynchronizer {
public void afterChangingLibraries() {
try {
// update the dependencies
new AggregatorPomsHelper().updateCodeProjects(new NullProgressMonitor());
new AggregatorPomsHelper().updateCodeProjects(new NullProgressMonitor(), false, false);
} catch (Exception e) {
ExceptionHandler.process(e);
}

View File

@@ -116,7 +116,7 @@ public abstract class AbstractMavenCodesTemplatePom extends AbstractMavenGeneral
} else {
isDeployed = true;
}
if (isDeployed) {
if (ignoreModuleInstallationStatus() || isDeployed) {
dependency = PomUtil.createModuleDependency(module.getMavenUri());
if (module.isExcluded())
dependency.setScope("provided");
@@ -129,4 +129,9 @@ public abstract class AbstractMavenCodesTemplatePom extends AbstractMavenGeneral
}
protected abstract Set<ModuleNeeded> getDependenciesModules();
protected boolean ignoreModuleInstallationStatus() {
return false;
}
}

View File

@@ -13,10 +13,12 @@
package org.talend.designer.maven.tools.creator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
@@ -50,6 +52,9 @@ import org.talend.core.runtime.process.LastGenerationInfo;
import org.talend.core.runtime.projectsetting.IProjectSettingTemplateConstants;
import org.talend.core.runtime.repository.build.IMavenPomCreator;
import org.talend.core.ui.ITestContainerProviderService;
import org.talend.core.utils.CodesJarResourceCache;
import org.talend.designer.core.model.utils.emf.talendfile.ProcessType;
import org.talend.designer.core.model.utils.emf.talendfile.RoutinesParameterType;
import org.talend.designer.maven.model.TalendMavenConstants;
import org.talend.designer.maven.template.ETalendMavenVariables;
import org.talend.designer.maven.tools.ProcessorDependenciesManager;
@@ -285,6 +290,7 @@ public abstract class AbstractMavenProcessorPom extends CreateMavenBundleTemplat
protected void addCodesDependencies(final List<Dependency> dependencies) {
dependencies.addAll(getCodesDependencies());
dependencies.addAll(getCodesJarDependencies());
}
protected List<Dependency> getCodesDependencies() {
@@ -308,6 +314,30 @@ public abstract class AbstractMavenProcessorPom extends CreateMavenBundleTemplat
return dependencies;
}
@SuppressWarnings("unchecked")
protected List<Dependency> getCodesJarDependencies() {
Property property = getJobProcessor().getProperty();
if (property != null && getProcessType() != null && getProcessType().getParameters() != null) {
return new ArrayList<>(createCodesJarDependencies(getProcessType().getParameters().getRoutinesParameter()));
}
return Collections.emptyList();
}
protected Set<Dependency> createCodesJarDependencies(List<RoutinesParameterType> routineParameters) {
if (routineParameters == null) {
return Collections.emptySet();
}
return routineParameters.stream().filter(r -> r.getType() != null)
.map(r -> CodesJarResourceCache.getCodesJarById(r.getId())).filter(info -> info != null)
.map(info -> PomUtil.createDependency(
PomIdsHelper.getCodesJarGroupId(info.getProjectTechName(), info.getProperty().getItem()),
info.getProperty().getLabel().toLowerCase(), PomIdsHelper.getCodesJarVersion(info.getProjectTechName()),
null))
.collect(Collectors.toSet());
}
abstract protected ProcessType getProcessType();
protected void addChildrenDependencies(final List<Dependency> dependencies) {
String parentId = getJobProcessor().getProperty().getId();

View File

@@ -0,0 +1,56 @@
// ============================================================================
//
// Copyright (C) 2006-2019 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.maven.tools.creator;
import java.util.HashSet;
import java.util.Set;
import org.apache.maven.model.Model;
import org.eclipse.core.resources.IFile;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.model.general.ILibrariesService;
import org.talend.core.model.general.ModuleNeeded;
import org.talend.core.model.properties.Property;
import org.talend.designer.maven.template.MavenTemplateManager;
public class CreateMavenBeansJarPom extends AbstractMavenCodesTemplatePom {
private Property property;
public CreateMavenBeansJarPom(Property property, IFile pomFile) {
super(pomFile);
this.property = property;
}
@Override
protected Model getTemplateModel() {
return MavenTemplateManager.getBeansJarTempalteModel(property, getProjectName());
}
@Override
protected Set<ModuleNeeded> getDependenciesModules() {
Set<ModuleNeeded> runningModules = new HashSet<>();
if (GlobalServiceRegister.getDefault().isServiceRegistered(ILibrariesService.class)) {
ILibrariesService libService = (ILibrariesService) GlobalServiceRegister.getDefault().getService(
ILibrariesService.class);
runningModules.addAll(libService.getCodesJarModuleNeededs(property));
}
return runningModules;
}
@Override
protected boolean ignoreModuleInstallationStatus() {
return true;
}
}

View File

@@ -17,12 +17,14 @@ import java.io.InputStream;
import org.apache.maven.model.Model;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.embedder.MavenModelManager;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.utils.io.FilesUtils;
import org.talend.commons.utils.workbench.resources.ResourceUtils;
import org.talend.core.PluginChecker;
import org.talend.designer.maven.template.MavenTemplateManager;
import org.talend.designer.maven.utils.PomUtil;
@@ -153,6 +155,9 @@ public class CreateMavenBundleTemplatePom extends CreateMaven {
if (curPomFile == null) {
return;
}
if (!curPomFile.getParent().exists()) {
ResourceUtils.createFolder((IFolder) curPomFile.getParent());
}
Model model = createModel();
if (model == null) {

View File

@@ -29,6 +29,7 @@ import java.util.Properties;
import java.util.Scanner;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
@@ -59,10 +60,12 @@ import org.talend.core.model.process.IProcess;
import org.talend.core.model.process.IProcess2;
import org.talend.core.model.process.JobInfo;
import org.talend.core.model.process.ProcessUtils;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.ProcessItem;
import org.talend.core.model.properties.Project;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.routines.RoutinesUtil;
import org.talend.core.model.utils.JavaResourcesHelper;
import org.talend.core.repository.utils.ItemResourceUtil;
import org.talend.core.runtime.maven.MavenConstants;
@@ -76,6 +79,7 @@ import org.talend.core.runtime.projectsetting.IProjectSettingTemplateConstants;
import org.talend.core.runtime.projectsetting.ProjectPreferenceManager;
import org.talend.core.ui.ITestContainerProviderService;
import org.talend.core.utils.TemplateFileUtils;
import org.talend.designer.core.model.utils.emf.talendfile.ProcessType;
import org.talend.designer.maven.model.TalendMavenConstants;
import org.talend.designer.maven.template.ETalendMavenVariables;
import org.talend.designer.maven.template.MavenTemplateManager;
@@ -664,26 +668,37 @@ public class CreateMavenJobPom extends AbstractMavenProcessorPom {
}
// talend libraries and codes
String projectGroupId = PomIdsHelper.getProjectGroupId(ProjectManager.getInstance().getProject(currentJobProperty).getTechnicalLabel());
List<Dependency> dependencies = new ArrayList<>();
// codes
List<Dependency> codeDependencies = getCodesDependencies();
List<Dependency> codeDependencies = new ArrayList<>();
addCodesDependencies(codeDependencies);
// codesjar
codeDependencies.addAll(getCodesJarDependenciesFromChildren());
dependencies.addAll(codeDependencies);
// codes dependencies (optional)
ERepositoryObjectType.getAllTypesOfCodes().forEach(t -> dependencies.addAll(PomUtil.getCodesDependencies(t)));
// libraries of talend/3rd party
Set<Dependency> parentJobDependencies = processor.getNeededModules(TalendProcessOptionConstants.MODULES_EXCLUDE_SHADED).stream()
Set<Dependency> parentJobDependencies = processor
.getNeededModules(
TalendProcessOptionConstants.MODULES_EXCLUDE_SHADED | TalendProcessOptionConstants.MODULES_WITH_CODESJAR)
.stream()
.filter(m -> !m.isExcluded()).map(m -> createDenpendency(m, false))
.collect(Collectors.toSet());
dependencies.addAll(parentJobDependencies);
// get codesjar libraries from related joblets
dependencies.addAll(processor.getCodesJarModulesNeededOfJoblets().stream().map(m -> createDenpendency(m, false))
.collect(Collectors.toSet()));
// missing modules from the job generation of children
Map<String, Set<Dependency>> childjobDependencies = new HashMap<String, Set<Dependency>>();
childrenJobInfo.forEach(j -> {
Set<Dependency> collectDependency = LastGenerationInfo.getInstance().getModulesNeededPerJob(j.getJobId(), j.getJobVersion()).stream()
Set<Dependency> collectDependency = Stream
.concat(LastGenerationInfo.getInstance().getModulesNeededPerJob(j.getJobId(), j.getJobVersion()).stream(),
LastGenerationInfo.getInstance().getCodesJarModulesNeededPerJob(j.getJobId(), j.getJobVersion())
.stream())
.filter(m -> !m.isExcluded()).map(m -> createDenpendency(m, false)).collect(Collectors.toSet());
dependencies.addAll(collectDependency);
childjobDependencies.put(j.getJobId(), collectDependency);});
@@ -763,6 +778,12 @@ public class CreateMavenJobPom extends AbstractMavenProcessorPom {
}
}
private List<Dependency> getCodesJarDependenciesFromChildren() {
List<Dependency> dependencies = new ArrayList<>();
getJobProcessor().getBuildChildrenJobsAndJoblets().stream().filter(info -> !info.isTestContainer()).forEach(
info -> dependencies.addAll(createCodesJarDependencies(RoutinesUtil.getRoutinesParametersFromJobInfo(info))));
return dependencies;
}
// remove duplicate job dependencies and only keep the latest one
// keep high priority dependencies if set by tLibraryLoad
@@ -1018,4 +1039,10 @@ public class CreateMavenJobPom extends AbstractMavenProcessorPom {
}
@Override
protected ProcessType getProcessType() {
Item item = this.getJobProcessor().getProperty().getItem();
return ((ProcessItem) item).getProcess();
}
}

View File

@@ -23,11 +23,13 @@ import org.eclipse.core.resources.IFile;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.core.model.process.IProcess;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.JobletProcessItem;
import org.talend.core.model.properties.Project;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.utils.JavaResourcesHelper;
import org.talend.core.runtime.projectsetting.IProjectSettingTemplateConstants;
import org.talend.designer.core.model.utils.emf.talendfile.ProcessType;
import org.talend.designer.maven.template.ETalendMavenVariables;
import org.talend.designer.maven.template.MavenTemplateManager;
import org.talend.designer.maven.utils.PomIdsHelper;
@@ -126,10 +128,17 @@ public class CreateMavenJobletPom extends AbstractMavenProcessorPom {
if (ERepositoryObjectType.JOBLET == ERepositoryObjectType.getType(getJobProcessor().getProperty())) {
getProcessorDependenciesManager().updateDependencies(null, model);
}
model.getDependencies().addAll(getCodesJarDependencies());
addChildrenDependencies(model.getDependencies());
} catch (ProcessorException e) {
ExceptionHandler.process(e);
}
}
@Override
protected ProcessType getProcessType() {
Item item = getJobProcessor().getProperty().getItem();
return ((JobletProcessItem) item).getJobletProcess();
}
}

View File

@@ -0,0 +1,56 @@
// ============================================================================
//
// Copyright (C) 2006-2019 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.maven.tools.creator;
import java.util.HashSet;
import java.util.Set;
import org.apache.maven.model.Model;
import org.eclipse.core.resources.IFile;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.model.general.ILibrariesService;
import org.talend.core.model.general.ModuleNeeded;
import org.talend.core.model.properties.Property;
import org.talend.designer.maven.template.MavenTemplateManager;
public class CreateMavenRoutinesJarPom extends AbstractMavenCodesTemplatePom {
private Property property;
public CreateMavenRoutinesJarPom(Property property, IFile pomFile) {
super(pomFile);
this.property = property;
}
@Override
protected Model getTemplateModel() {
return MavenTemplateManager.getRoutinesJarTempalteModel(property, getProjectName());
}
@Override
protected Set<ModuleNeeded> getDependenciesModules() {
Set<ModuleNeeded> runningModules = new HashSet<>();
if (GlobalServiceRegister.getDefault().isServiceRegistered(ILibrariesService.class)) {
ILibrariesService libService = (ILibrariesService) GlobalServiceRegister.getDefault().getService(
ILibrariesService.class);
runningModules.addAll(libService.getCodesJarModuleNeededs(property));
}
return runningModules;
}
@Override
protected boolean ignoreModuleInstallationStatus() {
return true;
}
}

View File

@@ -13,6 +13,12 @@
package org.talend.designer.maven.tools.creator;
import org.eclipse.core.resources.IFile;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.ProcessItem;
import org.talend.core.ui.ITestContainerProviderService;
import org.talend.designer.core.model.utils.emf.talendfile.ProcessType;
import org.talend.designer.runprocess.IProcessor;
/**
@@ -30,4 +36,17 @@ public class CreateMavenTestPom extends CreateMavenJobPom {
super(jobProcessor, pomFile);
}
@Override
protected ProcessType getProcessType() {
try {
Item parentJobItem = ITestContainerProviderService.get().getParentJobItem(getJobProcessor().getProperty().getItem());
if (parentJobItem != null) {
return ((ProcessItem) parentJobItem).getProcess();
}
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
return null;
}
}

View File

@@ -0,0 +1,40 @@
// ============================================================================
//
// Copyright (C) 2006-2020 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.maven.utils;
import org.apache.commons.lang3.StringUtils;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.routines.RoutinesUtil;
import org.talend.repository.ProjectManager;
public class CodesJarMavenUtil {
public static String getCodesJarPackageByInnerCode(RoutineItem innerCodeItem) {
String codesJarName = RoutinesUtil.getCodesJarLabelByInnerCode(innerCodeItem);
String projectTechName = ProjectManager.getInstance().getProject(innerCodeItem).getTechnicalLabel();
return StringUtils.replace(PomIdsHelper.getCodesJarGroupIdByInnerCode(projectTechName, innerCodeItem), ".", "/") + "/" //$NON-NLS-1$
+ codesJarName.toLowerCase();
}
public static String getGAVPackageForCodesJar(Item codesJarItem) {
return StringUtils.replace(PomIdsHelper.getCodesJarGroupId(codesJarItem), ".", "/") + "/"
+ codesJarItem.getProperty().getLabel().toLowerCase();
}
public static String getImportGAVPackageForCodesJar(String projectTechName, Item codesJarItem) {
return PomIdsHelper.getCodesJarGroupId(projectTechName, codesJarItem) + "."
+ codesJarItem.getProperty().getLabel().toLowerCase() + ".*";
}
}

View File

@@ -42,11 +42,9 @@ import org.eclipse.m2e.core.project.ProjectImportConfiguration;
import org.osgi.service.prefs.BackingStoreException;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.utils.generation.JavaUtils;
import org.talend.core.GlobalServiceRegister;
import org.talend.designer.maven.model.MavenSystemFolders;
import org.talend.designer.maven.model.ProjectSystemFolder;
import org.talend.designer.maven.model.TalendMavenConstants;
import org.talend.designer.runprocess.IRunProcessService;
/**
* DOC zwxue class global comment. Detailled comment
@@ -94,12 +92,8 @@ public class MavenProjectUtils {
return;
}
MavenPlugin.getProjectConfigurationManager().updateProjectConfiguration(project, monitor);
if (GlobalServiceRegister.getDefault().isServiceRegistered(IRunProcessService.class)) {
IRunProcessService service = (IRunProcessService) GlobalServiceRegister.getDefault().getDefault()
.getService(IRunProcessService.class);
changeClasspath(monitor, project, MavenSystemFolders.ALL_DIRS_EXT);
}
changeClasspath(monitor, project, MavenSystemFolders.ALL_DIRS_EXT);
// only need this when pom has no parent.
// IJavaProject javaProject = JavaCore.create(project);

View File

@@ -23,12 +23,17 @@ import org.talend.core.IESBService;
import org.talend.core.PluginChecker;
import org.talend.core.model.general.Project;
import org.talend.core.model.process.JobInfo;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.properties.RoutinesJarItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.routines.RoutinesUtil;
import org.talend.core.model.utils.JavaResourcesHelper;
import org.talend.core.repository.utils.ItemResourceUtil;
import org.talend.core.runtime.maven.MavenConstants;
import org.talend.core.runtime.projectsetting.ProjectPreferenceManager;
import org.talend.designer.core.ICamelDesignerCoreService;
import org.talend.designer.maven.DesignerMavenPlugin;
import org.talend.designer.maven.model.TalendMavenConstants;
import org.talend.repository.ProjectManager;
@@ -126,6 +131,49 @@ public class PomIdsHelper {
return getProjectVersion(projectTechName);
}
public static String getCodesJarGroupId(Item item) {
return getCodesJarGroupId(null, item);
}
public static String getCodesJarGroupId(String projectTechName, Item item) {
if (!(item instanceof RoutinesJarItem)) {
return null;
}
String baseName = TalendMavenConstants.DEFAULT_ROUTINESJAR;
if (GlobalServiceRegister.getDefault().isServiceRegistered(ICamelDesignerCoreService.class)) {
ICamelDesignerCoreService camelService = GlobalServiceRegister.getDefault()
.getService(ICamelDesignerCoreService.class);
if (camelService.isInstanceofCamelBeansJar(item)) {
baseName = TalendMavenConstants.DEFAULT_BEANSJAR;
}
}
return getCodesJarGroupId(projectTechName, baseName);
}
public static String getCodesJarGroupIdByInnerCode(String projectTechName, Item item) {
if (!(item instanceof RoutineItem)) {
return null;
}
String baseName = TalendMavenConstants.DEFAULT_ROUTINESJAR;
if (ERepositoryObjectType.BEANSJAR != null
&& ERepositoryObjectType.BEANSJAR == RoutinesUtil.getInnerCodeType(item.getProperty())) {
baseName = TalendMavenConstants.DEFAULT_BEANSJAR;
}
return getCodesJarGroupId(projectTechName, baseName);
}
public static String getCodesJarGroupId(String projectTechName, String baseName) {
return getCodesGroupId(projectTechName, baseName);
}
public static String getCodesJarVersion() {
return getCodesVersion();
}
public static String getCodesJarVersion(String projectTechName) {
return getCodesVersion(projectTechName);
}
@Deprecated
public static String getJobGroupId(String name) {
if (name != null && !name.trim().isEmpty()) {

View File

@@ -71,7 +71,6 @@ import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.runtime.utils.io.IOUtils;
import org.talend.commons.utils.VersionUtils;
import org.talend.commons.utils.generation.JavaUtils;
import org.talend.commons.utils.io.FilesUtils;
import org.talend.commons.utils.workbench.resources.ResourceUtils;
import org.talend.core.GlobalServiceRegister;
@@ -768,18 +767,6 @@ public class PomUtil {
return codesModules;
}
public static List<String> getCodesExportJars(IProcess process) {
List<String> codesJars = new ArrayList<>();
// add routines always.
codesJars.add(JavaUtils.ROUTINES_JAR);
// Beans
if (ProcessUtils.isRequiredBeans(process)) {
codesJars.add(JavaUtils.BEANS_JAR);
}
return codesJars;
}
public static Map<String, Object> getTemplateParameters(IProcessor processor) {
Map<String, Object> parameters = new HashMap<>();
if (processor != null) {

View File

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

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.talend.libraries.apache.batik</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@@ -1,6 +0,0 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Batik
Bundle-SymbolicName: org.talend.libraries.apache.batik
Bundle-Version: 7.3.1.qualifier
Eclipse-BundleShape: dir

View File

@@ -1 +0,0 @@
jarprocessor.exclude.children=true

View File

@@ -1,3 +0,0 @@
output.. = bin/
bin.includes = META-INF/,\
lib/

Some files were not shown because too many files have changed in this diff Show More