From 2298c4433942af862391687d2a5ebb5ac46ace51 Mon Sep 17 00:00:00 2001 From: pyzhou Date: Tue, 10 Aug 2021 09:48:01 +0800 Subject: [PATCH 1/5] fix(TDI-46373):Resuming logs refactor with NIO and FileLock (#4465) * fix(TDI-46373):Resuming logs refactor with NIO and FileLock * fix(TDI-46373):remove debug info * Remove the double lock and release in finally * Remove UTF-8 and refactor --- .../java/routines/system/ResumeUtil.java | 73 ++++++++++++++----- 1 file changed, 53 insertions(+), 20 deletions(-) diff --git a/main/plugins/org.talend.librariesmanager/resources/java/routines/system/ResumeUtil.java b/main/plugins/org.talend.librariesmanager/resources/java/routines/system/ResumeUtil.java index 8399b36f79..68a7f67e44 100644 --- a/main/plugins/org.talend.librariesmanager/resources/java/routines/system/ResumeUtil.java +++ b/main/plugins/org.talend.librariesmanager/resources/java/routines/system/ResumeUtil.java @@ -13,10 +13,13 @@ package routines.system; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; -import java.io.Writer; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; +import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -53,7 +56,7 @@ public class ResumeUtil { private static Object lock = new Object(); // step1: init the log file name - public ResumeUtil(String logFileName, boolean createNewFile, String root_pid) { + public ResumeUtil(String logFileName, boolean append, String root_pid) { if (logFileName == null || logFileName.equals("null")) { return; } @@ -70,7 +73,13 @@ public class ResumeUtil { File file = new File(logFileName); try { if (sharedWriter == null) { - this.csvWriter = new SimpleCsvWriter(new FileWriter(logFileName, createNewFile)); + FileChannel fc = new RandomAccessFile(logFileName, "rw").getChannel(); + if(append){ + fc.position(fc.size()); + }else { + fc.truncate(0); + } + this.csvWriter = new SimpleCsvWriter(fc); // output the header part if (file.length() == 0) { @@ -97,9 +106,6 @@ public class ResumeUtil { csvWriter.write("dynamicData");// dynamicData csvWriter.endRecord(); csvWriter.flush(); - csvWriter.close(); - // To avoid use File.delete() as it cannot make sure file being deleted. - this.csvWriter = new SimpleCsvWriter(new FileWriter(logFileName, true)); } // shared sharedWriterMap.put(this.root_pid, this.csvWriter); @@ -138,8 +144,10 @@ public class ResumeUtil { JobLogItem item = new JobLogItem(eventDate, type, partName, parentPart, threadId, logPriority, errorCode, message, stackTrace, dynamicData); + FileLock fileLock = null; try { synchronized (csvWriter) { + fileLock = csvWriter.getlock(); if (genDynamicPart) { csvWriter.write(item.eventDate);// eventDate--------------->??? csvWriter.write(commonInfo.pid);// pid @@ -164,6 +172,7 @@ public class ResumeUtil { csvWriter.write(item.dynamicData);// dynamicData--->it is the 17th field. @see:feature:11296 csvWriter.endRecord(); csvWriter.flush(); + fileLock.release(); } // for test the order // System.out.print(item.partName + ",");// partName @@ -173,6 +182,15 @@ public class ResumeUtil { // System.out.println(); } catch (Exception e) { e.printStackTrace(); + }finally { + if (fileLock != null) { + try { + fileLock.release(); + fileLock = null; + } catch (IOException e) { + e.printStackTrace(); + } + } } } @@ -457,7 +475,11 @@ public class ResumeUtil { */ public class SimpleCsvWriter { - private Writer writer = null; + private FileChannel channel = null; + + private ByteBuffer buf = null; + + private boolean firstColumn = true; @@ -467,11 +489,11 @@ public class ResumeUtil { private static final int EscapeMode = ESCAPE_MODE_DOUBLED; - private static final char TextQualifier = '"'; + private static final String TextQualifier = "\""; - private static final char BACKSLASH = '\\'; + private static final String BACKSLASH = "\\"; - private static final char Delimiter = ','; + private static final String Delimiter = ","; // JDK1.5 can't pass compile // private String lineSeparator = (String) @@ -481,8 +503,9 @@ public class ResumeUtil { private String lineSeparator = System.getProperty("line.separator"); - public SimpleCsvWriter(Writer writer) { - this.writer = writer; + public SimpleCsvWriter(FileChannel channel) { + this.channel = channel; + buf = ByteBuffer.allocate(2<<14);//32k buffer size } /** @@ -495,10 +518,10 @@ public class ResumeUtil { } if (!firstColumn) { - writer.write(Delimiter); + buf.put(Delimiter.getBytes()); } - writer.write(TextQualifier); + buf.put(TextQualifier.getBytes()); // support backslash mode if (EscapeMode == ESCAPE_MODE_BACKSLASH) { @@ -508,18 +531,22 @@ public class ResumeUtil { content = replace(content, "" + TextQualifier, "" + TextQualifier + TextQualifier); } - writer.write(content); + buf.put(content.getBytes()); - writer.write(TextQualifier); + buf.put(TextQualifier.getBytes()); firstColumn = false; } + public FileLock getlock() throws IOException { + return channel.lock(); + } + /** * finish a record, prepare the next one */ public void endRecord() throws IOException { - writer.write(lineSeparator); + buf.put(lineSeparator.getBytes()); firstColumn = true; } @@ -528,7 +555,13 @@ public class ResumeUtil { */ public void flush() { try { - writer.flush(); + buf.flip(); + channel.position(channel.size()); + while(buf.hasRemaining()) { + channel.write(buf); + } + channel.force(true); + buf.clear(); } catch (IOException e) { e.printStackTrace(); } @@ -539,7 +572,7 @@ public class ResumeUtil { */ public void close() { try { - writer.close(); + channel.close(); } catch (IOException e) { e.printStackTrace(); } From 132d794131c734e482bc3dd1cf9df1cd7c4afc6c Mon Sep 17 00:00:00 2001 From: Jane Ding Date: Tue, 10 Aug 2021 11:37:51 +0800 Subject: [PATCH 2/5] fix(TUP-32383):Migration executed at every logon (#4505) * Revert "fix(TUP-32383):Migration executed at every logon (#4480)" This reverts commit b06ee57323b6cfea6abfa70656963d05cd6fee46. * fix(TUP-32383):Migration executed at every logon https://jira.talendforge.org/browse/TUP-32383 --- .../model/ProxyRepositoryFactory.java | 3 ++ .../runprocess/IRunProcessService.java | 2 + .../maven/tools/AggregatorPomsHelper.java | 44 +++++++++++++++++++ .../migrationtool/MigrationToolService.java | 35 +++++---------- 4 files changed, 59 insertions(+), 25 deletions(-) diff --git a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProxyRepositoryFactory.java b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProxyRepositoryFactory.java index 01c442b635..474bb9250a 100644 --- a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProxyRepositoryFactory.java +++ b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProxyRepositoryFactory.java @@ -2283,6 +2283,9 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory { IRunProcessService runProcessService = getRunProcessService(); if (runProcessService != null) { runProcessService.initMavenJavaProject(monitor, project); + + // before afterLogon migration execute, check and update daikon dependency + runProcessService.checkAndUpdateDaikonDependencies(); } currentMonitor = subMonitor.newChild(1, SubMonitor.SUPPRESS_NONE); diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/designer/runprocess/IRunProcessService.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/designer/runprocess/IRunProcessService.java index 6d7805a1ab..31bc4c3a8d 100644 --- a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/designer/runprocess/IRunProcessService.java +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/designer/runprocess/IRunProcessService.java @@ -275,4 +275,6 @@ public interface IRunProcessService extends IService { public void deleteOldVersionTalendJobProject(IRepositoryViewObject object); + public void checkAndUpdateDaikonDependencies(); + } diff --git a/main/plugins/org.talend.designer.maven/src/main/java/org/talend/designer/maven/tools/AggregatorPomsHelper.java b/main/plugins/org.talend.designer.maven/src/main/java/org/talend/designer/maven/tools/AggregatorPomsHelper.java index d0fa61addf..ccbd540727 100644 --- a/main/plugins/org.talend.designer.maven/src/main/java/org/talend/designer/maven/tools/AggregatorPomsHelper.java +++ b/main/plugins/org.talend.designer.maven/src/main/java/org/talend/designer/maven/tools/AggregatorPomsHelper.java @@ -15,6 +15,7 @@ package org.talend.designer.maven.tools; import static org.talend.designer.maven.model.TalendJavaProjectConstants.*; import java.lang.reflect.InvocationTargetException; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -28,7 +29,9 @@ import java.util.function.Function; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.model.Activation; +import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; import org.apache.maven.model.Profile; import org.eclipse.core.resources.IContainer; @@ -1053,4 +1056,45 @@ public class AggregatorPomsHelper { return null; } + public void checkAndUpdateDaikonDependencies() { + try { + IFile rootPomFile = getProjectRootPom(); + if (rootPomFile.exists()) { + boolean isRegeneratePoms = false; + Model model = MavenPlugin.getMaven().readModel(rootPomFile.getLocation().toFile()); + if (model.getModules() != null) { + for (String module : model.getModules()) { + java.nio.file.Path modPath = Paths.get(rootPomFile.getLocation().toFile().getParent(), module, "pom.xml"); + Model modModel = MavenPlugin.getMaven().readModel(modPath.toFile()); + List deps = modModel.getDependencies(); + if (deps != null && !deps.isEmpty()) { + DefaultArtifactVersion targetVersion = new DefaultArtifactVersion("0.31.12"); + + for (Dependency dep : deps) { + DefaultArtifactVersion actualVersion = new DefaultArtifactVersion(dep.getVersion()); + int cmp = targetVersion.compareTo(actualVersion); + + if (StringUtils.equals("org.talend.daikon", dep.getGroupId()) && cmp > 0) { + if (StringUtils.equals("crypto-utils", dep.getArtifactId()) + || StringUtils.equals("daikon", dep.getArtifactId())) { + isRegeneratePoms = true; + } + } + } + } + if (isRegeneratePoms) { + break; + } + } + } + if (isRegeneratePoms) { + syncAllPomsWithoutProgress(new NullProgressMonitor()); + BuildCacheManager.getInstance().clearAllCodesCache(); + } + } + } catch (Exception e) { + ExceptionHandler.process(e); + } + } + } diff --git a/main/plugins/org.talend.migrationTool/src/org/talend/migrationtool/MigrationToolService.java b/main/plugins/org.talend.migrationTool/src/org/talend/migrationtool/MigrationToolService.java index 62f8b92b59..37345593eb 100644 --- a/main/plugins/org.talend.migrationTool/src/org/talend/migrationtool/MigrationToolService.java +++ b/main/plugins/org.talend.migrationTool/src/org/talend/migrationtool/MigrationToolService.java @@ -267,35 +267,20 @@ public class MigrationToolService implements IMigrationToolService { nbMigrationsToDo++; } - - int migrationInEveryLogon = 0; - if (beforeLogon) { - // UpdateDaikonCryptoUtilsMigrationTask to execute every logon - MigrationUtil.removeMigrationTaskById(done, - "org.talend.repository.model.migration.UpdateDaikonCryptoUtilsMigrationTask"); - migrationInEveryLogon++; - } - - if (nbMigrationsToDo == 0 && migrationInEveryLogon == 0) { + if (nbMigrationsToDo == 0) { return; } - if (nbMigrationsToDo > 0) { - // only execute when migration exist - if (beforeLogon) { - // for migration exist only, force reset to default maven template - MigrationUtil.removeMigrationTaskById(done, - "org.talend.repository.model.migration.ResetMavenTemplateMigrationTask"); - } else { - // force execute migration in case user copy-past items with diffrent path on the file system and - // refresh - // the studio,it may cause bug TDI-19229 - MigrationUtil.removeMigrationTaskById(done, "org.talend.repository.model.migration.FixProjectResourceLink"); - // force to re-generate all job poms - MigrationUtil.removeMigrationTaskById(done, "org.talend.repository.model.migration.GenerateJobPomMigrationTask"); - } - } + // force execute migration in case user copy-past items with diffrent path on the file system and refresh + // the studio,it may cause bug TDI-19229 + MigrationUtil.removeMigrationTaskById(done, "org.talend.repository.model.migration.FixProjectResourceLink"); + // force to re-generate all job poms + MigrationUtil.removeMigrationTaskById(done, "org.talend.repository.model.migration.GenerateJobPomMigrationTask"); + if (beforeLogon) { + // for every migration, force reset to default maven template + MigrationUtil.removeMigrationTaskById(done, "org.talend.repository.model.migration.ResetMavenTemplateMigrationTask"); + } boolean haveAnyBinFolder = false; // to avoid some problems of migration, sometimes for (ERepositoryObjectType type : (ERepositoryObjectType[]) ERepositoryObjectType.values()) { From 724dc1b72df9ff6e868e0ff8b8515deec2c622ff Mon Sep 17 00:00:00 2001 From: kjwang Date: Wed, 11 Aug 2021 14:33:23 +0800 Subject: [PATCH 3/5] kjwang/Fix TUP-32327 CVE maven-core-[3.2.3-3.6.3] (#4484) * kjwang/Fix TUP-32327 CVE maven-core-[3.2.3-3.6.3] https://jira.talendforge.org/browse/TUP-32327 --- .../build-helper-maven-plugin-3-0-0/pom.xml | 5 ++++ .../plugins/karaf-maven-plugin-4-2-7/pom.xml | 5 ++++ .../plugins/talend-compiler-plugin/pom.xml | 9 +++++++ .../resources/build/pom.xml | 25 +++++++++++++++++-- .../general/pom_project_template.xml | 25 +++++++++++++++++++ 5 files changed, 67 insertions(+), 2 deletions(-) diff --git a/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/build-helper-maven-plugin-3-0-0/pom.xml b/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/build-helper-maven-plugin-3-0-0/pom.xml index de6fdcf03c..785bd2ed5d 100644 --- a/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/build-helper-maven-plugin-3-0-0/pom.xml +++ b/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/build-helper-maven-plugin-3-0-0/pom.xml @@ -35,6 +35,11 @@ commons-io 2.8.0 + + org.apache.maven + maven-core + 3.8.1 + diff --git a/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/karaf-maven-plugin-4-2-7/pom.xml b/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/karaf-maven-plugin-4-2-7/pom.xml index 0380819731..6d23b45323 100644 --- a/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/karaf-maven-plugin-4-2-7/pom.xml +++ b/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/karaf-maven-plugin-4-2-7/pom.xml @@ -85,6 +85,11 @@ plexus-archiver 3.6.0 + + org.apache.maven + maven-core + 3.8.1 + diff --git a/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/talend-compiler-plugin/pom.xml b/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/talend-compiler-plugin/pom.xml index 0477074564..efce270f74 100644 --- a/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/talend-compiler-plugin/pom.xml +++ b/main/plugins/org.talend.designer.maven.tos/resources/build/plugins/talend-compiler-plugin/pom.xml @@ -10,6 +10,11 @@ talend-compiler-plugin-tos pom + + org.apache.maven + maven-core + 3.8.1 + org.eclipse.tycho tycho-compiler-jdt @@ -23,6 +28,10 @@ org.codehaus.plexus plexus-archiver + + org.apache.maven + maven-core + diff --git a/main/plugins/org.talend.designer.maven.tos/resources/build/pom.xml b/main/plugins/org.talend.designer.maven.tos/resources/build/pom.xml index 67fb4a8d49..5aaffc3189 100644 --- a/main/plugins/org.talend.designer.maven.tos/resources/build/pom.xml +++ b/main/plugins/org.talend.designer.maven.tos/resources/build/pom.xml @@ -30,6 +30,11 @@ + + org.apache.maven + maven-core + 3.8.1 + org.apache.maven.plugins maven-compiler-plugin @@ -39,6 +44,10 @@ org.apache.maven.shared maven-shared-utils + + org.apache.maven + maven-core + @@ -50,6 +59,10 @@ org.apache.maven.shared maven-shared-utils + + org.apache.maven + maven-core + @@ -61,6 +74,10 @@ org.apache.maven.shared maven-shared-utils + + org.apache.maven + maven-core + @@ -75,11 +92,15 @@ org.apache.maven.shared maven-shared-utils - + + + org.apache.maven + maven-core + org.apache.maven maven-compat - + diff --git a/main/plugins/org.talend.designer.maven/resources/templates/general/pom_project_template.xml b/main/plugins/org.talend.designer.maven/resources/templates/general/pom_project_template.xml index 81fd9a888e..4d7a3a6a44 100644 --- a/main/plugins/org.talend.designer.maven/resources/templates/general/pom_project_template.xml +++ b/main/plugins/org.talend.designer.maven/resources/templates/general/pom_project_template.xml @@ -66,6 +66,11 @@ plexus-archiver 3.6.0 + + org.apache.maven + maven-core + 3.8.1 + @@ -83,6 +88,11 @@ maven-shared-utils 3.3.3 + + org.apache.maven + maven-core + 3.8.1 + @@ -115,6 +125,11 @@ plexus-io 3.0.0 + + org.apache.maven + maven-core + 3.8.1 + @@ -152,6 +167,11 @@ plexus-archiver 3.6.0 + + org.apache.maven + maven-core + 3.8.1 + @@ -164,6 +184,11 @@ plexus-utils 3.0.24 + + org.apache.maven + maven-core + 3.8.1 + From 892065d2c485c80fd61778cf4a3fc5d6d7223208 Mon Sep 17 00:00:00 2001 From: qiongli Date: Wed, 11 Aug 2021 15:48:45 +0800 Subject: [PATCH 4/5] fix(TDQ-19637):Check if it includes 'tdqReportRun' in main/sub-job when (#4504) generate code Co-authored-by: qiongli --- .../runprocess/ProcessorUtilities.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/main/plugins/org.talend.core/src/main/java/org/talend/designer/runprocess/ProcessorUtilities.java b/main/plugins/org.talend.core/src/main/java/org/talend/designer/runprocess/ProcessorUtilities.java index b04f94c4fd..0130a0b6c2 100644 --- a/main/plugins/org.talend.core/src/main/java/org/talend/designer/runprocess/ProcessorUtilities.java +++ b/main/plugins/org.talend.core/src/main/java/org/talend/designer/runprocess/ProcessorUtilities.java @@ -198,6 +198,8 @@ public class ProcessorUtilities { private static boolean isDynamicJobAndCITest = false; private static JobInfo mainJobInfo; + + private static boolean needExportItemsForDQ = false; public static void addOpenEditor(IEditorPart editor) { openedEditors.add(editor); @@ -699,7 +701,7 @@ public class ProcessorUtilities { processor.setArguments(argumentsMap); - copyDQDroolsToSrc(selectedProcessItem); + handelDQComponents(selectedProcessItem, currentProcess); // generate the code of the father after the childrens // so the code won't have any error during the check, and it will help to check // if the generation is really needed. @@ -1243,7 +1245,7 @@ public class ProcessorUtilities { processor.setArguments(argumentsMap); - copyDQDroolsToSrc(selectedProcessItem); + handelDQComponents(selectedProcessItem, currentProcess); generateContextInfo(jobInfo, selectedContextName, statistics, trace, needContext, progressMonitor, currentProcess, currentJobName, processor, isMainJob, codeGenerationNeeded); @@ -1380,12 +1382,13 @@ public class ProcessorUtilities { } /** - * - * copy the current item's drools file from 'workspace/metadata/survivorship' to '.Java/src/resources' - * + * + * Specail operation for DQ components: + * - For tdqReportRun, set 'needExportItemsForDQ'to true so as the item folder can be exported + * - For tRuleSurvivorship, copy the current item's drools file from 'workspace/metadata/survivorship' to '.Java/src/resources' * @param processItem */ - private static void copyDQDroolsToSrc(ProcessItem processItem) { + private static void handelDQComponents(ProcessItem processItem,IProcess currentProcess) { // 1.TDQ-12474 copy the "metadata/survivorship/rulePackage" to ".Java/src/main/resources/". so that it will be // used by // maven command 'include-survivorship-rules' to export. @@ -1397,6 +1400,20 @@ public class ProcessorUtilities { return; } try { + // TDQ-19637 if it includes 'tDqReportRun',must export item folder + if (!needExportItemsForDQ) { + for (INode node : currentProcess.getGeneratingNodes()) { + String componentName = node.getComponent().getName(); + if ("tDqReportRun".equals(componentName)) { + needExportItemsForDQ = true; + break; + } + } + } + /* 1.TDQ-12474 copy the "metadata/survivorship/rulePackage" to ".Java/src/main/resources/". so that it will be + used by maven command 'include-survivorship-rules' to export. + 2.TDQ-14308 current drools file in 'src/resourcesmetadata/survivorship/' should be included to job jar. + */ ExportFileResource resouece = new ExportFileResource(); BuildExportManager.getInstance().exportDependencies(resouece, processItem); if (resouece.getAllResources().isEmpty()) { @@ -2920,4 +2937,8 @@ public class ProcessorUtilities { public static boolean isDynamicJobAndCITest() { return isDynamicJobAndCITest; } + + public static boolean isNeedExportItemsForDQ() { + return needExportItemsForDQ; + } } From baf574ea55c8d3c8783edbf200d6230a24b26c74 Mon Sep 17 00:00:00 2001 From: apoltavtsev Date: Thu, 12 Aug 2021 11:17:43 +0200 Subject: [PATCH 5/5] fix(APPINT-32979) Compile Route with child Jobs on codegen stage --- .../core/model/process/ProcessUtils.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/process/ProcessUtils.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/process/ProcessUtils.java index 22763e052c..afd1704783 100644 --- a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/process/ProcessUtils.java +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/process/ProcessUtils.java @@ -728,6 +728,46 @@ public final class ProcessUtils { } return null; } + + private static boolean isRoute(Property property) { + return property!= null && (ERepositoryObjectType.getType(property).equals(ERepositoryObjectType.PROCESS_ROUTE) || + ERepositoryObjectType.getType(property).equals(ERepositoryObjectType.PROCESS_ROUTE_MICROSERVICE)); + } + + public static boolean isRouteWithChildJobs(IProcess process) { + + if (process instanceof IProcess2) { + Property p = ((IProcess2) process).getProperty(); + if (isRoute(p)) { + return false; + } + Item item = p.getItem(); + return isRouteWithChildJobs(item); + } else { + for (INode node : process.getGraphicalNodes()) { + if (node.getComponent().getName().equals("cTalendJob")) { + return true; + } + } + } + return false; + } + + + public static boolean isRouteWithChildJobs(Item item) { + + if (item!= null && item instanceof ProcessItem) { + for (Object obj : ((ProcessItem) item).getProcess().getNode()) { + if (obj instanceof NodeType) { + if (((NodeType) obj).getComponentName().equals("cTalendJob")) { + return true; + } + } + } + } + return false; + + } public static int getAssertAmount(IProcess process) { int count = 0;