Compare commits

..

76 Commits

Author SHA1 Message Date
hzhao-talendbj
d4397012d4 code changes (#3726)
* code changes

* change to official mvn
2020-10-15 22:51:22 +08:00
hzhao-talendbj
7781a255b9 add repository for Could not find artifact (#3719)
* add repository for Could not find artifact
org.talend.libraries:javax.ws.rs-api-2.0-m10:jar:6.0.0

* add repository talend-update to every pom

* change zip order
2020-10-14 14:27:09 +08:00
Jenkins Continuous Build server
0861f03e4b Set version to 7.4.1 M3 2020-10-13 17:04:40 +02:00
Jenkins Continuous Build server
46b951139c Set runtime version to 7.4.1 M3 2020-10-13 13:34:57 +02:00
kjwang
4b99767b6a Kjwang/feat tup 27762 new version of ci (#3656) (#3706)
* TUP-28274 Shared Studio: Can't find EMR 5.29 option in Hadoop Cluster
wizard after enable shared studio mode
https://jira.talendforge.org/browse/TUP-28274
2020-10-13 14:29:29 +08:00
chmyga
5a8ef4838a Dchmyga/tdi 44962 backport to master (#3704)
* Revert "fix(TDI-44826): Missing line in Resume log (#3640)" (#3691)

This reverts commit cf52e1e004.

Co-authored-by: Dmytro Chmyga <dmytro.chmyga@synapse.com>

* fix(TDI-44962): fix stream closed exception (#3692)

* Recreate FileWriter with append after writing header

* Add csv writer to shared writer map

Co-authored-by: Dmytro Chmyga <dmytro.chmyga@synapse.com>

Co-authored-by: Dmytro Chmyga <dmytro.chmyga@synapse.com>
2020-10-12 14:30:39 +03:00
jiezhang-tlnd
f815b15476 fix(TUP-28839)NPE when retrieve schema for JDBC connection of postgresql (#3700)
https://jira.talendforge.org/browse/TUP-28839
2020-10-12 16:47:33 +08:00
hzhao-talendbj
c362cc49a9 change to filter CI case (#3696) 2020-10-12 12:46:50 +08:00
hzhao-talendbj
ea8eedc571 remove some jars (#3630)
* remove some jars

* add commons-codec to lib when build studio

* add back httpcore and httpclient

* modify pom structure

* add fluent-hc to pom

* add common-cli

* add jar commons-cli-2.0-SANPSHOT back

* fix junit error

* add asm plugin into apache common

* add new pom,  add plugin.xml

* fix pom artifact id

* change relativePath to ../../

* add repositories/studio-auto-test-libs-releases/

* remove jars that can't be downloaded
2020-10-12 12:17:44 +08:00
Zhiwei Xue
3ee3097e32 fix(TUP-28656): Run restclient job get error 'Error: Could not find or (#3684)
load main class' when using jdk11
2020-10-12 10:28:58 +08:00
wang wei
470175ccf6 fix(TDI-44937): TalendDate.formatDateLocale()gives random value for FR country code in java 11.(#3679) 2020-10-12 10:15:12 +08:00
Chao MENG
93f4ff36ee fix(TUP-27076): Unable to connect to codecommit GIT after the first (#3672)
login.
https://jira.talendforge.org/browse/TUP-27076
2020-10-10 10:42:56 +08:00
jiezhang-tlnd
80273d36e1 feat(TUP-28811)update color for login page (#3699)
https://jira.talendforge.org/browse/TUP-28811
2020-10-10 10:12:29 +08:00
hzhao-talendbj
61493a76a4 remove exception log (#3687) 2020-10-09 11:10:38 +08:00
hzhao-talendbj
afb9b3ff0c tup-26713 (#3553)
* tup-26713

* add include groupids

* remove jars

* remove all jars and modify pom

* add extentions

* modify org.talendlibraries.mdm

* keep only three jars

* add new cxf pom

* remove pom

* add module

* add javax.ws.rs-api-2.0-m10

* try add javax.ws.rs-api to manifest and classpath

* try add to pom and copy during build

* modify plugin.xml

* try rename jar to javax.ws.rs-api-2.0-m10-6.0.0.jar

* add stripVersion , add cxf-core

* add back dependencies to pom but not in build properties

* change to copy-dependencies

* add to pom

* remove stripVersion because it will strip all jars version

* modify mistake cxf-rt-frontend-simple
2020-10-09 10:14:54 +08:00
hzhao-talendbj
56f428c944 tup 28319 remove jdbc plugins (#3563)
* tup 28319  remove jdbc plugins

* fix pom
2020-10-09 09:27:36 +08:00
vyu-talend
16fc19571c fix(TDI-44726):add some necessary annotation. (#3666) (#3682) 2020-09-27 16:14:50 +08:00
kjwang
a68463d184 Fix TUP-28603 'Export item' missing signature (#3643) (#3678)
* Fix TUP-28603 'Export item' missing signature
https://jira.talendforge.org/browse/TUP-28603
2020-09-27 15:34:29 +08:00
Jane Ding
d04f7db182 feat(TUP-27654):Databricks Delta Lake - Support ELT & MERGE (#3592) (#3667)
* feat(TUP-27654):Databricks Delta Lake - Support ELT & MERGE (#3592)

* feat(TUP-27654):Databricks Delta Lake - Support ELT & MERGE
https://jira.talendforge.org/browse/TUP-27654

* feat(TUP-27654):Databricks Delta Lake - Support ELT & MERGE
https://jira.talendforge.org/browse/TUP-27654

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

* feat(TUP-27654):Databricks Delta Lake - Support ELT & MERGE
https://jira.talendforge.org/browse/TUP-27654

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

* feat(TUP-27654):Databricks Delta Lake - Support ELT & MERGE
TUP-28615:[Bug] Save the property to metadata will change Delta Lake to
JDBC.
https://jira.talendforge.org/browse/TUP-27654

* feat(TUP-27654):Databricks Delta Lake - Support ELT & MERGE
https://jira.talendforge.org/browse/TUP-27654

* feat(TUP-27654):Databricks Delta Lake - Support ELT & MERGE
https://jira.talendforge.org/browse/TUP-27654

* feat(TUP-27654):Databricks Delta Lake - Support ELT & MERGE
https://jira.talendforge.org/browse/TUP-27654

* feat(TUP-27654):Databricks Delta Lake - Support ELT & MERGE (#3670)

https://jira.talendforge.org/browse/TUP-27654
2020-09-24 09:12:47 +08:00
sbliu
dd201ac7fa feat(TUP-28434) fix the test failure. 2020-09-23 10:03:01 +08:00
bhe-talendbj
7ce1c256dd feat(TUP-28666): Extract TalendTextUtils (#3648)
* feat(TUP-28666): Extract TalendTextUtils

* feat(TUP-28666): call new TalendTextUtils

* feat(TUP-28666): fix removeQuotesIfExist

* feat(TUP-28666): rename TalendTextUtils
2020-09-22 21:32:23 +08:00
Jane Ding
199f4dde6e fix(TUP-28519):Update org.talend.libraries.apache.google jars (#3631)
remove org.talend.libraries.apache.google plugin
https://jira.talendforge.org/browse/TUP-28519
2020-09-22 15:10:56 +08:00
Zhiwei Xue
c029f53402 feat(TUP-28323):Improve the maven build time spent during login project (#3649) 2020-09-21 15:17:16 +08:00
Chao MENG
8aea05339a Cmeng/workitem/tup 28063 improve start (#3565)
* workitem(TUP-28063): Improve studio bundles reloading logic
https://jira.talendforge.org/browse/TUP-28063

* workitem(TUP-28063): Improve studio bundles reloading logic
https://jira.talendforge.org/browse/TUP-28063

* workitem(TUP-28063): Improve studio bundles reloading logic
https://jira.talendforge.org/browse/TUP-28063

* workitem(TUP-28063): Improve studio bundles reloading logic
https://jira.talendforge.org/browse/TUP-28063

* workitem(TUP-28063): Improve studio bundles reloading logic
https://jira.talendforge.org/browse/TUP-28063
2020-09-21 14:12:47 +08:00
wang wei
cf19586e10 fix(TDI-44745): FileInputDelimited fails to properly consume CipherInputStream(#3590) (#3661) 2020-09-18 15:10:03 +08:00
wang wei
c68419a4e2 fix(TDI-44623): [OBSERVABILITY] : add PID and (Thread-ID OR UUID) information (#3614) (#3662)
* fix(TDI-44623): [OBSERVABILITY] : add PID and (Thread-ID OR UUID)
information

* decrease the expensive call number for getting pid

* fix(TDI-44807): Observability: initialize moment only when necessary

* fix(TDI-44806): Observability: Add customization for event frequency
2020-09-18 15:06:44 +08:00
Chao MENG
819477f327 fix(TUP-26413): Be able to compare metadata connection conflicts (#3658)
https://jira.talendforge.org/browse/TUP-26413
2020-09-18 12:27:18 +08:00
hzhao-talendbj
eab0938fb0 update PSQL_V9_X to 42.2.14 (#3617) 2020-09-17 16:10:29 +08:00
hcyi
40da0e6196 feat(TUP-23827): Runtime Lineage (#3646)
* feat(TUP-23827):Runtime Lineage for studio.

* fix(TUP-28635):[bug] output path always be changed when path contains
2020-09-17 14:55:09 +08:00
sbliu
8264ddedf8 feature(TUP-28405) Collect hardware info. also add function to measure performance( IO speed, startup time), show them in preference..
performance data show in preference won't show unit.
2020-09-17 14:37:48 +08:00
Chao MENG
b76af1a75a fix(TUP-28682): Connection info missing when create dataset for tck (#3654)
components

https://jira.talendforge.org/browse/TUP-28682
2020-09-17 11:06:29 +08:00
hcyi
eecc3eff20 fix(TUP-27518):revert the code since get some error log . (#3650) 2020-09-16 18:33:34 +08:00
Haiting Yin
b8293db502 TMDM-12594 [Component] Legacy 5 version is no more supported (#3647) 2020-09-16 15:27:13 +08:00
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
585 changed files with 4550 additions and 16120 deletions

View File

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

View File

@@ -4,15 +4,7 @@
<description url="http://www.example.com/description">[Enter Feature Description here.]</description>
<copyright url="http://www.example.com/copyright">[Enter Copyright Description here.]</copyright>
<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.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-SNAPSHOT</version>
<version>7.4.1-M3</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-SNAPSHOT</version>
<version>7.4.1-M3</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-SNAPSHOT</version>
<version>7.4.1-M3</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-SNAPSHOT</version>
<version>7.4.1-M3</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-SNAPSHOT</version>
<version>7.4.1-M3</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-SNAPSHOT</version>
<version>7.4.1-M3</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-SNAPSHOT</version>
<version>7.4.1-M3</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-SNAPSHOT</version>
<version>7.4.1-M3</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-SNAPSHOT</version>
<version>7.4.1-M3</version>
<relativePath>../../../</relativePath>
</parent>
<artifactId>org.talend.common.ui.runtime</artifactId>

View File

@@ -24,11 +24,11 @@ public interface ColorConstants {
static final Color GREY_COLOR = new Color(null, 215, 215, 215);
static final Color YELLOW_GREEN_COLOR = new Color(null, 138, 188, 0);// 143, 163, 35
static final Color YELLOW_GREEN_COLOR = new Color(null, 88,153,24);// 143, 163, 35
static final Color YELLOW_COLOR = new Color(null, 255, 173, 37);// 254, 182, 84
static final Color RED_COLOR = new Color(null, new RGB(240, 0, 0));// 255
static final Color RED_COLOR = new Color(null, new RGB(204,87,89));// 255
static final Color VERTICAL_SEPERATOR_LINE_COLOR = new Color(null, 162, 179, 195);

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

@@ -16,7 +16,8 @@ Require-Bundle: org.apache.log4j;visibility:=reexport,
org.talend.utils,
org.eclipse.core.net,
org.eclipse.m2e.core,
org.eclipse.m2e.maven.runtime
org.eclipse.m2e.maven.runtime,
org.eclipse.core.resources
Export-Package: org.talend.commons,
org.talend.commons.exception,
org.talend.commons.i18n,

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-SNAPSHOT</version>
<version>7.4.1-M3</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-SNAPSHOT</version>
<version>7.4.1-M3</version>
<relativePath>../pom_server.xml</relativePath>
</parent>

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

@@ -150,6 +150,28 @@ public class NetworkUtil {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
String httpProxyHost = System.getProperty("http.proxyHost"); //$NON-NLS-1$
String httpProxyPort = System.getProperty("http.proxyPort"); //$NON-NLS-1$
String httpsProxyHost = System.getProperty("https.proxyHost"); //$NON-NLS-1$
String httpsProxyPort = System.getProperty("https.proxyPort"); //$NON-NLS-1$
String requestingHost = getRequestingHost();
int requestingPort = getRequestingPort();
String proxyHost = null;
String proxyPort = null;
boolean isHttp = false;
if ("http".equalsIgnoreCase(getRequestingScheme())) {
isHttp = true;
}
if (isHttp && StringUtils.isNotBlank(httpProxyHost)) {
proxyHost = httpProxyHost;
proxyPort = httpProxyPort;
} else {
proxyHost = httpsProxyHost;
proxyPort = httpsProxyPort;
}
if (!StringUtils.equals(proxyHost, requestingHost) || !StringUtils.equals(proxyPort, "" + requestingPort)) {
return null;
}
String httpProxyUser = System.getProperty("http.proxyUser"); //$NON-NLS-1$
String httpProxyPassword = System.getProperty("http.proxyPassword"); //$NON-NLS-1$
String httpsProxyUser = System.getProperty("https.proxyUser"); //$NON-NLS-1$
@@ -167,7 +189,11 @@ public class NetworkUtil {
proxyPassword = httpsProxyPassword.toCharArray();
}
}
return new PasswordAuthentication(proxyUser, proxyPassword);
if (StringUtils.isBlank(proxyUser)) {
return null;
} else {
return new PasswordAuthentication(proxyUser, proxyPassword);
}
}
});

View File

@@ -49,11 +49,17 @@ public class EclipseCommandLine {
*/
static public final String TALEND_PROJECT_TYPE_COMMAND = "-talendProjectType"; //$NON-NLS-1$
static public final String TALEND_LICENCE_PATH = "talend.licence.path"; //$NON-NLS-1$
static public final String ARG_TALEND_LICENCE_PATH = "-" + TALEND_LICENCE_PATH; //$NON-NLS-1$
/**
* for relaunch of the plugins when relaunching the Studio
*/
static public final String TALEND_RELOAD_COMMAND = "-talendReload"; //$NON-NLS-1$
static public final String LOGIN_ONLINE_UPDATE = "--loginOnlineUpdate";
static public final String ARG_TALEND_BUNDLES_CLEANED = "-talend.studio.bundles.cleaned"; //$NON-NLS-1$
static public final String PROP_TALEND_BUNDLES_DO_CLEAN = "-talend.studio.bundles.doclean"; //$NON-NLS-1$

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,368 @@
// ============================================================================
//
// 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.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.text.DecimalFormat;
import java.util.Properties;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Platform;
import org.talend.commons.exception.CommonExceptionHandler;
/**
* DOC sbliu class global comment. Detailled comment
*/
public class PerformanceStatisticUtil {
private static final DecimalFormat DF = new DecimalFormat("###.##");
private static final int MEGABYTE = 1024 * 1024;// MB = 1024*1024 byte
private static final int KILOBYTE = 1024;// kb=1024 byte
private static final int numOfBlocks = 256;
private static final int blockSizeKb = 512;
private static final String dataFile = "testio.data";
private static String recordingFileName = "performance_record";
private static File recordingFile = null;
private static enum BlockSequence {
SEQUENTIAL,
RANDOM;
}
public static enum StatisticKeys {
IO_COUNT("I/O.count"), // io count
IO_W_MB_SEC("I/O.write"), // write speed MB
IO_R_MB_SEC("I/O.read"), // read speed MB
IO_W_AVERAGE_MB_SEC("I/O.write.average"), // average speed of write MB
IO_R_AVERAGE_MB_SEC("I/O.read.average"), // average speed of read
STARTUP_AVERAGE("startup.average"),
STARTUP_MAX("startup.max"),
STARTUP_COUNT("startup.count");
private String key;
StatisticKeys(String _key) {
key = _key;
}
public String get() {
return key;
}
}
public static void recordStartupEpapsedTime(double elapsedTimeInSeconds) {
File file = getRecordingFile();
Properties props = read(file, true);
String propCount = props.getProperty(StatisticKeys.STARTUP_COUNT.get(), "0");
String propMax = props.getProperty(StatisticKeys.STARTUP_MAX.get(), "0");
String propAverage = props.getProperty(StatisticKeys.STARTUP_AVERAGE.get(), "0");
int iPropCount = Integer.parseInt(propCount);
double iPropMax = Double.parseDouble(propMax);
double iPropAverage = Double.parseDouble(propAverage);
iPropMax = iPropMax > elapsedTimeInSeconds ? iPropMax : elapsedTimeInSeconds;
iPropAverage = (iPropAverage * iPropCount + elapsedTimeInSeconds) / (iPropCount + 1);
iPropCount++;
props.setProperty(StatisticKeys.STARTUP_COUNT.get(), "" + iPropCount);
props.setProperty(StatisticKeys.STARTUP_MAX.get(), "" + iPropMax);
props.setProperty(StatisticKeys.STARTUP_AVERAGE.get(), "" + iPropAverage);
store(file, props);
}
public static File getRecordingFile() {
if (recordingFile != null) {
return recordingFile;
}
String configurationLocation = Platform.getConfigurationLocation().getURL().getPath();
File file = new File(configurationLocation + "/" + recordingFileName);
return file;
}
public static void setRecordingFile(File _recordingFile) {
recordingFile = _recordingFile;
}
public static synchronized Properties read(File recordFile, boolean createIfNotExist) {
Properties props = new Properties();
if (recordFile != null && exist(recordFile, createIfNotExist)) {
FileInputStream inStream = null;
try {
inStream = new FileInputStream(recordFile);
props.load(inStream);
} catch (Exception e) {
CommonExceptionHandler.log(e.getMessage());
} finally {
if (inStream != null) {
try {
inStream.close();
} catch (IOException e) {//
}
}
}
}
return props;
}
public static synchronized void store(File recordFile, Properties props) {
if (props == null) {
return;
}
if (recordFile != null && exist(recordFile, true)) {
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(recordFile);
props.store(outputStream, "");
} catch (IOException e) {
CommonExceptionHandler.log(e.getMessage());
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
//
}
}
}
}
}
private static boolean exist(File recordFile, boolean createIfNotExist) {
boolean exists = recordFile.exists();
if (!exists && createIfNotExist) {
try {
exists = recordFile.createNewFile();
if (!exists) {
throw new FileNotFoundException(recordFile.getName());
}
} catch (Exception e) {
CommonExceptionHandler.log(e.getMessage());
return false;
}
}
return exists;
}
private static Lock lock = new ReentrantLock();
private static Condition condition = lock.newCondition();
private static boolean measureIOFinished = true;
public static void waitUntilFinish() throws InterruptedException {
lock.lock();
try {
if(!measureIOFinished) {
condition.await(20, TimeUnit.SECONDS);
}
} finally {
lock.unlock();
}
}
public static void measureIO() {
new Thread() {
public void run() {
measureIOFinished = false;
try {
_measureIO();
} finally {
measureIOFinished = true;
}
}
}.start();
}
private static void _measureIO() {
File file = getRecordingFile();
Properties props = read(file, true);
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
File workspace = root.getLocation().makeAbsolute().toFile();
File locationDir = new File(workspace, "temp"); // here is workspace/temp dir
File testFile = detectTestDataFile(locationDir);
if (testFile != null) {
measureWrite(props, testFile);
measureRead(props, testFile);
store(file, props);
}
}
private static void measureWrite(Properties props, File testFile) {
int blockSize = blockSizeKb * KILOBYTE;
long startTime = System.nanoTime();
long totalBytesWrittenInMark = writeIO(numOfBlocks, BlockSequence.RANDOM, blockSize, testFile);
totalBytesWrittenInMark = totalBytesWrittenInMark + writeIO(numOfBlocks, BlockSequence.SEQUENTIAL, blockSize, testFile);
long endTime = System.nanoTime();
long elapsedTimeNs = endTime - startTime;
double sec = (double) elapsedTimeNs / (double) 1000000000;
double mbWritten = (double) totalBytesWrittenInMark / (double) MEGABYTE;
double bwMbSec = mbWritten / sec;
String ioCount = props.getProperty(StatisticKeys.IO_COUNT.get(), "0");
String ioWAverageMbSec = props.getProperty(StatisticKeys.IO_W_AVERAGE_MB_SEC.get(), "0");
String ioWMbSec = props.getProperty(StatisticKeys.IO_W_MB_SEC.get(), "0");
int digital_ioCount = Integer.parseInt(ioCount);
double digital_ioWAverageMbSec = Double.parseDouble(ioWAverageMbSec);
double digital_ioWMbSec = Double.parseDouble(ioWMbSec);
digital_ioWAverageMbSec = (digital_ioWAverageMbSec * digital_ioCount + bwMbSec) / (digital_ioCount + 1);
digital_ioWMbSec = bwMbSec;
props.setProperty(StatisticKeys.IO_W_AVERAGE_MB_SEC.get(), "" + DF.format(digital_ioWAverageMbSec));
props.setProperty(StatisticKeys.IO_W_MB_SEC.get(), "" + DF.format(digital_ioWMbSec));
}
private static long writeIO(int numOfBlocks, BlockSequence blockSequence, int blockSize, File testFile) {
byte[] blockArr = new byte[blockSize];
for (int b = 0; b < blockArr.length; b++) {
if (b % 2 == 0) {
blockArr[b] = (byte) 0xFF;
}
}
String mode = "rwd";// "rwd"
long totalBytesWrittenInMark = 0;
try {
try (RandomAccessFile rAccFile = new RandomAccessFile(testFile, mode)) {
for (int b = 0; b < numOfBlocks; b++) {
if (blockSequence == BlockSequence.RANDOM) {
int rLoc = randInt(0, numOfBlocks - 1);
rAccFile.seek(rLoc * blockSize);
} else {
rAccFile.seek(b * blockSize);
}
rAccFile.write(blockArr, 0, blockSize);
totalBytesWrittenInMark += blockSize;
}
}
} catch (IOException e) {
CommonExceptionHandler.log(e.getMessage());
}
return totalBytesWrittenInMark;
}
private static File detectTestDataFile(File location) {
if (!location.exists()) {
location.mkdirs();
}
File testFile = null;
try {
testFile = new File(location.getAbsolutePath() + File.separator + dataFile);
testFile.deleteOnExit();
testFile.createNewFile();
} catch (IOException e) {
CommonExceptionHandler.log(e.getMessage());
}
return testFile;
}
public static void measureRead(Properties props, File testFile) {
int blockSize = blockSizeKb * KILOBYTE;
long startTime = System.nanoTime();
long totalBytesReadInMark = readIO(numOfBlocks, BlockSequence.RANDOM, blockSize, testFile);
totalBytesReadInMark = totalBytesReadInMark + readIO(numOfBlocks, BlockSequence.SEQUENTIAL, blockSize, testFile);
long endTime = System.nanoTime();
long elapsedTimeNs = endTime - startTime;
double sec = (double) elapsedTimeNs / (double) 1000000000;
double mbRead = (double) totalBytesReadInMark / (double) MEGABYTE;
double bwMbSec = mbRead / sec;
String ioCount = props.getProperty(StatisticKeys.IO_COUNT.get(), "0");
String ioRAverageMbSec = props.getProperty(StatisticKeys.IO_R_AVERAGE_MB_SEC.get(), "0");
String ioRMbSec = props.getProperty(StatisticKeys.IO_R_MB_SEC.get(), "0");
int digital_ioCount = Integer.parseInt(ioCount);
double digital_ioRAverageMbSec = Double.parseDouble(ioRAverageMbSec);
double digital_ioRMbSec = Double.parseDouble(ioRMbSec);
digital_ioRAverageMbSec = (digital_ioRAverageMbSec * digital_ioCount + bwMbSec) / (digital_ioCount + 1);
digital_ioRMbSec = bwMbSec;
digital_ioCount++;
props.setProperty(StatisticKeys.IO_R_AVERAGE_MB_SEC.get(), "" + DF.format(digital_ioRAverageMbSec));
props.setProperty(StatisticKeys.IO_R_MB_SEC.get(), "" + DF.format(digital_ioRMbSec));
props.setProperty(StatisticKeys.IO_COUNT.get(), "" + digital_ioCount);
}
private static long readIO(int numOfBlocks, BlockSequence blockSequence, int blockSize, File testFile) {
long totalBytesReadInMark = 0;
byte[] blockArr = new byte[blockSize];
for (int b = 0; b < blockArr.length; b++) {
if (b % 2 == 0) {
blockArr[b] = (byte) 0xFF;
}
}
try {
try (RandomAccessFile rAccFile = new RandomAccessFile(testFile, "r")) {
for (int b = 0; b < numOfBlocks; b++) {
if (blockSequence == BlockSequence.RANDOM) {
int rLoc = randInt(0, numOfBlocks - 1);
rAccFile.seek(rLoc * blockSize);
} else {
rAccFile.seek(b * blockSize);
}
rAccFile.readFully(blockArr, 0, blockSize);
totalBytesReadInMark += blockSize;
}
}
} catch (IOException e) {
CommonExceptionHandler.log(e.getMessage());
}
return totalBytesReadInMark;
}
private static int randInt(int min, int max) {
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = new Random().nextInt((max - min) + 1) + min;
return randomNum;
}
}

View File

@@ -0,0 +1,116 @@
// ============================================================================
//
// 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 long startTime = -1L;
private static int indent = 0;
public static void begin(String idTimer) {
startTime = System.nanoTime();
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);
}
}
public static void afterStartup() {
double elapsedTimeInSeconds = (double)(System.nanoTime() - startTime)/1000000000;
PerformanceStatisticUtil.recordStartupEpapsedTime(elapsedTimeInSeconds);
PerformanceStatisticUtil.measureIO();
}
}

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>org.talend.studio</groupId>
<artifactId>tcommon-studio-se</artifactId>
<version>7.4.1-SNAPSHOT</version>
<version>7.4.1-M3</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-SNAPSHOT</version>
<version>7.4.1-M3</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, true, 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 {
@@ -2233,6 +2281,8 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
// set the project mappings url
System.setProperty("talend.mappings.url", url.toString()); // $NON-NLS-1$
}
// for new added mapping file, sync to project mapping folder
MetadataTalendType.syncNewMappingFileToProject();
} catch (SystemException e) {
// ignore
ExceptionHandler.process(e);
@@ -2241,7 +2291,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 +2308,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 +2709,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,6 +283,38 @@ public class RecycleBinManager {
resource = createRecycleBinResource(project);
}
resource.getContents().clear();
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);

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 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

@@ -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-SNAPSHOT</version>
<version>7.4.1-M3</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

@@ -102,12 +102,12 @@ public enum EDatabaseVersion4Drivers {
GREENPLUM(new DbVersion4Drivers(EDatabaseTypeName.GREENPLUM, "postgresql-8.4-703.jdbc4.jar")), //$NON-NLS-1$
// PSQL_V10(new DbVersion4Drivers(EDatabaseTypeName.PSQL, "v10", "V10", "postgresql-42.2.5.jar")),
PSQL_V9_X(new DbVersion4Drivers(EDatabaseTypeName.PSQL, "v9 and later", "V9_X", "postgresql-42.2.9.jar")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
PSQL_V9_X(new DbVersion4Drivers(EDatabaseTypeName.PSQL, "v9 and later", "V9_X", "postgresql-42.2.14.jar")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
PSQL_PRIOR_TO_V9(new DbVersion4Drivers(EDatabaseTypeName.PSQL, "Prior to v9", "PRIOR_TO_V9", "postgresql-8.4-703.jdbc4.jar")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
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

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