Compare commits

..

58 Commits

Author SHA1 Message Date
zshen-talend
0efb40b4d5 Zshen/bugfix/tdq 18666 back port 7.4 (#3622)
* Fix/yyin/tdq 18565 context check 73 (#3462)

* Fix TDQ-18565  Cannot save Hive metadata object with context variables

- if the analysis didnot use the current db, can pass
- if any analysis use this db, popup let the user select

* FIx TDQ-18565

* Fix TDQ-18565 backport to 73

Co-authored-by: root <root@LT-D9QV733>

* Zshen/bugfix/fix switch context issue (#3619)

Co-authored-by: yyin <yyin@talend.com>
Co-authored-by: root <root@LT-D9QV733>
2020-09-15 10:16:37 +08:00
wang wei
21f5ac7771 fix(TDI-44601): add databricks delta lake mapping file (#3511) 2020-09-15 10:08:44 +08:00
bhe-talendbj
1449055789 bugfix(TUP-28633) add junit dependencies (#3642)
* fix(TUP-27438): add junit dependencies

* fix(TUP-28633): change version of surefire-junit4
2020-09-14 21:38:58 +08:00
Emmanuel GALLOIS
d1eeeb319d fix(TCOMP-1770): bump component-runtime to 1.1.25 2020-09-14 11:11:48 +02:00
pyzhou
62bcd2d641 fix(TDI-44826): Missing line in Resume log (#3639) 2020-09-14 17:10:39 +08:00
Oleksandr Zhelezniak
dbc3b0fb17 chore(TDI-44671): bump tck components (#3634)
* bump version of TCK components [1.12.0-SNAPSHOT] -> [1.14.0-SNAPSHOT]
2020-09-11 12:53:33 +03:00
hzhao-talendbj
63587e1f14 tup - 28322 (#3595)
* tup - 28322
roll back TUP-26485
and backport what we do the same on maintenance 7.3

* modify createNewsPage

* add accessable

* change spelling mistake accessible

* add update history to avoid call two times
2020-09-11 11:15:53 +08:00
kjwang
cb9206e2de Fix: TUP-28372 Modules Tab is not updated when switching branches. (Fix (#3623) (#3632)
Fix: TUP-28372 Modules Tab is not updated when switching branches. (Fix a problem when switching branch may cause wrong save operation )
https://jira.talendforge.org/browse/TUP-28372
2020-09-11 11:14:00 +08:00
kjwang
9e7e9c274c fix(TUP-28487): fix performance issue (#3598) (#3628)
* fix(TUP-28487): fix performance issue (#3598)
Co-authored-by: nrousseau <nrousseau@talend.com>
2020-09-11 10:52:41 +08:00
jiezhang-tlnd
9c1e780550 feat(TUP-28403)update community logo (#3625) 2020-09-09 17:32:46 +08:00
Emmanuel GALLOIS
2f14d6f7af feat(TCOMP-1651): backport to master (#3621) 2020-09-09 15:35:39 +08:00
sbliu
ced9549634 feature(TUP-28334) Enhance logging of performances 2020-09-09 10:30:10 +08:00
Chao MENG
12e06dcd43 fix(TUP-28316): Left git related issues checked with support (#3567)
* fix(TUP-28316): Left git related issues checked with support
https://jira.talendforge.org/browse/TUP-28316
2020-09-08 17:08:20 +08:00
bhe-talendbj
b3c658190e fix(TUP-27438): restore org.apache.commons.codec (#3618) 2020-09-08 15:26:34 +08:00
bhe-talendbj
2a152f780c fix(TUP-28574): Add org.talend.studio.studio-utils bundle (#3615) 2020-09-08 09:47:24 +08:00
jiezhang-tlnd
e51a1be010 feat(TUP-28432)Upgrade AWS SDK's version (#3610)
https://jira.talendforge.org/browse/TUP-28432
2020-09-07 16:40:33 +08:00
bhe-talendbj
28df42e0fb fix(TUP-28546): upgrade commons-codec plugin (#3613) 2020-09-07 10:53:20 +08:00
sbliu
a196cf3209 bugfix(TUP-27924) Do sync Component M2 Jars just after patch installed, and will not deploy to nexus at this moment. (#3612)
* bugfix(TUP-27924) Do sync Component M2 Jars just after patch installed, and will not deploy to nexus.

* bugfix(TUP-27924) donnot try to deploy m2 jars after sync them.

* bugfix(TUP-27924) re-place the sync code to suitable place.
2020-09-07 09:55:31 +08:00
hcyi
490b9df3d8 fix(TUP-27518):The download modules dialog take long time to list all (#3608)
jars avialable
2020-09-04 11:26:24 +08:00
sbliu
e5c48c0472 bugfix(TUP-26633) Add back local component(tcompv0) patch installation function,and just keep TaCoKitCars patch install. (#3602) 2020-09-04 11:18:41 +08:00
Oleksandr Zhelezniak
32380af191 chore(TDI-44799): bump version of TCK components (#3605)
* bump version of TCK components from [1.11.0-SNAPSHOT] to [1.12.0-SNAPSHOT]
2020-09-03 12:26:04 +03:00
Colm O hEigeartaigh
df577338cd TUP-28307 - Replace toLowerCase().equals() with equalsIgnoreCase (#3552) 2020-09-03 10:08:18 +08:00
Colm O hEigeartaigh
a56358308e TUP-27927 - Use Pattern.quote instead of manually escaping regex values (#3476) 2020-09-03 09:53:01 +08:00
kjwang
0f28377fa4 Fix: TUP-28372 Modules Tab is not updated when switching branches. (#3588)
Fix: TUP-28372 Modules Tab is not updated when switching branches
https://jira.talendforge.org/browse/TUP-28372
2020-09-02 17:01:35 +08:00
bhe-talendbj
9050d9050a fix(TUP-27268): Add isRequiredAlways for ILoginTask (#3589) 2020-09-02 16:02:11 +08:00
vdrokov
81ea7aa0ea fix(TESB-29853): TESB-29819 Studio doesn't select model beans during exporting (#3601) 2020-09-01 19:04:03 +02:00
Chao MENG
009e9d0cd6 fix(TUP-26341): Talend Token Collector doesn't work with http/https (#3573)
proxy
https://jira.talendforge.org/browse/TUP-26341
2020-09-01 16:01:28 +08:00
bhe-talendbj
d242a0e8f7 feat(TUP-27438): Extract studio-utils (#3585)
* feat(TUP-27438): Refactor jar

* feat(TUP-27438): Extract migration classes

* feat(TUP-27438): Remove unused plugin

* feat(TUP-27438): Add reference to studio-utils

* feat(TUP-27438): import studio-utils

* Import lib

* feat(TUP-27438): Remove uitls plugin

* feat(TUP-27438): Remove uitls plugin

* feat(TUP-27438): Add studio-utils

* feat(TUP-27438): update groupId
2020-08-31 09:46:47 +08:00
jiezhang-tlnd
72390d4f27 feat(TUP-28403)Update icons for 741 studio (#3582)
* feat(TUP-28403)Update icons for 741 studio
https://jira.talendforge.org/browse/TUP-28403

* feat(TUP-28403)Update icons for 741 studio
https://jira.talendforge.org/browse/TUP-28403

* update component_missing image

* update project_wiz

* Update icons for 741 studio

* update talend-picto

* update appli
2020-08-28 10:39:14 +08:00
nrousseau
9616a5028c fix(TUP-28401): fix NPE (#3580) 2020-08-26 12:03:03 +08:00
Zhiwei Xue
bbc21acd80 fix(TUP-28324): Avoid pom resolution for studio artifacts (#3586) 2020-08-26 09:54:47 +08:00
bhe-talendbj
cfcd57c65f bugfix(TUP-28308) build error and joblet maven xml file has incorrect values and Couldn't parse data error message (#3574)
* fix(TUP-28308): Check multiple version of joblets

* fix(TUP-28308): Check multiple version of joblets

* fix(TUP-28308): Filter joblets

* fix(TUP-28308): Revert unnecessary changes
2020-08-25 10:20:11 +08:00
hcyi
cf9201c9d7 fix(TUP-28134):TCK Components shown as hidden by default in the palette (#3533)
settings
2020-08-25 09:57:41 +08:00
nkutsubos
00b496bfba babili-export (#3579)
Co-authored-by: root <root@tal-ip90.talend.com>
2020-08-25 09:31:02 +08:00
jiezhang-tlnd
ad39bcc1f1 fix(TUP-28078)metadata folder generated under .../poms/jobs when create (#3577)
new connection in remote project
https://jira.talendforge.org/browse/TUP-28078
2020-08-21 16:17:46 +08:00
hcyi
cbe87f5167 fix(TUP-27820):context group with same key causing the issue. (#3551)
* fix(TUP-27820):context group with same key causing the issue.

* fix(TUP-27820):context group with same key causing the issue.
2020-08-21 15:15:43 +08:00
jiezhang-tlnd
9bcafa150f Jzhang/feat/73/tup 27862 (#3480) (#3523)
* Jzhang/feat/73/tup 27862 (#3480)

* feat(TUP-27862)Add possibility to customize pattern for dates when
retrieve table

* feat(TUP-27862)Add possibility to customize pattern for dates when
retrieve table

* feat(TUP-27862)Add possibility to customize pattern for dates when
retrieve table

* feat(TUP-27862)Add possibility to customize pattern for dates when
retrieve table

* feat(TUP-27862)Add possibility to customize pattern for dates when
retrieve table

* add junit

* add junits

* add junits

* Jzhang/72/feat/tup 27862 re (#3543)

* feat(TUP-27862)Add possibility to customize pattern for dates when

* feat(TUP-27862)Add possibility to customize pattern for dates when
retrieve table

* feat(TUP-27862)Add possibility to customize pattern for dates when
retrieve table
2020-08-20 18:33:20 +08:00
AlixMetivier
cc400a4d22 fix(TBD-10881): fix lookup and reject flow (#3572) 2020-08-20 11:58:04 +02:00
hzhao-talendbj
1b1064ff73 TUP-27849 (#3460)
* TUP-27849

* TUP-27849
add libraryNeeded

* TUP-27849
try remove jar

* TUP-27849

* TUP-27849 remove plugin
2020-08-18 16:58:20 +08:00
sbliu
8ea829ee81 TUP-27924 m2 jars in patch will be synchronized right after patch installed, before logon phase. (#3555) 2020-08-17 18:20:20 +08:00
hzhao-talendbj
feb4bce9b4 Hengzhao/backport73/tup 25103 (#3541) (#3550)
* TUP-25103

* remove service

* TUP-25103
2020-08-17 17:02:48 +08:00
Jane Ding
2c5e127de1 fix(TUP-25566):All the recycle bin should not be build or executed (#3558) (#3559)
https://jira.talendforge.org/browse/TUP-25566
2020-08-17 16:13:55 +08:00
Jane Ding
dfb82eb5a7 fix(TUP-28180):[bug]Only latest version deleted from root pom when check (#3529) (#3556)
* fix(TUP-28180):[bug]Only latest version deleted from root pom when check
"Exclude deleted items" and delete to recycle bin

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

* fix(TUP-28205):[bug] items not removed from pom file by default if the
imported items have some in recycle bin before
https://jira.talendforge.org/browse/TUP-28205

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

* fix(TUP-28205):[bug] items not removed from pom file by default if the
imported items have some in recycle bin before
https://jira.talendforge.org/browse/TUP-28205

Signed-off-by: jding-tlnd <jding@talend.com>
2020-08-17 10:22:52 +08:00
jiezhang-tlnd
cda76045af revert fix (#3548) 2020-08-12 15:03:54 +08:00
jiezhang-tlnd
cae9f32122 fix(TUP-28078)metadata folder generated under .../poms/jobs when create (#3544)
new connection in remote project
https://jira.talendforge.org/browse/TUP-28078
2020-08-11 14:35:26 +08:00
Dmytro Grygorenko
c91dd79086 fix(TDI-44457): backport to "master" branch (#3539) 2020-08-10 15:47:36 +03:00
apoltavtsev
f59119005e TESB-29071 Bean in route gives wrong output on running in studio 2020-08-10 08:47:34 +02:00
sbliu
b6ca94c99c TUP-26633 Remove local component(tcompv0) patch installation function. (#3535) 2020-08-10 14:16:13 +08:00
Zhiwei Xue
5ed5767f6a feat(TUP-28142):Add talendDebug for CI (#3534) 2020-08-07 15:08:21 +08:00
Jürgen Kindler
616f84c03f TPSVC-15154 - allow debug logs for deletions to see which files are purged (#3532) 2020-08-06 21:11:40 +08:00
Chao MENG
4bc6c7e482 fix(TUP-27989): Git related issues checked with support (#3493)
https://jira.talendforge.org/browse/TUP-27989
2020-08-06 15:22:20 +08:00
Jane Ding
53e17d9001 feat(TUP-25566):All the recycle bin should not be build or executed (#3526)
https://jira.talendforge.org/browse/TUP-25566

Signed-off-by: jding-tlnd <jding@talend.com>
2020-08-04 11:27:57 +08:00
bhe-talendbj
c36560570b fix(TUP-28002): Search release repository before uploading jars (#3506)
* fix(TUP-28002): Search release repository before uploading jars

* fix(TUP-28002): Fix NPE

* fix(TUP-28002): Check snapshot as well
2020-08-03 16:11:51 +08:00
wang wei
7d093c2ff1 fix(TDI-44192): Update dom4j to 2.1.3 (#3524) 2020-08-03 14:19:58 +08:00
Chao MENG
ea88e43485 fix(TUP-27953): tSalesforceInput component displays in-job (#3504)
tSalesforceConnection incorrectly
https://jira.talendforge.org/browse/TUP-27953
2020-07-31 11:02:29 +08:00
Jane Ding
9c526715b1 feat(TUP-25566)All the recycle bin should not be build or executed (#3484) (#3518)
* feat(TUP-25566)All the recycle bin should not be build or executed
https://jira.talendforge.org/browse/TUP-25566

* feat(TUP-25566)All the recycle bin should not be build or executed
https://jira.talendforge.org/browse/TUP-25566

* feat(TUP-25566)All the recycle bin should not be build or executed
https://jira.talendforge.org/browse/TUP-25566
2020-07-31 10:52:22 +08:00
hzhao-talendbj
16c0283679 Hengzhao/tup 27791 (#3486)
* tup 27791

* fix wrong pom

* TUP-27791 remove plugin

* TUP-27791 remove feature
2020-07-31 10:39:24 +08:00
sbliu
41033edd3b TUP-26099 Adjust UI layout, do not show horizontal bar anymore for scrolled composite. (#3509) 2020-07-30 12:01:08 +08:00
390 changed files with 2241 additions and 14878 deletions

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.common.ui.runtime.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.commons.runtime.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.commons.ui.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.core.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.core.repository.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.core.runtime.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.core.ui.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.cwm.mip.edit.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.cwm.mip.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.designer.maven.ui.nl</artifactId>

View File

@@ -9,7 +9,9 @@ ProjectPomProjectSettingPage_ConfirmTitle=Confirm
ProjectPomProjectSettingPage_ConfirmMessage=Will apply and update for project POM with modifications immediately.
ProjectPomProjectSettingPage_FilterPomLabel=Filter to use to generate poms:
ProjectPomProjectSettingPage_FilterErrorMessage=Filter is invalid.
ProjectPomProjectSettingPage.syncAllPomsButtonText=Force full re-synchronize poms
ProjectPomProjectSettingPage.syncAllPomsButtonText=Force full re-synchronize POMs
AbstractPersistentProjectSettingPage.syncAllPoms=Do you want to update all poms? \n This operation might take long time depends on your project size.
MavenProjectSettingPage.filterExampleMessage=Filter examples:\nlabel=myJob \t\t\t\t=> Generate only the job named "myJob"\n!(label=myJob) \t\t\t\t=> Generate any job except the one named "myJob"\n(path=folder1/folder2) \t\t\t=> Generate any job in the folder "folder1/folder2"\n(path=folder1/folder2)or(label=myJob)\t=> Generate any job in the folder "folder1/folder2" or named "myJob"\n(label=myJob)and(version=0.2)\t\t=> Generate only the job named "myJob" with version 0.2\n!((label=myJob)and(version=0.1))\t\t=> Generate every jobs except the "myJob" version 0.1
MavenProjectSettingPage.refModuleText=Set reference project modules in profile
MavenProjectSettingPage.excludeDeletedItems=Exclude deleted items
MavenProjectSettingPage.syncAllPomsWarning=Click the Force full re-synchronize POMs button to apply the new settings.

View File

@@ -4,5 +4,7 @@ FolderMavenSettingPage_CreatingMavenSettingPath=Chemin :
FolderMavenSettingPage_CreatingMavenSettingErrorTitle=Erreur
ProjectPomProjectSettingPage_Titile=NOTE\: Les modules et les d\u00E9pendances seront conserv\u00E9s.
ProjectPomProjectSettingPage_ConfirmTitle=Confirmer
ProjectPomProjectSettingPage.syncAllPomsButtonText=Forcer la resynchronisation des POM
AbstractPersistentProjectSettingPage.syncAllPoms=Mettre \u00E0 jour tous les fichiers pom ? \n Cette op\u00E9ration peut prendre du temps selon la taille de votre projet.
MavenProjectSettingPage.refModuleText=Configurer les modules du projet de r\u00E9f\u00E9rence dans le profil
MavenProjectSettingPage.syncAllPomsWarning=Cliquez sur le bouton Forcer la resynchronisation des POM pour appliquer les nouveaux param\u00E8tres.

View File

@@ -13,3 +13,4 @@ ProjectPomProjectSettingPage.syncAllPomsButtonText=POM\u306E\u5168\u518D\u540C\u
AbstractPersistentProjectSettingPage.syncAllPoms=\u3059\u3079\u3066\u306EPOM\u3092\u66F4\u65B0\u3057\u307E\u3059\u304B? \\n \u3053\u306E\u64CD\u4F5C\u306F\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u30B5\u30A4\u30BA\u306B\u3088\u3063\u3066\u306F\u6642\u9593\u304C\u304B\u304B\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059\u3002
MavenProjectSettingPage.filterExampleMessage=\u30D5\u30A3\u30EB\u30BF\u30FC\u306E\u4F8B:\\nlabel=myJob \\t\\t\\t\\t=> \"myJob\"\u3068\u3044\u3046\u540D\u524D\u306E\u30B8\u30E7\u30D6\u306E\u307F\u3092\u751F\u6210\\n!(label=myJob) \\t\\t\\t\\t=> \"myJob\"\u3068\u3044\u3046\u540D\u524D\u306E\u30B8\u30E7\u30D6\u3092\u9664\u304D\u3001\u3042\u3089\u3086\u308B\u30B8\u30E7\u30D6\u3092\u751F\u6210\\n(path=folder1/folder2) \\t\\t\\t=> \u30D5\u30A9\u30EB\u30C0\u30FC\"folder1/folder2\"\u5185\u306B\u4EFB\u610F\u306E\u30B8\u30E7\u30D6\u3092\u751F\u6210\\n(path=folder1/folder2)or(label=myJob)\\t=> \u30D5\u30A9\u30EB\u30C0\u30FC\"folder1/folder2\"\u5185\u306B\u4EFB\u610F\u306E\u30B8\u30E7\u30D6\u3092\u3001\u307E\u305F\u306F\"myJob\"\u3068\u3044\u3046\u540D\u524D\u306E\u30B8\u30E7\u30D6\u3092\u751F\u6210\\n(label=myJob)and(version=0.2)\\t\\t=> \u30D0\u30FC\u30B8\u30E7\u30F30.2\u3067\"myJob\"\u3068\u3044\u3046\u540D\u524D\u306E\u30B8\u30E7\u30D6\u306E\u307F\u3092\u751F\u6210\\n!((label=myJob)and(version=0.1))\\t\\t=> \"myJob\"\u30D0\u30FC\u30B8\u30E7\u30F30.1\u3092\u9664\u304D\u3001\u3059\u3079\u3066\u306E\u30B8\u30E7\u30D6\u3092\u751F\u6210
MavenProjectSettingPage.refModuleText=\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3067\u53C2\u7167\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u8A2D\u5B9A
MavenProjectSettingPage.syncAllPomsWarning=[POM\u306E\u5168\u518D\u540C\u671F\u3092\u5F37\u5236]\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3001\u65B0\u3057\u3044\u8A2D\u5B9A\u3092\u9069\u7528\u3057\u307E\u3059\u3002

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.help.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.helpers.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.librariesmanager.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.librariesmanager.ui.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.metadata.managment.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.metadata.managment.ui.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.migrationTool.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.model.edit.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.model.migration.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.model.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.presentation.onboarding.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.rcp.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.registration.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.repository.items.importexport.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.repository.items.importexport.ui.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.repository.localprovider.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.repository.mdm.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.repository.metadata.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.repository.view.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.resources.nl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.commons.feature</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.core.feature</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.fragment.jars.common.feature</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.help.di.feature</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.help.feature</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.jdt.feature</artifactId>

View File

@@ -6,14 +6,12 @@
<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"/>
<plugin id="org.talend.libraries.jdbc.ingres" download-size="0" install-size="0" version="0.0.0"/>
<plugin id="org.talend.libraries.jdbc.mysql" download-size="0" install-size="0" version="0.0.0"/>
<plugin id="org.talend.libraries.jdbc.paraccel" download-size="0" install-size="0" version="0.0.0"/>
<plugin id="org.talend.libraries.jdbc.postgresql" download-size="0" install-size="0" version="0.0.0"/>
<plugin id="org.talend.libraries.jdbc.sqlite3" download-size="0" install-size="0" version="0.0.0"/>
<plugin id="org.talend.libraries.jdbc.teradata" download-size="0" install-size="0" version="0.0.0"/>
</feature>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.libraries.jdbc.feature</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.m2e.feature</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.model.migration.feature</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.rcp.feature</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.update.p2.feature</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.updates.feature</artifactId>

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"/>
@@ -25,5 +25,6 @@
<plugin id="org.talend.daikon" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
<plugin id="org.talend.daikon.exception" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
<plugin id="org.talend.daikon.crypto.utils" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
<plugin id="org.talend.studio.studio-utils" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
<plugin id="org.talend.utils" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
</feature>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.utils.feature</artifactId>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.common.ui.runtime</artifactId>

View File

@@ -198,7 +198,7 @@ public enum ECoreImage implements IImage {
TRIANGLE("/icons1/triangle.gif"), // triangle.gif //$NON-NLS-1$
COMPARE("/icons1/compare.gif"), //$NON-NLS-1$
EXCHNAGETAB("/icons/exchangeTab.jpg"), //$NON-NLS-1$
EXCHNAGEIMAGEMISSING("/icons/component_missing.gif"), //$NON-NLS-1$
EXCHNAGEIMAGEMISSING("/icons/component_missing.png"), //$NON-NLS-1$
STATUS_OK("/icons/ok.png"), //$NON-NLS-1$
MRGREEBAR("/icons1/mrGreeBar.gif"), //$NON-NLS-1$
MRMAP("/icons1/map.gif"), //$NON-NLS-1$

View File

@@ -125,7 +125,7 @@ public enum EImage implements IImage {
OPEN_IN_BROWSER("/icons/open.gif"), //$NON-NLS-1$
DOWNLOAD_MODULE("/icons/download.gif"), //$NON-NLS-1$
COMPONENT_MISSING("/icons/component_missing.gif"), //$NON-NLS-1$
COMPONENT_MISSING("/icons/component_missing.png"), //$NON-NLS-1$
FILTER_DEACTIVED_ICON("/icons/filter_deactivated.png"), //$NON-NLS-1$
FILTER_ACTIVED_ICON("/icons/filter_activated.png"), //$NON-NLS-1$

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.commons.runtime</artifactId>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--
Copyright (C) 2010 Talend Inc. - www.talend.com
<!--
Copyright (C) 2010 Talend Inc. - www.talend.com
-->
<modelVersion>4.0.0</modelVersion>
@@ -12,7 +12,7 @@
<parent>
<groupId>org.talend</groupId>
<artifactId>org.talend.tos</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../pom_server.xml</relativePath>
</parent>

View File

@@ -111,7 +111,8 @@ public class CommonsPlugin implements BundleActivator {
}
public static boolean isDebugMode() {
return ArrayUtils.contains(Platform.getApplicationArgs(), TalendDebugHandler.TALEND_DEBUG);
return Boolean.getBoolean("talendDebug") //$NON-NLS-1$
|| ArrayUtils.contains(Platform.getApplicationArgs(), TalendDebugHandler.TALEND_DEBUG);
}
public static boolean isJUnitTest() {

View File

@@ -1,431 +0,0 @@
// ============================================================================
//
// 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.commons.utils;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.talend.commons.i18n.internal.Messages;
/**
*
* Utility class for strings. <br/>
*
* $Id$
*
*/
public class StringUtils {
public static String repeat(String str, int repeat) {
return org.apache.commons.lang.StringUtils.repeat(str, repeat);
}
public static String join(Object[] array, String separator) {
return org.apache.commons.lang.StringUtils.join(array, separator);
}
public static String[] split(String string, char separator) {
return org.apache.commons.lang.StringUtils.split(string, separator);
}
public static String replace(String text, String repl, String with) {
return org.apache.commons.lang.StringUtils.replace(text, repl, with);
}
public static List<String> splitAsList(String string, char separator) {
String[] strings = org.apache.commons.lang.StringUtils.split(string, separator);
return Arrays.asList(strings);
}
public static String capitalize(String str) {
return org.apache.commons.lang.StringUtils.capitalize(str);
}
public static String getMysqlProtectedColumnName(String colname) {
return "`" + colname + "`"; //$NON-NLS-1$ //$NON-NLS-2$
}
public static String getPostgresqlProtectedColumnName(String colname) {
return "\\\"" + colname + "\\\""; //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Extract string between the first delimiter and the second delimiter.
*
* @param text
* @param delimiter
* @return
*/
public static String extractFirstDelimitedString(String text, String delimiter) {
String returned = ""; //$NON-NLS-1$
int start = text.indexOf(delimiter, 0);
if (start != -1) {
int end = text.indexOf(delimiter, start + 1);
if (end != -1) {
returned = text.substring(start + 1, end);
}
}
return returned;
}
public static String protectMetachar(String input) {
input = replace(input, "\\", "\\\\\\\\"); //$NON-NLS-1$ //$NON-NLS-2$
input = replace(input, "+", "\\\\+"); //$NON-NLS-1$ //$NON-NLS-2$
input = replace(input, ".", "\\\\."); //$NON-NLS-1$ //$NON-NLS-2$
input = replace(input, "[", "\\\\["); //$NON-NLS-1$ //$NON-NLS-2$
input = replace(input, "]", "\\]"); //$NON-NLS-1$ //$NON-NLS-2$
input = replace(input, "(", "\\\\("); //$NON-NLS-1$ //$NON-NLS-2$
input = replace(input, ")", "\\\\)"); //$NON-NLS-1$ //$NON-NLS-2$
input = replace(input, "^", "\\\\^"); //$NON-NLS-1$ //$NON-NLS-2$
input = replace(input, "$", "\\\\$"); //$NON-NLS-1$ //$NON-NLS-2$
return input;
}
public static String removeSpecialCharsForPackage(String input) {
input = input.replaceAll(" ", ""); //$NON-NLS-1$ //$NON-NLS-2$
input = input.replaceAll("/", "."); //$NON-NLS-1$ //$NON-NLS-2$
input = input.replaceAll("&", "and"); //$NON-NLS-1$ //$NON-NLS-2$
input = input.replaceAll("<", "lt"); //$NON-NLS-1$ //$NON-NLS-2$
input = input.replaceAll(">", "gt"); //$NON-NLS-1$ //$NON-NLS-2$
input = input.replaceAll("'", "apos"); //$NON-NLS-1$ //$NON-NLS-2$
input = input.replaceAll("\"", "quot"); //$NON-NLS-1$ //$NON-NLS-2$
input = input.replaceAll("\\(", "_"); //$NON-NLS-1$ //$NON-NLS-2$
input = input.replaceAll("\\)", "_"); //$NON-NLS-1$ //$NON-NLS-2$
return input;
}
public static String loadConvert(String inputStr, String language) {
if (inputStr == null) {
return null;
}
char[] inputChars = new char[inputStr.length()];
inputStr.getChars(0, inputStr.length(), inputChars, 0);
String loadConvert = null;
if (language.equalsIgnoreCase("perl")) { //$NON-NLS-1$
loadConvert = loadConvert(inputChars, 0, inputStr.length(), new char[inputStr.length()], 'x');
} else {
loadConvert = loadConvert(inputChars, 0, inputStr.length(), new char[inputStr.length()], 'u');
}
return loadConvert;
}
/*
* Converts encoded &#92;uxxxx to unicode chars and changes special saved chars to their original forms. it can deal
* with the unicode encode character and the octal encode character, for example: String s =
* "\\u8C2D\\u5148\\u94FE\0022\22\022"; it is very useful in GUI, such as Text.getText(), and will to keep the input
* string like: \22; it can support the perl String like this: \\x2\\x22
*/
private static String loadConvert(char[] in, int off, int len, char[] convtBuf, char preHex) {
boolean limitLengthForHex = false;
int limitLength = 0;
if (preHex == 'u') {
limitLengthForHex = true; // in java, it must be \\uxxxx
limitLength = 4;
} else if (preHex == 'x') {
limitLengthForHex = false; // in perl, it can like this \\xhh
limitLength = 2;
} else {
throw new IllegalArgumentException(Messages.getString("StringUtils.IllegalArgument0")); //$NON-NLS-1$
}
if (convtBuf.length < len) {
int newLen = len * 2;
if (newLen < 0) {
newLen = Integer.MAX_VALUE;
}
convtBuf = new char[newLen];
}
char aChar;
char[] out = convtBuf;
int outLen = 0;
int end = off + len;
while (off < end) {
aChar = in[off++];
if (aChar == '\\') {
if (off < len
&& (in[off] == preHex || in[off] == 't' || in[off] == 'r' || in[off] == 'n' || in[off] == 'f' || Character
.isDigit(in[off]))) {
aChar = in[off++];
}
if (aChar == preHex) {
// Read the xxxx
int value = 0;
for (int i = 0; i < limitLength; i++) {
if (off == len) {
if (limitLengthForHex) {
throw new IllegalArgumentException(Messages.getString("StringUtils.IllegalArgument1")); //$NON-NLS-1$
} else {
break;
}
}
if (limitLengthForHex) {
aChar = in[off++];
} else if (Character.isDigit(in[off])) {
aChar = in[off++];
} else {
break;
}
switch (aChar) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
value = (value << 4) + aChar - '0';
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
value = (value << 4) + 10 + aChar - 'a';
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
value = (value << 4) + 10 + aChar - 'A';
break;
default:
throw new IllegalArgumentException(Messages.getString("StringUtils.IllegalArgument2")); //$NON-NLS-1$
}
}
out[outLen++] = (char) value;
} else {
if (aChar == 't') {
aChar = '\t';
} else if (aChar == 'r') {
aChar = '\r';
} else if (aChar == 'n') {
aChar = '\n';
} else if (aChar == 'f') {
aChar = '\f';
} else if (Character.isDigit(aChar)) {
int value = 0;
for (int i = 0; i < 3; i++) {
switch (aChar) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
value = (value << 3) + aChar - '0';
break;
default:
throw new IllegalArgumentException(Messages.getString("StringUtils.IllegalArgument3")); //$NON-NLS-1$
}
if (off < len && Character.isDigit(in[off])) {
aChar = in[off++];
} else {
break;
}
}
aChar = (char) value;
}
out[outLen++] = aChar;
}
} else {
out[outLen++] = aChar;
}
}
return new String(out, 0, outLen);
}
/**
* The same as routines.system.StringUtils.escapeChar(...).
*
* make \n to \\n. It will process these chars: \n, \r, \t, \f, \\, \", \', \b
*
*/
public static String escapeChar(String s) {
if (s == null) {
return null;
}
int length = s.length();
StringBuffer sb = new StringBuffer(length);
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
switch (c) {
case '\n':
sb.append("\\").append('n'); //$NON-NLS-1$
break;
case '\r':
sb.append("\\").append('r'); //$NON-NLS-1$
break;
case '\t':
sb.append("\\").append('t'); //$NON-NLS-1$
break;
case '\f':
sb.append("\\").append('f'); //$NON-NLS-1$
break;
case '\b':
sb.append("\\").append('b'); //$NON-NLS-1$
break;
case '\"':
sb.append("\\").append('\"'); //$NON-NLS-1$
break;
case '\'':
sb.append("\\").append('\''); //$NON-NLS-1$
break;
default:
sb.append(c);
}
}
return sb.toString();
}
public static String subString(String str, int len) {
if (len < 0) {
return str;
}
if ("".equals(str) || str == null) {
return null;
} else if (str.length() <= len) {
return str;
} else {
return str.substring(0, len);
}
}
private static final String OPEN_BRACE = "{";
private static final String CLOSE_BRACE = "}";
/**
* Replace MessageFormat.format(..) because MessageFormat does'nt support single quote correctly This method replace
* in the text all the patterns {0}, {1}, etc.. by all values in arguments array One or more values can be null, no
* exception is thrown if a value is null.
*
* @param pattern
* @param arguments
* @return
*
*/
public static String replacePrms(String text, Object... arguments) {
for (int i = 0; i < arguments.length; i++) {
text = replace(text, OPEN_BRACE + i + CLOSE_BRACE, String.valueOf(arguments[i]));
}
return text;
}
private static final StringDigitComparator STR_DIGIT_COMPARATOR = new StringDigitComparator();
static class StringDigitComparator implements Comparator<String> {
final Pattern DIGIT_PATTERN = Pattern.compile("^(\\d+)"); //$NON-NLS-1$
@Override
public int compare(String s1, String s2) {
return compare(s1, s2, true);
}
public int compare(String s1, String s2, boolean ignoreCase) {
int n1 = s1.length(), n2 = s2.length();
for (int i1 = 0, i2 = 0; i1 < n1 && i2 < n2; i1++, i2++) {
char c1 = s1.charAt(i1);
char c2 = s2.charAt(i2);
// check the digit, all start by digit
if (Character.isDigit(c1) && Character.isDigit(c2)) {
// get the digit
String tmp1 = s1.substring(i1);
String tmp2 = s2.substring(i2);
Matcher matcher1 = DIGIT_PATTERN.matcher(tmp1);
Matcher matcher2 = DIGIT_PATTERN.matcher(tmp2);
if (matcher1.find() && matcher2.find()) {
String digit1 = matcher1.group(1);
String digit2 = matcher2.group(1);
int d1 = Integer.parseInt(digit1);
int d2 = Integer.parseInt(digit2);
if (d1 == d2) { // same digit, check the left strings
String left1 = tmp1.substring(digit1.length());
String left2 = tmp2.substring(digit2.length());
return compare(left1, left2, ignoreCase);
} else {
return d1 - d2;
}
}
}
if (c1 != c2) {
if (ignoreCase) {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
return c1 - c2;
}
}
} else {
return c1 - c2;
}
}
}
return n1 - n2;
}
};
public static int compareStringDigit(String s1, String s2, boolean ignoreCase) {
return STR_DIGIT_COMPARATOR.compare(s1, s2, ignoreCase);
}
public static int compareStringDigit(String s1, String s2) {
return STR_DIGIT_COMPARATOR.compare(s1, s2);
}
}

View File

@@ -186,8 +186,7 @@ public class UpdatesHelper {
}
private static void findUpdateBaseFile(Set<File> foundUpdateFiles, File baseFile) {
if (isPlainUpdate(baseFile)
|| isUpdateSite(baseFile) && !isComponentUpdateSite(baseFile)) {
if (isPlainUpdate(baseFile) || isUpdateSite(baseFile)) {
foundUpdateFiles.add(baseFile);
} else if (baseFile.isDirectory()) {
final File[] listFiles = baseFile.listFiles();

View File

@@ -1,43 +0,0 @@
package org.talend.commons.utils.threading.lockerbykey;
import java.util.Collection;
import java.util.concurrent.locks.ReentrantLock;
/**
*
* CustomReentrantLock class.
*
* @see java.util.concurrent.locks.ReentrantLock
*/
public class CustomReentrantLock extends ReentrantLock {
private static final long serialVersionUID = 3730576759454516775L;
public CustomReentrantLock() {
super();
}
public CustomReentrantLock(boolean fair) {
super(fair);
}
/* (non-Javadoc)
* @see java.util.concurrent.locks.ReentrantLock#getQueuedThreads()
*/
@Override
public Collection<Thread> getQueuedThreads() {
return super.getQueuedThreads();
}
/*
* (non-Javadoc)
*
* @see java.util.concurrent.locks.ReentrantLock#getOwner()
*/
@Override
public Thread getOwner() {
return super.getOwner();
}
}

View File

@@ -1,52 +0,0 @@
// ============================================================================
//
// 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.commons.utils.threading.lockerbykey;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* DOC amaumont class global comment. Detailled comment
*/
public interface ILockerByKey<KP> {
public abstract int getCleanPeriod();
public abstract void shutdownNow();
public abstract void shutdown();
public abstract LockerValue<KP> getLockerValue(KP key);
public abstract boolean unlock(KP key);
public abstract boolean tryLock(KP key, long timeout, TimeUnit unit) throws InterruptedException;
public abstract boolean tryLock(KP key, long timeout) throws InterruptedException;
public abstract boolean tryLock(KP key);
public abstract void lockInterruptibly(KP key) throws InterruptedException;
public abstract boolean isLocked(KP key);
public abstract void clean();
public abstract List<LockerValue<KP>> getSuspectLocks(long timeDetectionLimitMs);
public abstract void setDetectSuspectLocks(boolean detectSuspectLocks);
public abstract boolean isDetectSuspectLocks();
}

View File

@@ -1,617 +0,0 @@
// ============================================================================
//
// 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.commons.utils.threading.lockerbykey;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
import org.apache.log4j.Logger;
import org.talend.commons.utils.StringUtils;
/**
* This class is useful to lock some part of code from the provided key.
*
* This class has the same behaviour that <code>java.util.concurrent.locks.ReentrantLock</code> except additionally it
* expect keys to lock the parts of code.
*
* It uses internally a <code>java.util.concurrent.ConcurrentHashMap</code> to store locks from keys <code>KP</code> and
* the <code>java.util.concurrent.locks.ReentrantLock</code> as properties of a value wrapper. <br/>
*
* @see java.util.concurrent.locks.ReentrantLock
*
* @param <KP> type of the key
*/
public class LockerByKey<KP> implements ILockerByKey<KP> {
private static Logger log = Logger.getLogger(LockerByKey.class);
private ConcurrentHashMap<InternalKeyLock<KP>, LockerValue<KP>> mapKeyLockToValueLock = new ConcurrentHashMap<InternalKeyLock<KP>, LockerValue<KP>>();
private final Object lockAllOperations = new Object();
private AtomicInteger counter = new AtomicInteger();
private AtomicInteger runningOperations = new AtomicInteger();
private final static int DEFAULT_CLEAN_PERIOD = 500;
private final static boolean DEFAULT_FAIR = true;
private int cleanPeriod;
private boolean fair;
private volatile boolean blockAllOperations;
private volatile boolean shuttingDown;
private volatile boolean stopped;
private static boolean detectSuspectLocksStatic = false;
private boolean detectSuspectLocks = false;
private boolean forceShutdown;
static {
String optionKey = "detectSuspectLocks";
String detectSuspectLocksStr = System.getProperty(optionKey);
if (detectSuspectLocksStr != null && detectSuspectLocksStr.length() > 0) {
detectSuspectLocksStatic = Boolean.parseBoolean(detectSuspectLocksStr);
}
if (detectSuspectLocksStatic) {
log.info("System property \"" + optionKey + "\"=" + detectSuspectLocksStatic);
}
}
/**
* LockerByKey constructor.
*/
public LockerByKey() {
this(DEFAULT_FAIR, DEFAULT_CLEAN_PERIOD);
}
/**
*
* Constructor LockerByKey.
*
* @param fair {@code true} if this lock should use a fair ordering policy
*/
public LockerByKey(boolean fair) {
this(fair, DEFAULT_CLEAN_PERIOD);
}
/**
*
* Constructor LockerByKey.
*
* @param cleanPeriod in number of operations, it means that an automatic clean will be done for each
* <code>cleanPeriod</code> number of unlock operation.
*/
public LockerByKey(int cleanPeriod) {
this(DEFAULT_FAIR, cleanPeriod);
}
/**
*
* Constructor LockerByKey.
*
* @param fair {@code true} if this lock should use a fair ordering policy
* @param cleanPeriod in number of operations, it means that an automatic clean will be done after each
* <code>cleanPeriod</code> number of unlock operation.
*/
public LockerByKey(boolean fair, int cleanPeriod) {
super();
this.fair = fair;
if (cleanPeriod <= 0) {
throw new IllegalArgumentException("The cleanPeriod value has to be greater than 0");
}
this.cleanPeriod = cleanPeriod;
this.detectSuspectLocks = detectSuspectLocksStatic;
if (this.detectSuspectLocks) {
launchThreadDebugger();
}
}
/**
*
* Constructor LockerByKey.
*
* @param fair {@code true} if this lock should use a fair ordering policy
* @param cleanDisabled true to disable the clean completely <code>cleanPeriod</code> number of unlock operation.
*/
protected LockerByKey(boolean fair, boolean cleanDisabled) {
super();
this.fair = fair;
if (cleanDisabled) {
this.cleanPeriod = 0;
} else {
this.cleanPeriod = DEFAULT_CLEAN_PERIOD;
}
this.detectSuspectLocks = detectSuspectLocksStatic;
if (this.detectSuspectLocks) {
launchThreadDebugger();
}
}
private void launchThreadDebugger() {
new Thread(this.getClass().getSimpleName() + "-ThreadDebugger-" + this.hashCode()) {
/*
* (non-Javadoc)
*
* @see java.lang.Thread#run()
*/
@Override
public void run() {
while (!stopped && !shuttingDown) {
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
break;
}
long timeDetectionLimitMs = 30000L;
List<LockerValue<KP>> lockerValues = getSuspectLocks(timeDetectionLimitMs);
StringBuilder sb = new StringBuilder();
for (LockerValue<KP> lockerValue : lockerValues) {
long duration = System.currentTimeMillis() - lockerValue.getLockedTime();
StackTraceElement[] stackTraceOfLocker = lockerValue.getStackTraceOfLocker();
for (StackTraceElement trace : stackTraceOfLocker) {
StackTraceElement stackTraceElement = trace;
sb.append(stackTraceElement.toString());
sb.append("\n");
}
log.warn("Suspect lock done since " + duration + " ms by: " + sb.toString());
}
}
}
}.start();
}
/**
* Method "isLocked".
*
* @param key
* @return true if any thread holds this lock and false otherwise
*
* @see java.util.concurrent.locks.ReentrantLock#isLocked()
*/
@Override
public boolean isLocked(KP key) {
checkKey(key);
LockerValue<KP> locker = getLockerValue(key);
return locker != null && locker.getLock().isLocked();
}
/**
*
* Method "lockInterruptibly".
*
* @param key
* @throws InterruptedException
* @see java.util.concurrent.locks.ReentrantLock#lockInterruptibly()
*/
@Override
public void lockInterruptibly(KP key) throws InterruptedException {
checkStopped();
checkKey(key);
blockOperationIfRequired();
incrementRunningOperations();
LockerValue<KP> lockerValue = prepareInternalLock(key);
decrementRunningOperations();
lockerValue.getLock().lockInterruptibly();
traceStackForDebugging(lockerValue);
}
/**
* Method "tryLock".
*
* @param key
* @return {@code true} if the lock was free and was acquired by the current thread, or the lock was already held by
* the current thread; and {@code false} otherwise
* @throws InterruptedException
* @throws IllegalArgumentException if bean is null
* @see java.util.concurrent.locks.ReentrantLock#tryLock()
*/
@Override
public boolean tryLock(KP key) {
if (stopped || shuttingDown) {
return false;
}
checkKey(key);
blockOperationIfRequired();
incrementRunningOperations();
LockerValue<KP> lockerValue = prepareInternalLock(key);
decrementRunningOperations();
boolean locked = lockerValue.getLock().tryLock();
if (locked) {
traceStackForDebugging(lockerValue);
}
return locked;
}
/**
* Method "tryLock".
*
* @param key
* @param timeout the time to wait for the lock in milliseconds
* @return true if the lock was free and was acquired by the current thread, or the lock was already held by the
* current thread; and false if the waiting time elapsed before the lock could be acquired
* @throws InterruptedException
* @throws IllegalArgumentException if bean is null
* @see java.util.concurrent.locks.ReentrantLock#tryLock(long, java.util.concurrent.TimeUnit)
*/
@Override
public boolean tryLock(KP key, long timeout) throws InterruptedException {
return tryLock(key, timeout, TimeUnit.MILLISECONDS);
}
/**
* Method "tryLock".
*
* @param key
* @param timeout the time to wait for the lock
* @param unit the time unit of the timeout argument
* @return true if the lock was free and was acquired by the current thread, or the lock was already held by the
* current thread; and false if the waiting time elapsed before the lock could be acquired
* @throws InterruptedException
* @throws IllegalArgumentException if bean is null
*
* @see java.util.concurrent.locks.ReentrantLock#tryLock(long, java.util.concurrent.TimeUnit)
*/
@Override
public boolean tryLock(KP key, long timeout, TimeUnit unit) throws InterruptedException {
checkStopped();
checkKey(key);
blockOperationIfRequired();
incrementRunningOperations();
LockerValue<KP> lockerValue = prepareInternalLock(key);
decrementRunningOperations();
interruptIfStopping();
boolean locked = lockerValue.getLock().tryLock(timeout, unit);
if (locked) {
traceStackForDebugging(lockerValue);
}
return locked;
}
private LockerValue<KP> prepareInternalLock(KP key) {
InternalKeyLock<KP> internalKeyLock = new InternalKeyLock<KP>(key);
LockerValue<KP> lockerValue = new LockerValue<KP>(key, fair);
LockerValue<KP> previousLockerValue = null;
previousLockerValue = mapKeyLockToValueLock.putIfAbsent(internalKeyLock, lockerValue);
if (previousLockerValue != null) {
lockerValue = previousLockerValue;
}
return lockerValue;
}
private void interruptIfStopping() throws InterruptedException {
if (shuttingDown) {
throw new InterruptedException("This LockerByKey is shutting down...");
}
}
/**
* Method "unlock". Unlock the operations with the provided key.
*
* @param key
* @return true if the key has been found to release the lock; and false otherwise
* @see java.util.concurrent.locks.ReentrantLock#unlock()
*/
@Override
public boolean unlock(KP key) {
checkKey(key);
blockOperationIfRequired();
incrementRunningOperations();
LockerValue<KP> lockerValue = getLockerValue(key);
boolean returnValue = false;
if (lockerValue != null) {
lockerValue.getLock().unlock();
returnValue = true;
}
decrementRunningOperations();
cleanAccordingOperations();
return returnValue;
}
void traceStackForDebugging(LockerValue<KP> lockerValue) {
if (this.detectSuspectLocks) {
lockerValue.setStackTraceOfLocker(Thread.currentThread().getStackTrace());
lockerValue.setLockedTime(System.currentTimeMillis());
}
}
private void cleanAccordingOperations() {
synchronized (lockAllOperations) {
if (cleanPeriod > 0 && counter.incrementAndGet() % cleanPeriod == 0) {
clean();
}
}
}
/**
*
* Method "clean".
*
* Clean the map which contains the lock wrappers.
*
* Removed lock wrappers are these where lock is not locked by a thread and no one thread is waiting to obtain the
* lock.
*
* The default clean will do an automatic clean all 1000 unlock operation, you can disable or change this value from
* the constructor.
*/
@Override
public void clean() {
synchronized (lockAllOperations) {
blockAllOperations();
if (!(forceShutdown && shuttingDown)) {
waitForRunningOperationsEnded();
}
Collection<LockerValue<KP>> values = mapKeyLockToValueLock.values();
if (log.isTraceEnabled()) {
log.trace("Cleaning " + this.toString() + " : " + values.size() + " keys/values ...");
}
InternalKeyLock<KP> internalKeyLock = new InternalKeyLock<KP>();
for (LockerValue<KP> lockerValue : values) {
ReentrantLock lock = lockerValue.getLock();
LockerValueHandler handler = lockerValue.getHandler();
if (!lock.hasQueuedThreads() && !lock.isLocked() && handler == null) {
internalKeyLock.setKey(lockerValue.getKey());
mapKeyLockToValueLock.remove(internalKeyLock);
}
}
resumeAllOperations();
}
}
private void checkStopped() {
if (stopped || shuttingDown) {
throw new IllegalStateException("This locker is already stopped or is shutting down !");
}
}
/**
* Method "check". Check if the key is not null.
*
* @param key
*/
private void checkKey(KP key) {
if (key == null) {
throw new IllegalArgumentException("key can't be null"); //$NON-NLS-1$
}
}
private void waitForRunningOperationsEnded() {
while (runningOperations.get() > 0) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
break;
}
}
}
private void resumeAllOperations() {
this.blockAllOperations = false;
lockAllOperations.notifyAll();
}
private void blockAllOperations() {
this.blockAllOperations = true;
}
private void blockOperationIfRequired() {
if (blockAllOperations) {
synchronized (lockAllOperations) {
if (blockAllOperations) {
try {
lockAllOperations.wait();
} catch (InterruptedException e) {
log.warn(e.getMessage(), e);
}
}
}
}
}
private void decrementRunningOperations() {
runningOperations.decrementAndGet();
}
private void incrementRunningOperations() {
runningOperations.incrementAndGet();
}
/**
* Get locker.
*
* @param bean
* @return locker value.
*/
@Override
public LockerValue<KP> getLockerValue(KP key) {
checkKey(key);
InternalKeyLock<KP> internalKeyLock = new InternalKeyLock<KP>(key);
return mapKeyLockToValueLock.get(internalKeyLock);
}
@Override
public synchronized void shutdownNow() {
forceShutdown = true;
shutdown();
}
@Override
public synchronized void shutdown() {
shuttingDown = true;
blockAllOperations();
if (!forceShutdown) {
waitForRunningOperationsEnded();
}
Collection<LockerValue<KP>> values = mapKeyLockToValueLock.values();
for (LockerValue<KP> lockerValue : values) {
Collection<Thread> queuedThreads = lockerValue.getLock().getQueuedThreads();
for (Thread thread : queuedThreads) {
thread.interrupt();
}
}
clean();
stopped = true;
}
@Override
public String toString() {
return "LockerByKey:" + super.toString();
}
/**
* Getter for cleanFrequency.
*
* @return the cleanFrequency
*/
@Override
public int getCleanPeriod() {
return cleanPeriod;
}
/**
* Getter for detectSuspectLocks.
*
* @return the detectSuspectLocks
*/
@Override
public boolean isDetectSuspectLocks() {
return this.detectSuspectLocks;
}
/**
* Sets the detectSuspectLocks.
*
* @param detectSuspectLocks the detectSuspectLocks to set
*/
@Override
public void setDetectSuspectLocks(boolean detectSuspectLocks) {
this.detectSuspectLocks = detectSuspectLocks;
}
@Override
public List<LockerValue<KP>> getSuspectLocks(long timeDetectionLimitMs) {
if (this.detectSuspectLocks) {
Collection<LockerValue<KP>> values = mapKeyLockToValueLock.values();
List<LockerValue<KP>> stacks = new ArrayList<LockerValue<KP>>();
for (LockerValue<KP> lockerValue : values) {
long lockedTime = lockerValue.getLockedTime();
long duration = System.currentTimeMillis() - lockedTime;
if (lockedTime > 0 && duration > timeDetectionLimitMs && lockerValue.getLock().isLocked()) {
stacks.add(lockerValue);
}
}
return stacks;
} else {
throw new UnsupportedOperationException(
"You have to enable the 'detectSuspectLocks' mode by using the JVM argument -DdetectSuspectLocks=true");
}
}
/**
*
* LockerByKey class.<br/>
*
* @param <IKP> key
*/
class InternalKeyLock<IKP> {
private IKP key;
public InternalKeyLock() {
}
/**
* InternalKeyLock constructor comment.
*
* @param key2
*/
public InternalKeyLock(IKP key) {
this.key = key;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((this.key == null) ? 0 : this.key.hashCode());
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final InternalKeyLock other = (InternalKeyLock) obj;
if (this.key == null) {
if (other.key != null) {
return false;
}
} else if (!this.key.equals(other.key)) {
return false;
}
return true;
}
public void setKey(IKP key) {
this.key = key;
}
@Override
public String toString() {
return StringUtils.replacePrms(InternalKeyLock.class.getSimpleName() + ": key={0}", key); //$NON-NLS-1$
}
}
/**
* Getter for mapKeyLockToValueLock.
*
* @return the mapKeyLockToValueLock
*/
Map<InternalKeyLock<KP>, LockerValue<KP>> getMapKeyLockToValueLock() {
return new HashMap<InternalKeyLock<KP>, LockerValue<KP>>(mapKeyLockToValueLock);
}
}

View File

@@ -1,669 +0,0 @@
// ============================================================================
//
// 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.commons.utils.threading.lockerbykey;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.Callable;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import org.apache.log4j.Logger;
/**
*
* Class LockerByKeyUnrestricted.
*
* This class has the same behaviours that {@link LockerByKey} except
*
*
*/
public class LockerByKeyUnrestricted<KP> implements ILockerByKey<KP> {
private static final String NOT_ALREADY_LOCKED_MESSAGE = "Already unlocked by an other thread or never locked, ensure all the unlock() operations of this locker are called after their lock has really locked:";
private static Logger log = Logger.getLogger(LockerByKeyUnrestricted.class);
private ExecutorService threadPool;
private LockerByKey<KP> locker;
private final Object lockAllOperations = new Object();
private AtomicInteger counter = new AtomicInteger();
private AtomicInteger runningOperations = new AtomicInteger();
private final static int DEFAULT_CLEAN_PERIOD = 500;
private final static boolean DEFAULT_FAIR = true;
private volatile boolean blockAllOperations;
private volatile boolean shuttingDown;
private volatile boolean stopped;
private int cleanPeriod;
/**
* LockerByKey constructor.
*/
public LockerByKeyUnrestricted() {
this(DEFAULT_FAIR, DEFAULT_CLEAN_PERIOD);
}
/**
*
* Constructor LockerByKey.
*
* @param fair {@code true} if this lock should use a fair ordering policy
*/
public LockerByKeyUnrestricted(boolean fair) {
this(fair, DEFAULT_CLEAN_PERIOD);
}
/**
*
* Constructor LockerByKey.
*
* @param cleanPeriod in number of operations, it means that an automatic clean will be done for each
* <code>cleanPeriod</code> number of unlock operation.
*/
public LockerByKeyUnrestricted(int cleanPeriod) {
this(DEFAULT_FAIR, cleanPeriod);
}
/**
*
* Constructor LockerByKey.
*
* @param fair {@code true} if this lock should use a fair ordering policy
* @param cleanPeriod in number of operations, it means that an automatic clean will be done for each
* <code>cleanPeriod</code> number of unlock operation.
*/
public LockerByKeyUnrestricted(boolean fair, int cleanPeriod) {
super();
if (cleanPeriod <= 0) {
throw new IllegalArgumentException("The cleanPeriod value has to be greater than 0");
}
boolean cleanDisabled = true;
this.locker = new LockerByKey<KP>(fair, cleanDisabled);
this.threadPool = intializePool(LockerByKeyUnrestricted.class.getSimpleName());
this.cleanPeriod = cleanPeriod;
}
protected ExecutorService intializePool(final String poolName) {
ExecutorService threadPool = Executors.newCachedThreadPool(new ThreadFactory() {
ThreadFactory defaultThreadFactory = Executors.defaultThreadFactory();
@Override
public Thread newThread(Runnable r) {
Thread newThread = defaultThreadFactory.newThread(r);
newThread.setName(poolName + "_" + newThread.getName());
return newThread;
}
});
return threadPool;
}
/**
*
* Method "lockInterruptibly".
*
* @param key
* @throws InterruptedException
* @see java.util.concurrent.locks.ReentrantLock#lockInterruptibly()
*/
@Override
public void lockInterruptibly(final KP key) throws InterruptedException {
blockOperationIfRequired();
incrementRunningOperations();
try {
locker.lockInterruptibly(key);
} finally {
decrementRunningOperations();
}
}
/**
*
* Method "lockInterruptiblyUnrestricted".
*
* @param key
* @throws InterruptedException
* @see java.util.concurrent.locks.ReentrantLock#lockInterruptibly()
*/
public void lockInterruptiblyUnrestricted(final KP key) throws InterruptedException {
checkStopped();
blockOperationIfRequired();
LockerValue<KP> lockerValue = null;
LockerValueHandler handler = null;
if (tryLockUnrestricted(key)) {
return;
}
incrementRunningOperations();
/* Test if already locked by the same thread */
lockerValue = locker.getLockerValue(key);
if (locker != null) {
handler = lockerValue.getHandler();
if (handler != null && Thread.currentThread() == handler.getCallerThreadLocker()) {
decrementRunningOperations();
return;
}
}
try {
final Thread threadLocker = Thread.currentThread();
final CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
final AtomicBoolean hasError = new AtomicBoolean();
Callable<Boolean> callable = new Callable<Boolean>() {
/*
* (non-Javadoc)
*
* @see java.util.concurrent.Callable#call()
*/
@Override
public Boolean call() throws Exception {
try {
locker.lockInterruptibly(key);
} catch (Exception e) {
hasError.set(true);
throw e;
} finally {
// STEP 1
cyclicBarrier.await();
}
// STEP 2
cyclicBarrier.await();
boolean unlocked = locker.unlock(key);
return unlocked;
}
};
Future<Boolean> futureTask = threadPool.submit(callable);
try {
// STEP 1
cyclicBarrier.await();
} catch (BrokenBarrierException e) {
throw new RuntimeException(e);
}
if (hasError.get()) {
try {
futureTask.get();
} catch (ExecutionException e) {
Throwable cause = e.getCause();
if (cause != null && cause instanceof InterruptedException) {
throw (InterruptedException) cause;
} else {
throw new RuntimeException(e);
}
}
}
lockerValue = locker.getLockerValue(key);
lockerValue.addHandler(new LockerValueHandler(futureTask, cyclicBarrier, threadLocker));
} finally {
decrementRunningOperations();
}
}
/**
* Method "tryLock".
*
* @param key
* @return {@code true} if the lock was free and was acquired by the current thread, or the lock was already held by
* the current thread; and {@code false} otherwise
* @throws InterruptedException
* @throws IllegalArgumentException if bean is null
* @see java.util.concurrent.locks.ReentrantLock#tryLock()
*/
@Override
public boolean tryLock(final KP key) {
blockOperationIfRequired();
incrementRunningOperations();
try {
return locker.tryLock(key);
} finally {
decrementRunningOperations();
}
}
/**
* Method "tryLockUnrestricted".
*
* @param key
* @return {@code true} if the lock was free and was acquired by the current thread, or the lock was already held by
* the current thread; and {@code false} otherwise
* @throws InterruptedException
* @throws IllegalArgumentException if bean is null
* @see java.util.concurrent.locks.ReentrantLock#tryLock()
*/
public boolean tryLockUnrestricted(final KP key) {
checkStopped();
blockOperationIfRequired();
incrementRunningOperations();
boolean tryLockResultBoolean;
try {
final AtomicBoolean tryLockResult = new AtomicBoolean();
final CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
Callable<Boolean> callable = new Callable<Boolean>() {
/*
* (non-Javadoc)
*
* @see java.util.concurrent.Callable#call()
*/
@Override
public Boolean call() throws Exception {
boolean locked;
try {
locked = locker.tryLock(key);
tryLockResult.set(locked);
} finally {
// STEP 1
cyclicBarrier.await();
}
if (locked) {
// STEP 2
cyclicBarrier.await();
return locker.unlock(key);
} else {
return false;
}
}
};
Future<Boolean> futureTask = threadPool.submit(callable);
try {
// STEP 1
cyclicBarrier.await();
} catch (Exception e) {
throw new RuntimeException(e);
}
tryLockResultBoolean = tryLockResult.get();
if (tryLockResultBoolean) {
LockerValue<KP> lockerValue = locker.getLockerValue(key);
Thread callerThreadLocker = Thread.currentThread();
lockerValue.addHandler(new LockerValueHandler(futureTask, cyclicBarrier, callerThreadLocker));
}
} finally {
decrementRunningOperations();
}
return tryLockResultBoolean;
}
/**
* Method "tryLock".
*
* @param key
* @param timeout the time to wait for the lock in milliseconds
* @return true if the lock was free and was acquired by the current thread, or the lock was already held by the
* current thread; and false if the waiting time elapsed before the lock could be acquired
* @throws InterruptedException
* @throws IllegalArgumentException if bean is null
* @see java.util.concurrent.locks.ReentrantLock#tryLock(long, java.util.concurrent.TimeUnit)
*/
@Override
public boolean tryLock(final KP key, final long timeout) throws InterruptedException {
return locker.tryLock(key, timeout, TimeUnit.MILLISECONDS);
}
/**
* Method "tryLockUnrestricted".
*
* @param key
* @param timeout the time to wait for the lock in milliseconds
* @return true if the lock was free and was acquired by the current thread, or the lock was already held by the
* current thread; and false if the waiting time elapsed before the lock could be acquired
* @throws InterruptedException
* @throws IllegalArgumentException if bean is null
* @see java.util.concurrent.locks.ReentrantLock#tryLock(long, java.util.concurrent.TimeUnit)
*/
public boolean tryLockUnrestricted(final KP key, final long timeout) throws InterruptedException {
return tryLockUnrestricted(key, timeout, TimeUnit.MILLISECONDS);
}
/**
* Method "tryLock".
*
* @param key
* @param timeout the time to wait for the lock
* @param unit the time unit of the timeout argument
* @return true if the lock was free and was acquired by the current thread, or the lock was already held by the
* current thread; and false if the waiting time elapsed before the lock could be acquired
* @throws InterruptedException
* @throws IllegalArgumentException if bean is null
*
* @see java.util.concurrent.locks.ReentrantLock#tryLock(long, java.util.concurrent.TimeUnit)
*/
@Override
public boolean tryLock(final KP key, final long timeout, final TimeUnit unit) throws InterruptedException {
blockOperationIfRequired();
incrementRunningOperations();
try {
return locker.tryLock(key, timeout, unit);
} finally {
decrementRunningOperations();
}
}
/**
* Method "tryLockUnrestricted".
*
* @param key
* @param timeout the time to wait for the lock
* @param unit the time unit of the timeout argument
* @return true if the lock was free and was acquired by the current thread, or the lock was already held by the
* current thread; and false if the waiting time elapsed before the lock could be acquired
* @throws InterruptedException
* @throws IllegalArgumentException if bean is null
*
* @see java.util.concurrent.locks.ReentrantLock#tryLock(long, java.util.concurrent.TimeUnit)
*/
public boolean tryLockUnrestricted(final KP key, final long timeout, final TimeUnit unit) throws InterruptedException {
checkStopped();
blockOperationIfRequired();
incrementRunningOperations();
boolean tryLockResultBoolean = false;
try {
final AtomicBoolean tryLockResult = new AtomicBoolean();
final AtomicReference<InterruptedException> interruptedExceptionFromTryRef = new AtomicReference<InterruptedException>();
final CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
Callable<Boolean> callable = new Callable<Boolean>() {
/*
* (non-Javadoc)
*
* @see java.util.concurrent.Callable#call()
*/
@Override
public Boolean call() throws Exception {
boolean locked = false;
try {
locked = locker.tryLock(key, timeout, unit);
tryLockResult.set(locked);
} catch (InterruptedException e) {
interruptedExceptionFromTryRef.set(e);
return false;
} finally {
// STEP 1
cyclicBarrier.await();
}
if (locked) {
// STEP 2
cyclicBarrier.await();
return locker.unlock(key);
} else {
return false;
}
}
};
Future<Boolean> futureTask = threadPool.submit(callable);
try {
// STEP 1
cyclicBarrier.await();
} catch (Exception e) {
throw new RuntimeException(e);
}
InterruptedException interruptedExceptionFromTry = interruptedExceptionFromTryRef.get();
if (interruptedExceptionFromTry != null) {
throw interruptedExceptionFromTry;
}
tryLockResultBoolean = tryLockResult.get();
if (tryLockResultBoolean) {
LockerValue<KP> lockerValue = locker.getLockerValue(key);
Thread threadLocker = Thread.currentThread();
lockerValue.addHandler(new LockerValueHandler(futureTask, cyclicBarrier, threadLocker));
locker.traceStackForDebugging(lockerValue);
}
} finally {
decrementRunningOperations();
}
return tryLockResultBoolean;
}
/**
* Method "unlock". Unlock the operations with the provided key.
*
* To detect incorrect unlocking, this method may return an <code>IllegalStateException</code> when the lock has
* been already unlocked or it never been locked.
*
* @param key
* @return true if the key has been found to release the lock; and false otherwise
* @throws IllegalStateException
* @see java.util.concurrent.locks.ReentrantLock#unlock()
*/
@Override
public boolean unlock(final KP key) {
boolean returnedValue = false;
try {
checkStopped();
blockOperationIfRequired();
incrementRunningOperations();
returnedValue = locker.unlock(key);
} finally {
decrementRunningOperations();
}
cleanAccordingOperations();
return returnedValue;
}
/**
* Method "unlockUnrestricted". Unlock the operations with the provided key.
*
* To detect incorrect unlocking, this method may return an <code>IllegalStateException</code> when the lock has
* been already unlocked or it never been locked.
*
* @param key
* @return true if the key has been found to release the lock; and false otherwise
* @throws IllegalStateException
* @see java.util.concurrent.locks.ReentrantLock#unlock()
*/
public boolean unlockUnrestricted(final KP key) {
checkStopped();
blockOperationIfRequired();
Boolean resultFuture;
incrementRunningOperations();
try {
LockerValue<KP> lockerValue = locker.getLockerValue(key);
if (lockerValue == null) {
throw new IllegalStateException(NOT_ALREADY_LOCKED_MESSAGE + " key=" + key);
}
LockerValueHandler handler = lockerValue.getHandlerAndRemove();
if (handler == null) {
throw new UnsupportedOperationException(
"Either you have to use the restricted unlock() method to unlock, or you have to use '*Lock*Unrestricted()' methods to lock !");
}
CyclicBarrier barrier = handler.getBarrier();
try {
// STEP 2
barrier.await();
} catch (Exception e) {
throw new RuntimeException(e);
}
Future<Boolean> future = handler.getFuture();
if (future.isCancelled()) {
return false;
}
resultFuture = null;
try {
resultFuture = future.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
} finally {
decrementRunningOperations();
}
cleanAccordingOperations();
return resultFuture;
}
@Override
public int getCleanPeriod() {
return cleanPeriod;
}
private void checkStopped() {
if (stopped || shuttingDown) {
throw new IllegalStateException("This locker is already stopped or is shutting down !");
}
}
private void cleanAccordingOperations() {
synchronized (lockAllOperations) {
int cleanPeriod = getCleanPeriod();
if (cleanPeriod > 0 && counter.incrementAndGet() % cleanPeriod == 0) {
clean();
}
}
}
/**
*
* Method "clean".
*
* Clean the map which contains the lock wrappers.
*
* Removed lock wrappers are these where lock is not locked by a thread and no one thread is waiting to obtain the
* lock.
*
* The default clean will do an automatic clean all 1000 unlock operation, you can disable or change this value from
* the constructor.
*/
@Override
public void clean() {
synchronized (lockAllOperations) {
waitForRunningOperationsEnded();
locker.clean();
resumeAllOperations();
}
}
private void waitForRunningOperationsEnded() {
blockAllOperations();
boolean breakAtNext = false;
while (true) {
Collection<LockerValue<KP>> values = locker.getMapKeyLockToValueLock().values();
int waitingThreads = 0;
for (LockerValue<KP> lockerValue : values) {
waitingThreads += lockerValue.getLock().getQueueLength();
}
if (runningOperations.get() - waitingThreads <= 0) {
if (breakAtNext) {
break;
}
breakAtNext = true;
} else {
breakAtNext = false;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
break;
}
}
}
private void resumeAllOperations() {
this.blockAllOperations = false;
lockAllOperations.notifyAll();
}
private void blockAllOperations() {
this.blockAllOperations = true;
}
private void blockOperationIfRequired() {
if (blockAllOperations) {
synchronized (lockAllOperations) {
if (blockAllOperations) {
try {
lockAllOperations.wait();
} catch (InterruptedException e) {
log.warn(e.getMessage(), e);
}
}
}
}
}
private void decrementRunningOperations() {
runningOperations.decrementAndGet();
}
private void incrementRunningOperations() {
runningOperations.incrementAndGet();
}
@Override
public synchronized void shutdownNow() {
shuttingDown = true;
locker.shutdownNow();
threadPool.shutdownNow();
stopped = true;
}
@Override
public synchronized void shutdown() {
shuttingDown = true;
locker.shutdown();
threadPool.shutdown();
stopped = true;
}
@Override
public LockerValue<KP> getLockerValue(KP key) {
return locker.getLockerValue(key);
}
@Override
public boolean isLocked(KP key) {
return locker.isLocked(key);
}
@Override
public List<LockerValue<KP>> getSuspectLocks(long timeDetectionLimitMs) {
return locker.getSuspectLocks(timeDetectionLimitMs);
}
@Override
public void setDetectSuspectLocks(boolean detectSuspectLocks) {
locker.setDetectSuspectLocks(detectSuspectLocks);
}
@Override
public boolean isDetectSuspectLocks() {
return locker.isDetectSuspectLocks();
}
}

View File

@@ -1,142 +0,0 @@
package org.talend.commons.utils.threading.lockerbykey;
import java.util.ArrayList;
import java.util.List;
import org.talend.commons.utils.StringUtils;
/**
*
* LockerValue.<br/>
*
* @param <VKP> key
*/
public class LockerValue<VKP> {
private CustomReentrantLock lock;
private VKP key;
private List<LockerValueHandler> handlers;
private StackTraceElement[] stackTraceOfLocker;
private long lockedTime;
/**
* LockerValue constructor.
*
* @param thread
* @param contextInfo
* @param fair
*/
public LockerValue(VKP key, boolean fair) {
this.lock = new CustomReentrantLock(fair);
this.key = key;
}
public String toString() {
return StringUtils.replacePrms("LockerValue: key={0}, lock={1}", String.valueOf(key), lock.toString()); //$NON-NLS-1$
}
/**
* Getter for key.
*
* @return the key
*/
public VKP getKey() {
return key;
}
/**
* Getter for lock.
*
* @return the lock
*/
public CustomReentrantLock getLock() {
return lock;
}
/**
*
* Method "addHandler". Add handler to internal list.
*
* @param handler
*/
public synchronized void addHandler(LockerValueHandler handler) {
if (handlers == null) {
handlers = new ArrayList<LockerValueHandler>();
}
handlers.add(handler);
}
/**
*
* Method "getHandlerAndRemove".
*
* Return the next available handler then remove it from internal list, else null if not exist.
*
* @return the next available handler, else null if not exist
*/
public synchronized LockerValueHandler getHandler() {
if (handlers != null && handlers.size() > 0) {
LockerValueHandler lockerValueHandler = handlers.get(0);
return lockerValueHandler;
}
return null;
}
/**
*
* Method "getHandlerAndRemove".
*
* Return the next available handler then remove it from internal list, else null if not exist.
*
* @return the next available handler, else null if not exist
*/
public synchronized LockerValueHandler getHandlerAndRemove() {
if (handlers != null && handlers.size() > 0) {
LockerValueHandler lockerValueHandler = handlers.get(0);
handlers.remove(0);
return lockerValueHandler;
}
return null;
}
/**
* Getter for stackTraceElements.
*
* @return the stackTraceElements
*/
public StackTraceElement[] getStackTraceOfLocker() {
return stackTraceOfLocker;
}
/**
* Sets the stackTraceElements.
*
* @param stackTraceElements the stackTraceElements to set
*/
public void setStackTraceOfLocker(StackTraceElement[] stackTraceElements) {
this.stackTraceOfLocker = stackTraceElements;
}
/**
* Getter for lockedTime.
*
* @return the lockedTime
*/
public long getLockedTime() {
return lockedTime;
}
/**
* Sets the lockedTime.
*
* @param lockedTime the lockedTime to set
*/
public void setLockedTime(long lockedTime) {
this.lockedTime = lockedTime;
}
}

View File

@@ -1,64 +0,0 @@
// ============================================================================
//
// 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.commons.utils.threading.lockerbykey;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Future;
/**
* class LockerValueHandler.
*/
public class LockerValueHandler {
private Future<Boolean> future;
private CyclicBarrier barrier;
private Thread callerThreadLocker;
public LockerValueHandler(Future<Boolean> future, CyclicBarrier barrier, Thread callerThreadLocker) {
super();
this.future = future;
this.barrier = barrier;
this.callerThreadLocker = callerThreadLocker;
}
/**
* Getter for future.
*
* @return the future
*/
public Future<Boolean> getFuture() {
return future;
}
/**
* Getter for barrier.
*
* @return the barrier
*/
public CyclicBarrier getBarrier() {
return barrier;
}
/**
* Getter for callerThreadLocker.
*
* @return the callerThreadLocker
*/
public Thread getCallerThreadLocker() {
return callerThreadLocker;
}
}

View File

@@ -0,0 +1,127 @@
// ============================================================================
//
// 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.commons.utils.time;
import java.util.Enumeration;
import java.util.Properties;
import org.apache.log4j.Hierarchy;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.spi.LoggerFactory;
import org.apache.log4j.spi.RootLogger;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
public class PerformanceLogManager {
private Hierarchy hierarchy;
public PerformanceLogManager() {
Properties properties = new Properties();
properties.put("log4j.rootCategory", ", A1");
properties.put("log4j.appender.A1", RollingFileAppender.class.getName());
IPath performanceLogPath = Platform.getLogFileLocation().removeLastSegments(1).append("performance.log");
properties.put("log4j.appender.A1.File", performanceLogPath.toOSString());
properties.put("log4j.appender.A1.MaxBackupIndex", "10");// same as .log's max backup log file count
properties.put("log4j.appender.A1.MaxFileSize", "1000000");//1000*1000 byte, same as .log's max file size
properties.put("log4j.appender.A1.layout", "org.apache.log4j.PatternLayout");
properties.put("log4j.appender.A1.layout.ConversionPattern", "%d %-5p %c %x - %m%n");
this.hierarchy = new Hierarchy(new RootLogger(Level.INFO));
new PropertyConfigurator().doConfigure(properties,hierarchy);
}
/**
* Checks if this PluginLogManager is disabled for this level.
* @param level level value
* @return boolean true if it is disabled
*/
public boolean isDisabled(int level) {
return this.hierarchy.isDisabled(level);
}
/**
* Enable logging for logging requests with level l or higher.
* By default all levels are enabled.
* @param level level object
*/
public void setThreshold(Level level) {
this.hierarchy.setThreshold(level);
}
/**
* The string version of setThreshold(Level level)
* @param level level string
*/
public void setThreshold(String level) {
this.hierarchy.setThreshold(level);
}
/**
* Get the repository-wide threshold.
* @return Level
*/
public Level getThreshold() {
return this.hierarchy.getThreshold();
}
/**
* Returns a new logger instance named as the first parameter
* using the default factory. If a logger of that name already exists,
* then it will be returned. Otherwise, a new logger will be instantiated
* and then linked with its existing ancestors as well as children.
* @param name logger name
* @return Logger
*/
public Logger getLogger(String name) {
return this.hierarchy.getLogger(name);
}
/**
* The same as getLogger(String name) but using a factory instance instead of
* a default factory.
* @param name logger name
* @param factory factory instance
* @return Logger
*/
public Logger getLogger(String name, LoggerFactory factory) {
return this.hierarchy.getLogger(name,factory);
}
public Logger getRootLogger() {
return this.hierarchy.getRootLogger();
}
public Logger exists(String name) {
return this.hierarchy.exists(name);
}
public void shutdown() {
this.hierarchy.shutdown();
}
/**
* Returns all the loggers in this manager.
* @return Enumeration logger enumeration
*/
public Enumeration getCurrentLoggers() {
return this.hierarchy.getCurrentLoggers();
}
public void resetConfiguration() {
this.hierarchy.resetConfiguration();
}
}

View File

@@ -0,0 +1,106 @@
// ============================================================================
//
// 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.commons.utils.time;
import java.util.HashMap;
import org.apache.log4j.Logger;
/**
* DOC sbliu class global comment. Detailled comment
*/
public class TimeMeasurePerformance extends TimeMeasure{
static private Logger logger;
private static HashMap<String, TimeStack> timers;
private static int indent = 0;
public static void begin(String idTimer) {
init();
if (timers.containsKey(idTimer)) {
log(indent(indent) + "Warning (start): timer " + idTimer + " already exists"); //$NON-NLS-1$ //$NON-NLS-2$
} else {
indent++;
TimeStack times = new TimeStack();
timers.put(idTimer, times);
log(indent(indent) + "Start '" + idTimer + "' ..."); //$NON-NLS-1$ //$NON-NLS-2$
}
}
private static void init() {
if (timers == null) {
timers = new HashMap<String, TimeStack>();
}
if(logger == null) {
configureLogger();
}
}
private static void log (String message) {
logger.info(message);
}
public static long end(String idTimer) {
init();
if (!timers.containsKey(idTimer)) {
log(indent(indent) + "Warning (end): timer " + idTimer + " doesn't exist"); //$NON-NLS-1$ //$NON-NLS-2$
return -1;
} else {
TimeStack timeStack = timers.get(idTimer);
timers.remove(idTimer);
long elapsedTimeSinceLastRequest = timeStack.getLastStepElapsedTime();
log(indent(indent) + "End '" + idTimer + "', elapsed time since last request: " //$NON-NLS-1$ //$NON-NLS-2$
+ elapsedTimeSinceLastRequest + " ms "); //$NON-NLS-1$
long totalElapsedTime = timeStack.getTotalElapsedTime();
log(indent(indent) + "End '" + idTimer + "', total elapsed time: " + totalElapsedTime + " ms "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
indent--;
return totalElapsedTime;
}
}
public static long step(String idTimer, String stepName) {
init();
if (!timers.containsKey(idTimer)) {
log(indent(indent) + "Warning (end): timer " + idTimer + " does'nt exist"); //$NON-NLS-1$ //$NON-NLS-2$
return -1;
} else {
TimeStack timeStack = timers.get(idTimer);
timeStack.addStep();
/*
* trace the timeline of every step,problem is that the code below " Calendar ca = Calendar.getInstance();
* Date now = ca.getTime();" will cost almost 13ms~15ms
*/
long time = timeStack.getLastStepElapsedTime();
String timerStepName = idTimer + "', step name '" + stepName; //$NON-NLS-1$
log(indent(indent)
+ "-> '" + timerStepName + "', elapsed time since previous step: " + time + " ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return time;
}
}
private static void configureLogger() {
try {
PerformanceLogManager logManager = new PerformanceLogManager();
logger = logManager.getLogger(TimeMeasurePerformance.class.getName());
} catch (Exception e) {
throw new RuntimeException("Error while initializing log properties.", e);
}
}
}

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.commons.ui</artifactId>

View File

@@ -212,4 +212,8 @@ public class CommonTextCellEditorWithProposal {
return this.contentProposalAdapter;
}
public int getPreviousActivatedIndex() {
return previousActivatedIndex;
}
}

View File

@@ -97,4 +97,7 @@ public class ExtendedTextCellEditorWithProposal extends ExtendedTextCellEditor i
super.fireCancelEditor();
}
public CommonTextCellEditorWithProposal getCommonTextEditor() {
return commonTextEditor;
}
}

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.core.repository</artifactId>

View File

@@ -67,4 +67,9 @@ public class SyncLibrariesLoginTask extends AbstractLoginTask implements IRunnab
});
}
@Override
public boolean isRequiredAlways() {
return true;
}
}

View File

@@ -837,8 +837,8 @@ public abstract class AbstractEMFRepositoryFactory extends AbstractRepositoryFac
Object fullFolder = getFullFolder(project, type, relativeFolder);
serializableAllVersion = getSerializableFromFolder(project, fullFolder, id, type, false, false, true, true);
if (serializableAllVersion.isEmpty()) {
// look in all folders
serializableAllVersion = getSerializable(project, id, false, false);
// look in all folders for this item type
serializableAllVersion = getSerializableFromFolder(project, fullFolder, id, type, false, false, true, true, true);
}
int size = serializableAllVersion.size();

View File

@@ -270,6 +270,8 @@ public interface IRepositoryFactory {
public void create(Project project, Item item, IPath path, boolean... isImportItem) throws PersistenceException;
public void save(Project project, Item item, boolean isMigrationTask) throws PersistenceException;
public void save(Project project, Item item) throws PersistenceException;
public void save(Project project, Property property) throws PersistenceException;

View File

@@ -1066,6 +1066,9 @@ public class ProjectRepositoryNode extends RepositoryNode implements IProjectRep
}
if (newProject != null && newProject.getEmfProject() != null) {
List<FolderItem> folderItems = ProjectManager.getInstance().getFolders(newProject.getEmfProject());
if (folderItems != null) {
folderItems = new ArrayList<>(folderItems);
}
for (FolderItem folder : folderItems) {
String folderName = folder.getProperty().getLabel();
if (("process".equals(folderName) || "joblets".equals(folderName)) && folder.getChildren() != null

View File

@@ -15,6 +15,7 @@ package org.talend.core.repository.model;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
@@ -71,7 +72,7 @@ import org.talend.commons.ui.gmf.util.DisplayUtils;
import org.talend.commons.ui.runtime.exception.MessageBoxExceptionHandler;
import org.talend.commons.utils.data.container.RootContainer;
import org.talend.commons.utils.network.TalendProxySelector;
import org.talend.commons.utils.time.TimeMeasure;
import org.talend.commons.utils.time.TimeMeasurePerformance;
import org.talend.commons.utils.workbench.resources.ResourceUtils;
import org.talend.core.AbstractDQModelService;
import org.talend.core.GlobalServiceRegister;
@@ -84,6 +85,7 @@ import org.talend.core.context.Context;
import org.talend.core.context.RepositoryContext;
import org.talend.core.exception.TalendInternalPersistenceException;
import org.talend.core.hadoop.BigDataBasicUtil;
import org.talend.core.model.general.ILibrariesService;
import org.talend.core.model.general.ModuleNeeded;
import org.talend.core.model.general.Project;
import org.talend.core.model.metadata.MetadataTalendType;
@@ -124,6 +126,7 @@ import org.talend.core.repository.constants.Constant;
import org.talend.core.repository.constants.FileConstants;
import org.talend.core.repository.i18n.Messages;
import org.talend.core.repository.recyclebin.RecycleBinManager;
import org.talend.core.repository.utils.LoginTaskRegistryReader;
import org.talend.core.repository.utils.ProjectDataJsonProvider;
import org.talend.core.repository.utils.RepositoryPathProvider;
import org.talend.core.repository.utils.XmiResourceManager;
@@ -132,10 +135,10 @@ import org.talend.core.runtime.repository.item.ItemProductKeys;
import org.talend.core.runtime.services.IMavenUIService;
import org.talend.core.runtime.util.ItemDateParser;
import org.talend.core.service.ICoreUIService;
import org.talend.core.service.IUpdateService;
import org.talend.cwm.helper.SubItemHelper;
import org.talend.cwm.helper.TableHelper;
import org.talend.designer.runprocess.IRunProcessService;
import org.talend.login.ILoginTask;
import org.talend.repository.ProjectManager;
import org.talend.repository.ReferenceProjectProblemManager;
import org.talend.repository.ReferenceProjectProvider;
@@ -177,6 +180,8 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
private boolean isCancelled;
private static final LoginTaskRegistryReader LOGIN_TASK_REGISTRY_READER = new LoginTaskRegistryReader();
@Override
public synchronized void addPropertyChangeListener(PropertyChangeListener l) {
if (l == null) {
@@ -226,6 +231,13 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
return null;
}
private ILibrariesService getLibrariesService() {
if (GlobalServiceRegister.getDefault().isServiceRegistered(ILibrariesService.class)) {
return GlobalServiceRegister.getDefault().getService(ILibrariesService.class);
}
return null;
}
/*
* (non-Javadoc)
*
@@ -1213,6 +1225,28 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
return this.repositoryFactoryFromProvider.getLastVersion(project, ProcessUtils.getPureItemId(id), folderPath, type);
}
@Override
public IRepositoryViewObject getLastVersion(String id, ERepositoryObjectType type)
throws PersistenceException {
return getLastVersion(id , "", type);
}
@Override
public IRepositoryViewObject getLastVersion(String id, List<ERepositoryObjectType> types) throws PersistenceException {
if (types != null) {
IRepositoryViewObject object = null;
for (ERepositoryObjectType type : types) {
object = getLastVersion(id, type);
if (object != null) {
return object;
}
}
}
return null;
}
@Override
public IRepositoryViewObject getLastVersion(String id, String folderPath, ERepositoryObjectType type)
throws PersistenceException {
String objId = id;
@@ -1224,7 +1258,25 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
return this.repositoryFactoryFromProvider.getLastVersion(project, objId, folderPath, type);
}
}
return this.repositoryFactoryFromProvider.getLastVersion(projectManager.getCurrentProject(), objId , folderPath, type);
return getLastRefVersion(projectManager.getCurrentProject(), objId , folderPath, type);
}
@Override
public IRepositoryViewObject getLastRefVersion(Project project, String id, String folderPath, ERepositoryObjectType type) throws PersistenceException {
String projectLabel = ProcessUtils.getProjectLabelFromItemId(id);
IRepositoryViewObject lastVersion = getLastVersion(project, ProcessUtils.getPureItemId(id), folderPath, type);
if (lastVersion == null) {
for (Project p : projectManager.getReferencedProjects(project)) {
if (projectLabel != null && !projectLabel.equals(p.getTechnicalLabel())) {
continue;
}
lastVersion = getLastRefVersion(p, id);
if (lastVersion != null) {
break;
}
}
}
return lastVersion;
}
@Override
@@ -1442,7 +1494,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
String folderName = parentPath.append(folderLabel).toString();
boolean found = false;
for (String existedFolder : folders) {
if (folderName.toUpperCase().equals(existedFolder.toUpperCase())) {
if (folderName.equalsIgnoreCase(existedFolder)) {
found = true;
break;
}
@@ -1546,14 +1598,15 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
@Override
public void save(Project project, Item item, boolean... isMigrationTask) throws PersistenceException {
this.repositoryFactoryFromProvider.save(project, item);
if (isMigrationTask == null || isMigrationTask.length == 0 || !isMigrationTask[0]) {
this.repositoryFactoryFromProvider.save(project, item);
boolean avoidGenerateProm = false;
if (isMigrationTask != null && isMigrationTask.length == 2) {
avoidGenerateProm = isMigrationTask[1];
}
fireRepositoryPropertyChange(ERepositoryActionName.SAVE.getName(), avoidGenerateProm, item);
} else {
this.repositoryFactoryFromProvider.save(project, item, true);
}
}
@@ -2035,11 +2088,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
*/
public void logOnProject(Project project, IProgressMonitor monitor) throws LoginException, PersistenceException {
try {
TimeMeasure.display = CommonsPlugin.isDebugMode();
TimeMeasure.displaySteps = CommonsPlugin.isDebugMode();
TimeMeasure.measureActive = CommonsPlugin.isDebugMode();
TimeMeasure.begin("logOnProject"); //$NON-NLS-1$
TimeMeasurePerformance.begin("logOnProject"); //$NON-NLS-1$
try {
/**
* init/check proxy selector, in case default proxy selector is not registed yet
@@ -2083,6 +2132,10 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
this.repositoryFactoryFromProvider.beforeLogon(project);
ProjectManager.getInstance().getBeforeLogonRecords().clear();
ProjectManager.getInstance().getUpdatedRemoteHandlerRecords().clear();
ILibrariesService librariesService = getLibrariesService();
if (librariesService != null) {
librariesService.setForceReloadCustomUri();
}
ProjectDataJsonProvider.checkAndRectifyRelationShipSetting(project.getEmfProject());
@@ -2106,7 +2159,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
throw new OperationCanceledException(""); //$NON-NLS-1$
}
// monitorWrap.worked(1);
TimeMeasure.step("logOnProject", "beforeLogon"); //$NON-NLS-1$ //$NON-NLS-2$
TimeMeasurePerformance.step("logOnProject", "beforeLogon"); //$NON-NLS-1$ //$NON-NLS-2$
// Check project compatibility
checkProjectCompatibility(project);
@@ -2124,7 +2177,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
currentMonitor = subMonitor.newChild(1, SubMonitor.SUPPRESS_NONE);
currentMonitor.beginTask(Messages.getString("ProxyRepositoryFactory.synchronizeLibraries"), 1); //$NON-NLS-1$
coreService.syncLibraries(currentMonitor);
TimeMeasure.step("logOnProject", "Sync components libraries"); //$NON-NLS-1$
TimeMeasurePerformance.step("logOnProject", "Sync components libraries"); //$NON-NLS-1$
}
currentMonitor = subMonitor.newChild(1, SubMonitor.SUPPRESS_NONE);
@@ -2133,7 +2186,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
executeMigrations(project, true, currentMonitor);
ProjectManager.getInstance().getMigrationRecords().clear();
// monitorWrap.worked(1);
TimeMeasure.step("logOnProject", "executeMigrations(beforeLogonTasks)"); //$NON-NLS-1$ //$NON-NLS-2$
TimeMeasurePerformance.step("logOnProject", "executeMigrations(beforeLogonTasks)"); //$NON-NLS-1$ //$NON-NLS-2$
currentMonitor = subMonitor.newChild(1, SubMonitor.SUPPRESS_NONE);
currentMonitor.beginTask(Messages.getString("ProxyRepositoryFactory.logonInProgress"), 1); //$NON-NLS-1$
@@ -2141,7 +2194,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
this.repositoryFactoryFromProvider.logOnProject(project);
ProjectManager.getInstance().getLogonRecords().clear();
// monitorWrap.worked(1);
TimeMeasure.step("logOnProject", "logOnProject"); //$NON-NLS-1$ //$NON-NLS-2$
TimeMeasurePerformance.step("logOnProject", "logOnProject"); //$NON-NLS-1$ //$NON-NLS-2$
emptyTempFolder(project);
@@ -2157,11 +2210,6 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
fireRepositoryPropertyChange(ERepositoryActionName.PROJECT_PREFERENCES_RELOAD.getName(), null, null);
if (GlobalServiceRegister.getDefault().isServiceRegistered(IUpdateService.class)) {
IUpdateService updateService = GlobalServiceRegister.getDefault().getService(IUpdateService.class);
updateService.syncComponentM2Jars(currentMonitor);
}
IRunProcessService runProcessService = getRunProcessService();
if (runProcessService != null) {
runProcessService.initMavenJavaProject(monitor, project);
@@ -2172,7 +2220,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
ProjectManager.getInstance().getMigrationRecords().clear();
executeMigrations(project, false, currentMonitor);
ProjectManager.getInstance().getMigrationRecords().clear();
TimeMeasure.step("logOnProject", "executeMigrations(afterLogonTasks)"); //$NON-NLS-1$ //$NON-NLS-2$
TimeMeasurePerformance.step("logOnProject", "executeMigrations(afterLogonTasks)"); //$NON-NLS-1$ //$NON-NLS-2$
if (monitor != null && monitor.isCanceled()) {
throw new OperationCanceledException(""); //$NON-NLS-1$
}
@@ -2188,12 +2236,12 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
// clean workspace
currentMonitor.beginTask(Messages.getString("ProxyRepositoryFactory.cleanWorkspace"), 1); //$NON-NLS-1$
TimeMeasure.step("logOnProject", "clean Java project"); //$NON-NLS-1$ //$NON-NLS-2$
TimeMeasurePerformance.step("logOnProject", "clean Java project"); //$NON-NLS-1$ //$NON-NLS-2$
if (workspace instanceof Workspace) {
((Workspace) workspace).getFileSystemManager().getHistoryStore().clean(currentMonitor);
}
TimeMeasure.step("logOnProject", "clean workspace history"); //$NON-NLS-1$ //$NON-NLS-2$
TimeMeasurePerformance.step("logOnProject", "clean workspace history"); //$NON-NLS-1$ //$NON-NLS-2$
currentMonitor = subMonitor.newChild(1, SubMonitor.SUPPRESS_NONE);
currentMonitor.beginTask(Messages.getString("ProxyRepositoryFactory.synch.repo.items"), 1); //$NON-NLS-1$
@@ -2219,12 +2267,12 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
if (monitor != null && monitor.isCanceled()) {
throw new OperationCanceledException(""); //$NON-NLS-1$
}
TimeMeasure.step("logOnProject", "sync repository (routines/rules/beans)"); //$NON-NLS-1$ //$NON-NLS-2$
TimeMeasurePerformance.step("logOnProject", "sync repository (routines/rules/beans)"); //$NON-NLS-1$ //$NON-NLS-2$
// log4j prefs
if (coreUiService != null && coreService != null) {
coreService.syncLog4jSettings(null);
TimeMeasure.step("logOnProject", "sync log4j"); //$NON-NLS-1$ //$NON-NLS-2$
TimeMeasurePerformance.step("logOnProject", "sync log4j"); //$NON-NLS-1$ //$NON-NLS-2$
}
try {
@@ -2241,7 +2289,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
if (runProcessService != null && !isCommandLineLocalRefProject) {
runProcessService.initializeRootPoms(monitor);
TimeMeasure.step("logOnProject", "install / setup root poms"); //$NON-NLS-1$ //$NON-NLS-2$
TimeMeasurePerformance.step("logOnProject", "install / setup root poms"); //$NON-NLS-1$ //$NON-NLS-2$
}
if (GlobalServiceRegister.getDefault().isServiceRegistered(ITDQRepositoryService.class)) {
ITDQRepositoryService tdqRepositoryService = GlobalServiceRegister.getDefault()
@@ -2258,10 +2306,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
fullLogonFinished = true;
this.repositoryFactoryFromProvider.afterLogon(monitor);
} finally {
TimeMeasure.end("logOnProject"); //$NON-NLS-1$
TimeMeasure.display = false;
TimeMeasure.displaySteps = false;
TimeMeasure.measureActive = false;
TimeMeasurePerformance.end("logOnProject"); //$NON-NLS-1$
}
String str[] = new String[] { getRepositoryContext().getUser() + "", projectManager.getCurrentProject() + "" }; //$NON-NLS-1$ //$NON-NLS-2$
log.info(Messages.getString("ProxyRepositoryFactory.log.loggedOn", str)); //$NON-NLS-1$
@@ -2662,4 +2707,13 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
public RepositoryWorkUnit getWorkUnitInProgress() {
return repositoryFactoryFromProvider.getWorkUnitInProgress();
}
public void executeRequiredLoginTasks(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
ILoginTask[] allLoginTasks = LOGIN_TASK_REGISTRY_READER.getAllTaskListInstance();
for (ILoginTask task : allLoginTasks) {
if (task.isRequiredAlways()) {
task.run(monitor);
}
}
}
}

View File

@@ -14,6 +14,7 @@ package org.talend.core.repository.recyclebin;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
@@ -26,6 +27,7 @@ import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.PredicateUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.common.util.EList;
@@ -281,7 +283,40 @@ public class RecycleBinManager {
resource = createRecycleBinResource(project);
}
resource.getContents().clear();
recycleBin.setLastUpdate(new Date());
EList<String> deletedFolders = recycleBin.getDeletedFolders();
if (deletedFolders != null) {
List<String> folders = new LinkedList<>(deletedFolders);
Collections.sort(folders);
deletedFolders.clear();
deletedFolders.addAll(folders);
}
EList<TalendItem> deletedItems = recycleBin.getDeletedItems();
if (deletedItems != null) {
List<TalendItem> items = new LinkedList<>(deletedItems);
items.sort((l, r) -> {
if (l == null && r == null) {
return 0;
} else if (l == null) {
return -1;
} else if (r == null) {
return 1;
}
int result = StringUtils.compare(l.getType(), r.getType());
if (result != 0) {
return result;
}
result = StringUtils.compare(l.getPath(), r.getPath());
if (result != 0) {
return result;
}
return StringUtils.compare(l.getId(), r.getId());
});
deletedItems.clear();
deletedItems.addAll(items);
}
// set date to null to avoid timezone conflict
recycleBin.setLastUpdate(null);
resource.getContents().add(recycleBin);
EmfHelper.saveResource(resource);
lastSavedRecycleBinMap.put(recycleBin, EcoreUtil.copy(recycleBin));

View File

@@ -26,6 +26,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Priority;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
@@ -37,6 +38,7 @@ import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
@@ -69,6 +71,7 @@ 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.repository.constants.FileConstants;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.repository.utils.ResourceFilenameHelper.FileName;
import org.talend.core.ui.ITestContainerProviderService;
import org.talend.designer.core.model.utils.emf.talendfile.ProcessType;
@@ -647,6 +650,23 @@ public class XmiResourceManager {
}
public void saveResource(Resource resource) throws PersistenceException {
try {
if (resource != null) {
Object objectByType = EcoreUtil.getObjectByType(resource.getContents(), PropertiesPackage.eINSTANCE.getProject());
if (objectByType != null) {
Project project = (Project) objectByType;
EList migrationTasks = project.getMigrationTask();
if (migrationTasks != null && 1 < migrationTasks.size()) {
org.talend.commons.exception.ExceptionHandler.process(new Exception("Bad saving logic for Project"),
Priority.WARN);
ProxyRepositoryFactory.getInstance().saveProject(new org.talend.core.model.general.Project(project));
return;
}
}
}
} catch (Throwable e) {
org.talend.commons.exception.ExceptionHandler.process(e);
}
EmfHelper.saveResource(resource);
}

View File

@@ -0,0 +1,128 @@
<?xml version="1.0"?>
<mapping>
<dbms product="DATABRICKS_DELTA_LAKE" id="databricks_delta_lake_id" label="Mapping Databricks Delta Lake" default="true">
<dbTypes>
<dbType type="SMALLINT" ignoreLen="true" ignorePre="true"/>
<dbType type="FLOAT" ignoreLen="true" ignorePre="true"/>
<dbType type="DOUBLE" ignoreLen="true" ignorePre="true"/>
<dbType type="BIGINT" ignoreLen="true" ignorePre="true"/>
<dbType type="INT" ignoreLen="true" ignorePre="true"/>
<dbType type="TINYINT" ignoreLen="true" ignorePre="true"/>
<dbType type="STRING" ignoreLen="true" ignorePre="true"/>
<dbType type="DECIMAL" ignoreLen="false" ignorePre="false"/>
<dbType type="BOOLEAN" ignoreLen="true" ignorePre="true"/>
<dbType type="STRUCT" ignoreLen="true" ignorePre="true"/>
<dbType type="MAP" ignoreLen="true" ignorePre="true"/>
<dbType type="ARRAY" ignoreLen="true" ignorePre="true"/>
<dbType type="TIMESTAMP" ignoreLen="true" ignorePre="true"/>
<dbType type="DATE" ignoreLen="true" ignorePre="true"/>
</dbTypes>
<language name="java">
<talendToDbTypes><!-- Adviced mappings -->
<talendType type="id_List"/>
<talendType type="id_Boolean">
<dbType type="BOOLEAN" default="true"/>
</talendType>
<talendType type="id_Byte">
<dbType type="TINYINT" default="true"/>
<dbType type="BIGINT"/>
<dbType type="INT"/>
<dbType type="SMALLINT"/>
</talendType>
<talendType type="id_byte[]"/>
<talendType type="id_Character">
<dbType type="STRING" default="true"/>
</talendType>
<talendType type="id_Date">
<dbType type="TIMESTAMP" default="true"/>
<dbType type="DATE"/>
</talendType>
<talendType type="id_BigDecimal">
<dbType type="DECIMAL" default="true"/>
<dbType type="BIGINT"/>
<dbType type="FLOAT"/>
<dbType type="DOUBLE"/>
</talendType>
<talendType type="id_Double">
<dbType type="DOUBLE" default="true" />
<dbType type="FLOAT"/>
</talendType>
<talendType type="id_Float">
<dbType type="FLOAT" default="true" />
<dbType type="DOUBLE"/>
</talendType>
<talendType type="id_Integer">
<dbType type="INT" default="true" />
<dbType type="BIGINT" />
</talendType>
<talendType type="id_Long">
<dbType type="BIGINT" default="true" />
</talendType>
<talendType type="id_Object">
<dbType type="STRUCT" default="true" />
<dbType type="MAP" />
<dbType type="ARRAY" />
</talendType>
<talendType type="id_Short">
<dbType type="SMALLINT" default="true" />
<dbType type="INT" />
</talendType>
<talendType type="id_String">
<dbType type="STRING" default="true"/>
</talendType>
</talendToDbTypes>
<dbToTalendTypes><!-- Adviced mappings -->
<dbType type="STRING">
<talendType type="id_String" default="true"/>
</dbType>
<dbType type="BOOLEAN">
<talendType type="id_Boolean" default="true"/>
</dbType>
<dbType type="DOUBLE">
<talendType type="id_Double" default="true"/>
<talendType type="id_BigDecimal"/>
<talendType type="id_Float"/>
</dbType>
<dbType type="DECIMAL">
<talendType type="id_BigDecimal" default="true"/>
</dbType>
<dbType type="BIGINT">
<talendType type="id_Long" default="true"/>
<talendType type="id_Integer"/>
</dbType>
<dbType type="INT">
<talendType type="id_Integer" default="true"/>
<talendType type="id_Short"/>
</dbType>
<dbType type="SMALLINT">
<talendType type="id_Short" default="true"/>
<talendType type="id_Byte"/>
</dbType>
<dbType type="TINYINT">
<talendType type="id_Byte" default="true"/>
</dbType>
<dbType type="FLOAT">
<talendType type="id_Float" default="true"/>
<talendType type="id_Double"/>
<talendType type="id_BigDecimal"/>
</dbType>
<dbType type="STRUCT">
<talendType type="id_Object" default="true"/>
</dbType>
<dbType type="MAP">
<talendType type="id_Object" default="true"/>
</dbType>
<dbType type="ARRAY">
<talendType type="id_Object" default="true"/>
</dbType>
<dbType type="TIMESTAMP">
<talendType type="id_Date" default="true"/>
</dbType>
<dbType type="DATE">
<talendType type="id_Date" default="true"/>
</dbType>
</dbToTalendTypes>
</language>
</dbms>
</mapping>

View File

@@ -40,7 +40,7 @@
<dbType type="SET" ignoreLen="true" ignorePre="true" />
<dbType type="TEXT" ignoreLen="true" ignorePre="true" />
<dbType type="TIME" ignoreLen="true" ignorePre="true" />
<dbType type="TIMESTAMP" ignoreLen="true" ignorePre="true" />
<dbType type="TIMESTAMP" ignoreLen="true" ignorePre="false" />
<dbType type="TINYBLOB" ignoreLen="true" ignorePre="true" />
<dbType type="TINYINT" ignorePre="true" />
<dbType type="TINYINT UNSIGNED" ignoreLen="true" ignorePre="true" />

View File

@@ -9,7 +9,7 @@
<dbType type="CHAR" defaultLength="50" ignorePre="true"/>
<dbType type="CHARACTER" ignoreLen="true" ignorePre="true" />
<dbType type="CHARACTER VARYING" ignoreLen="true" ignorePre="true" />
<dbType type="DATE" ignoreLen="true" ignorePre="true" />
<dbType type="DATE" ignoreLen="true" ignorePre="true" defaultPattern="dd-MM-yyyy" />
<dbType type="DATETIME" ignoreLen="true" ignorePre="true" />
<dbType type="DECIMAL" defaultLength="20" defaultPrecision="10" />
<dbType type="DOUBLE PRECISION" ignoreLen="true" ignorePre="true" />

View File

@@ -100,6 +100,11 @@
<xs:restriction base="xs:short"/>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="defaultPattern">
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="default" type="xs:boolean"/>
</xs:complexType>
</xs:element>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-M0</version>
<version>7.4.1-SNAPSHOT</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.core.runtime</artifactId>

View File

@@ -214,5 +214,5 @@ public interface ITDQRepositoryService extends IService {
/**
* @param chooseContext the context name which want to swtich
*/
void popupSwitchContextFailedMessage(String chooseContext);
boolean popupSwitchContextFailedMessage(String chooseContext);
}

View File

@@ -230,10 +230,10 @@ public enum EDatabaseTypeName {
return getTypeFromDispalyNameOriginal(dbType);
}
for (EDatabaseTypeName typename : EDatabaseTypeName.values()) {
if (typename.getXmlName().toUpperCase().equals(dbType.toUpperCase())) {
if (typename.getXmlName().equalsIgnoreCase(dbType)) {
return typename;
}
if (typename.getProduct().toUpperCase().equals(dbType.toUpperCase())) {
if (typename.getProduct().equalsIgnoreCase(dbType)) {
return typename;
}
}
@@ -245,10 +245,10 @@ public enum EDatabaseTypeName {
return getTypeFromDisplayNameOriginal(dbType, isDefault);
}
for (EDatabaseTypeName typename : EDatabaseTypeName.values()) {
if (typename.getXmlName().toUpperCase().equals(dbType.toUpperCase())) {
if (typename.getXmlName().equalsIgnoreCase(dbType)) {
return typename;
}
if (typename.getProduct().toUpperCase().equals(dbType.toUpperCase())) {
if (typename.getProduct().equalsIgnoreCase(dbType)) {
return typename;
}
}
@@ -264,7 +264,7 @@ public enum EDatabaseTypeName {
return MYSQL;
}
for (EDatabaseTypeName typename : EDatabaseTypeName.values()) {
if (typename.getDisplayName().toLowerCase().equals(displayName.toLowerCase())) {
if (typename.getDisplayName().equalsIgnoreCase(displayName)) {
return typename;
}
}
@@ -282,7 +282,7 @@ public enum EDatabaseTypeName {
return null;
}
for (EDatabaseTypeName typename : EDatabaseTypeName.values()) {
if (typename.getDisplayName().toLowerCase().equals(displayName.toLowerCase())) {
if (typename.getDisplayName().equalsIgnoreCase(displayName)) {
return typename;
}
}

View File

@@ -107,7 +107,7 @@ public enum EDatabaseVersion4Drivers {
PLUSPSQL_PRIOR_TO_V9(new DbVersion4Drivers(EDatabaseTypeName.PLUSPSQL,
"Prior to v9", "PRIOR_TO_V9", "postgresql-8.4-703.jdbc4.jar")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
PLUSPSQL_V9_X(new DbVersion4Drivers(EDatabaseTypeName.PLUSPSQL, "v9 and later", "V9_X", "postgresql-9.4-1201.jdbc41.jar")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
PLUSPSQL_V9_X(new DbVersion4Drivers(EDatabaseTypeName.PLUSPSQL, "v9 and later", "V9_X", "postgresql-42.2.14.jar")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
IBMDB2(new DbVersion4Drivers(EDatabaseTypeName.IBMDB2, new String[] { "db2jcc4.jar", "db2jcc_license_cu.jar", //$NON-NLS-1$ //$NON-NLS-2$
"db2jcc_license_cisuz.jar" })), //$NON-NLS-1$
IBMDB2ZOS(new DbVersion4Drivers(EDatabaseTypeName.IBMDB2ZOS, new String[] { "db2jcc4.jar", "db2jcc_license_cu.jar", //$NON-NLS-1$ //$NON-NLS-2$
@@ -166,7 +166,7 @@ public enum EDatabaseVersion4Drivers {
REDSHIFT(new DbVersion4Drivers(EDatabaseTypeName.REDSHIFT, "redshift", "REDSHIFT", //$NON-NLS-1$ //$NON-NLS-2$
"redshift-jdbc42-no-awssdk-1.2.37.1061.jar")), //$NON-NLS-1$
REDSHIFT_SSO(new DbVersion4Drivers(EDatabaseTypeName.REDSHIFT_SSO, "redshift sso", "REDSHIFT_SSO", //$NON-NLS-1$ //$NON-NLS-2$
new String[] { "redshift-jdbc42-no-awssdk-1.2.37.1061.jar", "aws-java-sdk-1.11.729.jar", "jackson-core-2.10.1.jar", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
new String[] { "redshift-jdbc42-no-awssdk-1.2.37.1061.jar", "aws-java-sdk-1.11.848.jar", "jackson-core-2.10.1.jar", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
"jackson-databind-2.10.1.jar", "jackson-annotations-2.10.1.jar", "httpcore-4.4.11.jar", "httpclient-4.5.9.jar", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$//$NON-NLS-4$
"joda-time-2.8.1.jar", "commons-logging-1.2.jar", "commons-codec-1.11.jar" })), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

View File

@@ -12,6 +12,7 @@
// ============================================================================
package org.talend.core.model.context;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -47,12 +48,14 @@ import org.talend.core.model.properties.ContextItem;
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.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.cwm.helper.ResourceHelper;
import org.talend.designer.core.model.utils.emf.talendfile.ContextParameterType;
import org.talend.designer.core.model.utils.emf.talendfile.ContextType;
import org.talend.designer.core.model.utils.emf.talendfile.ProcessType;
import org.talend.migration.IMigrationTask.ExecutionResult;
import org.talend.repository.model.IProxyRepositoryFactory;
/**
@@ -68,6 +71,7 @@ public class ContextUtils {
"instanceof", "return", "transient", "catch", "extends", "int", "short", "try", "char", "final", "interface", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$
"static", "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", "native", "super", "while")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$
/**
*
* ggu Comment method "isJavaKeyWords".
@@ -166,10 +170,10 @@ public class ContextUtils {
ContextType defaultContextType = null;
for (ContextType type : contextTypeList) {
// Modified by Marvin Wang on Jun. 21, 2012 for bug TDI-21009. To avoid case sensitive.
if (contextName != null && type.getName() != null && type.getName().toLowerCase().equals(contextName.toLowerCase())) {
if (contextName != null && type.getName() != null && type.getName().equalsIgnoreCase(contextName)) {
contextType = type;
} else if (defaultContextName != null && type.getName() != null
&& type.getName().toLowerCase().equals(defaultContextName.toLowerCase())) {
&& type.getName().equalsIgnoreCase(defaultContextName)) {
defaultContextType = type;
}
}
@@ -222,7 +226,6 @@ public class ContextUtils {
return parameterType;
}
@SuppressWarnings("unchecked")
private static boolean checkObject(Object obj) {
if (obj == null) {
return true;
@@ -269,7 +272,7 @@ public class ContextUtils {
IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
try {
final IRepositoryViewObject lastVersion = factory.getLastVersion(contextId);
final IRepositoryViewObject lastVersion = factory.getLastVersion(contextId, ERepositoryObjectType.CONTEXT);
if (lastVersion != null) {
final Item item = lastVersion.getProperty().getItem();
if (item != null && item instanceof ContextItem) {
@@ -486,9 +489,13 @@ public class ContextUtils {
return null;
}
IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
List<ERepositoryObjectType> possibleTypes = new ArrayList<ERepositoryObjectType>();
possibleTypes.add(ERepositoryObjectType.CONTEXT);
possibleTypes.addAll(ERepositoryObjectType.getAllTypesOfJoblet());
possibleTypes.addAll(ERepositoryObjectType.getAllTypesOfProcess());
try {
final IRepositoryViewObject lastVersion = factory.getLastVersion(contextId);
IRepositoryViewObject lastVersion = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory()
.getLastVersion(contextId, possibleTypes);
if (lastVersion != null) {
final Item item = lastVersion.getProperty().getItem();
if (item != null) {
@@ -582,7 +589,8 @@ public class ContextUtils {
return false;
}
// preference name must match TalendDesignerPrefConstants.PROPAGATE_CONTEXT_VARIABLE
// preference name must match
// TalendDesignerPrefConstants.PROPAGATE_CONTEXT_VARIABLE
return Boolean.parseBoolean(
CoreRuntimePlugin.getInstance().getDesignerCoreService().getPreferenceStore("propagateContextVariable")); //$NON-NLS-1$
}
@@ -1037,4 +1045,70 @@ public class ContextUtils {
}
return false;
}
public static ExecutionResult doCreateContextLinkMigration(Item item) {
IProxyRepositoryFactory proxyRepositoryFactory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
boolean modified = false, hasLinkFile = false;
try {
List<ContextType> contextTypeList = ContextUtils.getAllContextType(item);
if (contextTypeList != null && contextTypeList.size() > 0) {
for (ContextType contextType : contextTypeList) {
for (Object obj : contextType.getContextParameter()) {
if (obj instanceof ContextParameterType) {
ContextParameterType paramType = (ContextParameterType) obj;
if (ContextUtils.isBuildInParameter(paramType)) {
if (StringUtils.isEmpty(paramType.getInternalId())) {
paramType.setInternalId(proxyRepositoryFactory.getNextId());
modified = true;
}
}
}
}
}
}
hasLinkFile = ContextLinkService.getInstance().saveContextLink(item);
} catch (Exception ex) {
ExceptionHandler.process(ex);
return ExecutionResult.FAILURE;
}
if (modified || hasLinkFile) {
try {
if (modified) {
proxyRepositoryFactory.save(item, true);
}
return ExecutionResult.SUCCESS_NO_ALERT;
} catch (Exception ex) {
ExceptionHandler.process(ex);
return ExecutionResult.FAILURE;
}
}
return ExecutionResult.NOTHING_TO_DO;
}
public static ExecutionResult doCreateContextLinkMigration(ERepositoryObjectType repositoryType, Item item) {
if (item != null && getAllSupportContextLinkTypes().contains(repositoryType)) {
return doCreateContextLinkMigration(item);
}
return ExecutionResult.NOTHING_TO_DO;
}
public static List<ERepositoryObjectType> getAllSupportContextLinkTypes() {
List<ERepositoryObjectType> toReturn = new ArrayList<ERepositoryObjectType>();
toReturn.addAll(ERepositoryObjectType.getAllTypesOfProcess());
toReturn.addAll(ERepositoryObjectType.getAllTypesOfProcess2());
toReturn.addAll(ERepositoryObjectType.getAllTypesOfTestContainer());
toReturn.addAll(getAllMetaDataType());
return toReturn;
}
private static List<ERepositoryObjectType> getAllMetaDataType() {
List<ERepositoryObjectType> list = new ArrayList<ERepositoryObjectType>();
ERepositoryObjectType[] allTypes = (ERepositoryObjectType[]) ERepositoryObjectType.values();
for (ERepositoryObjectType object : allTypes) {
if (object.isChildTypeOf(ERepositoryObjectType.METADATA)) {
list.add(object);
}
}
return list;
}
}

View File

@@ -224,13 +224,13 @@ public class JobContextManager implements IContextManager {
if (oldContextName != null) {
if (!oldContextName.equals(contextParameter.getName())) {
if (contextParameter.getName().equals(newContextName)
|| contextParameter.getName().toLowerCase().equals(newContextName.toLowerCase())) {
|| contextParameter.getName().equalsIgnoreCase(newContextName)) {
return false;
}
}
} else {
if (contextParameter.getName().equals(newContextName)
|| contextParameter.getName().toLowerCase().equals(newContextName.toLowerCase())) {
|| contextParameter.getName().equalsIgnoreCase(newContextName)) {
return false;
}
}

View File

@@ -18,15 +18,18 @@ import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.emf.common.util.EList;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.model.context.ContextUtils;
import org.talend.core.model.properties.ContextItem;
import org.talend.core.model.properties.Item;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.cwm.helper.ResourceHelper;
import org.talend.designer.core.model.utils.emf.talendfile.ContextParameterType;
import org.talend.designer.core.model.utils.emf.talendfile.ContextType;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.IRepositoryService;
@@ -106,16 +109,26 @@ public abstract class AbstractItemContextLinkService implements IItemContextLink
}
Item contextItem = tempCache.get(repositoryContextId);
IRepositoryService repositoryService = GlobalServiceRegister.getDefault().getService(IRepositoryService.class);
if (contextItem == null) {
contextItem = ContextUtils.getRepositoryContextItemById(repositoryContextId);
tempCache.put(repositoryContextId, contextItem);
if (contextItem != null && !(contextItem instanceof ContextItem)
&& ProjectManager.getInstance().isInCurrentMainProject(contextItem)
&& checkRepoItemContextParamInternalId(contextItem)) {
try {
repositoryService.getProxyRepositoryFactory().save(contextItem, true); // This should only using for migration phase // case the internal id is null
} catch (Exception ex) {
ExceptionHandler.process(ex);
}
}
}
if (contextItem != null) {
ContextType contextType = ContextUtils.getContextTypeByName(contextItem, contextName);
ContextParameterType repoContextParameterType = ContextUtils.getContextParameterTypeByName(contextType, paramName);
if (repoContextParameterType != null && repoContextParameterType.eResource() == null) {
// processItem save before than contextItem, caused eResource null
IRepositoryService repositoryService = GlobalServiceRegister.getDefault().getService(IRepositoryService.class);
try {
repositoryService.getProxyRepositoryFactory().save(contextItem, false);
} catch (PersistenceException e) {
@@ -170,6 +183,30 @@ public abstract class AbstractItemContextLinkService implements IItemContextLink
}
return null;
}
protected boolean checkRepoItemContextParamInternalId(Item item) {
boolean isModified = false;
EList<?> contextTypeList = ContextUtils.getAllContextType(item);
if (contextTypeList != null) {
for (Object typeObj : contextTypeList) {
if (typeObj instanceof ContextType) {
ContextType type = (ContextType) typeObj;
for (Object obj : type.getContextParameter()) {
if (obj instanceof ContextParameterType) {
ContextParameterType contextParam = (ContextParameterType) obj;
if (ContextUtils.isBuildInParameter(contextParam)
&& StringUtils.isEmpty(contextParam.getInternalId())) {
contextParam
.setInternalId(CoreRuntimePlugin.getInstance().getProxyRepositoryFactory().getNextId());
isModified = true;
}
}
}
}
}
}
return isModified;
}
}

View File

@@ -119,6 +119,8 @@ public interface ILibrariesService extends IService {
List<ModuleNeeded> getModuleNeeded(String id, boolean isGroup);
public void deployProjectLibrary(File source) throws IOException;
public void setForceReloadCustomUri();
/**
* Listener used to fire that libraries status has been changed (new lib or new check install).

View File

@@ -0,0 +1,26 @@
package org.talend.core.model.metadata;
public class DbDefaultDatePattern {
private String defaultPattern;
private String dbTypeName;
public DbDefaultDatePattern() {
}
public String getDefaultPattern() {
return defaultPattern;
}
public void setDefaultPattern(String defaultPattern) {
this.defaultPattern = defaultPattern;
}
public String getDbTypeName() {
return dbTypeName;
}
public void setDbTypeName(String dbTypeName) {
this.dbTypeName = dbTypeName;
}
}

View File

@@ -41,6 +41,8 @@ public class Dbms {
private Set<MappingType> talendToDbTypes;
private List<DbDefaultLengthAndPrecision> defaultLengthPrecision;
private List<DbDefaultDatePattern> defaultPattern;
private List<DbIgnoreLengthAndPrecision> ignoreLengthPrecision;
@@ -62,6 +64,14 @@ public class Dbms {
List<DbDefaultLengthAndPrecision> defaultLengthPrecision) {
this.defaultLengthPrecision = defaultLengthPrecision;
}
public List<DbDefaultDatePattern> getDefaultPattern() {
return defaultPattern;
}
public void setDefaultPattern(
List<DbDefaultDatePattern> defaultLengthPrecision) {
this.defaultPattern = defaultLengthPrecision;
}
/**
* DOC amaumont Dbms constructor comment.

View File

@@ -125,10 +125,12 @@ public class MappingFileLoader {
// search and load preBeforelen nodes
ArrayList<String> dbTypes = new ArrayList<String>();
ArrayList<DbDefaultLengthAndPrecision> dbDefault = new ArrayList<DbDefaultLengthAndPrecision>();
ArrayList<DbDefaultDatePattern> dbDefaultPattern = new ArrayList<DbDefaultDatePattern>();
ArrayList<DbIgnoreLengthAndPrecision> dbIgnore = new ArrayList<DbIgnoreLengthAndPrecision>();
ArrayList<DbPreBeforeLength> dbPbeforeLList = new ArrayList<DbPreBeforeLength>();
dbms.setDbmsTypes(dbTypes);
dbms.setDefaultLengthPrecision(dbDefault);
dbms.setDefaultPattern(dbDefaultPattern);
dbms.setIgnoreLengthPrecision(dbIgnore);
dbms.setPrebeforelength(dbPbeforeLList);
List<Node> typeNodes = getChildElementNodes(dbTypesNode);
@@ -149,19 +151,25 @@ public class MappingFileLoader {
dbTypes.add(typeValue);
hAllDbTypes.add(typeValue);
DbDefaultLengthAndPrecision dbDefaultLP = new DbDefaultLengthAndPrecision();
DbDefaultDatePattern dbDefaultPt = new DbDefaultDatePattern();
DbIgnoreLengthAndPrecision dbIgnoreLP = new DbIgnoreLengthAndPrecision();
DbPreBeforeLength dbPBeforeL = new DbPreBeforeLength();
// default length and precision
Node defaultLengthItem = typeNodeAtttributes.getNamedItem("defaultLength"); //$NON-NLS-1$
Node defaultPrecision = typeNodeAtttributes.getNamedItem("defaultPrecision"); //$NON-NLS-1$
Node defaultPattern = typeNodeAtttributes.getNamedItem("defaultPattern"); //$NON-NLS-1$
if (defaultLengthItem != null)
dbDefaultLP.setDefaultLength(Integer.parseInt(defaultLengthItem.getNodeValue()));
if (defaultPrecision != null)
dbDefaultLP.setDefaultPrecision(Integer.parseInt(defaultPrecision.getNodeValue()));
if (defaultPattern != null)
dbDefaultPt.setDefaultPattern(defaultPattern.getNodeValue());
dbDefaultLP.setDbTypeName(typeValue);
dbDefaultPt.setDbTypeName(typeValue);
dbDefault.add(dbDefaultLP);
dbDefaultPattern.add(dbDefaultPt);
// ignore Length and Precision
Node ignoreLength = typeNodeAtttributes.getNamedItem("ignoreLen"); //$NON-NLS-1$

View File

@@ -191,6 +191,24 @@ public class MappingTypeRetriever {
}// end for
return false;
}
public String getDefaultPattern(String dbmsId, String dbType) {
Dbms dbms = MetadataTalendType.getDbms(dbmsId);
List<DbDefaultDatePattern> defaultPattern = dbms.getDefaultPattern();
String pattern = new String(""); //$NON-NLS-1$
for (int i = 0; i < defaultPattern.size(); i++) {
DbDefaultDatePattern dbPattern = (DbDefaultDatePattern) defaultPattern.get(i);
if (dbPattern.getDbTypeName().equalsIgnoreCase(dbType)) {
pattern = dbPattern.getDefaultPattern();
if (pattern == null) {
return "";
} else {
return pattern;
}
}// end if
}// end for
return pattern;
}
private boolean isExtensionPrecisionIgnored(String dbmsId, String dbType) {
Map<String, Map<String, List<DBTypeUtil>>> javaTypeMappingFromExtension = JavaTypesManager

View File

@@ -779,7 +779,7 @@ public final class MetadataToolHelper {
for (IMetadataColumn inputColumn : sourceColumns) {
for (IMetadataColumn outputcolumn : target.getListColumns()) {
String outputColumnName = outputcolumn.getLabel();
if (inputColumn.getLabel().toLowerCase().equals(("" + outputColumnName).toLowerCase())) {
if (inputColumn.getLabel().equalsIgnoreCase("" + outputColumnName)) {
columnsToRemoveMap.put(inputColumn, outputColumnName);
}
if (outputcolumn.isReadOnly()) {

View File

@@ -1,7 +1,6 @@
package org.talend.utils.string;
// ============================================================================
//
// Copyright (C) 2006-2019 Talend Inc. - www.talend.com
// 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
@@ -11,17 +10,16 @@ package org.talend.utils.string;
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.core.model.process;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
/**
* DOC cmeng class global comment. Detailled comment
*/
public abstract class AbsJobletReplaceNodeHandler extends AbsReplaceNodeHandler implements IJobletReplaceNodeHandler {
import org.junit.Test;
public class DigestUtilTest {
@Test
public void testSHA256Hex() {
String result = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad";
assertEquals(result, DigestUtil.sha256Hex("abc".getBytes()));
public AbsJobletReplaceNodeHandler(String prefix) {
super();
this.setPrefix(prefix);
}
}

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