Compare commits
43 Commits
bugfix/mas
...
release/7.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0efb40b4d5 | ||
|
|
21f5ac7771 | ||
|
|
1449055789 | ||
|
|
d1eeeb319d | ||
|
|
62bcd2d641 | ||
|
|
dbc3b0fb17 | ||
|
|
63587e1f14 | ||
|
|
cb9206e2de | ||
|
|
9e7e9c274c | ||
|
|
9c1e780550 | ||
|
|
2f14d6f7af | ||
|
|
ced9549634 | ||
|
|
12e06dcd43 | ||
|
|
b3c658190e | ||
|
|
2a152f780c | ||
|
|
e51a1be010 | ||
|
|
28df42e0fb | ||
|
|
a196cf3209 | ||
|
|
490b9df3d8 | ||
|
|
e5c48c0472 | ||
|
|
32380af191 | ||
|
|
df577338cd | ||
|
|
a56358308e | ||
|
|
0f28377fa4 | ||
|
|
9050d9050a | ||
|
|
81ea7aa0ea | ||
|
|
009e9d0cd6 | ||
|
|
d242a0e8f7 | ||
|
|
72390d4f27 | ||
|
|
9616a5028c | ||
|
|
bbc21acd80 | ||
|
|
cfcd57c65f | ||
|
|
cf9201c9d7 | ||
|
|
00b496bfba | ||
|
|
ad39bcc1f1 | ||
|
|
cbe87f5167 | ||
|
|
9bcafa150f | ||
|
|
cc400a4d22 | ||
|
|
1b1064ff73 | ||
|
|
8ea829ee81 | ||
|
|
feb4bce9b4 | ||
|
|
2c5e127de1 | ||
|
|
dfb82eb5a7 |
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
<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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -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$
|
||||
|
||||
@@ -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$
|
||||
|
||||
@@ -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 \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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2020 Talend Inc. - www.talend.com
|
||||
//
|
||||
// This source code is available under agreement available at
|
||||
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
|
||||
//
|
||||
// You should have received a copy of the agreement
|
||||
// along with this program; if not, write to Talend SA
|
||||
// 9 rue Pages 92150 Suresnes, France
|
||||
//
|
||||
// ============================================================================
|
||||
package org.talend.commons.utils.time;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
/**
|
||||
* DOC sbliu class global comment. Detailled comment
|
||||
*/
|
||||
public class TimeMeasurePerformance extends TimeMeasure{
|
||||
static private Logger logger;
|
||||
|
||||
private static HashMap<String, TimeStack> timers;
|
||||
|
||||
private static int indent = 0;
|
||||
|
||||
public static void begin(String idTimer) {
|
||||
init();
|
||||
if (timers.containsKey(idTimer)) {
|
||||
log(indent(indent) + "Warning (start): timer " + idTimer + " already exists"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
} else {
|
||||
indent++;
|
||||
TimeStack times = new TimeStack();
|
||||
timers.put(idTimer, times);
|
||||
log(indent(indent) + "Start '" + idTimer + "' ..."); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
}
|
||||
|
||||
private static void init() {
|
||||
if (timers == null) {
|
||||
timers = new HashMap<String, TimeStack>();
|
||||
}
|
||||
|
||||
if(logger == null) {
|
||||
configureLogger();
|
||||
}
|
||||
}
|
||||
|
||||
private static void log (String message) {
|
||||
logger.info(message);
|
||||
}
|
||||
|
||||
public static long end(String idTimer) {
|
||||
init();
|
||||
if (!timers.containsKey(idTimer)) {
|
||||
log(indent(indent) + "Warning (end): timer " + idTimer + " doesn't exist"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
return -1;
|
||||
} else {
|
||||
TimeStack timeStack = timers.get(idTimer);
|
||||
timers.remove(idTimer);
|
||||
long elapsedTimeSinceLastRequest = timeStack.getLastStepElapsedTime();
|
||||
log(indent(indent) + "End '" + idTimer + "', elapsed time since last request: " //$NON-NLS-1$ //$NON-NLS-2$
|
||||
+ elapsedTimeSinceLastRequest + " ms "); //$NON-NLS-1$
|
||||
|
||||
long totalElapsedTime = timeStack.getTotalElapsedTime();
|
||||
|
||||
log(indent(indent) + "End '" + idTimer + "', total elapsed time: " + totalElapsedTime + " ms "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
|
||||
indent--;
|
||||
return totalElapsedTime;
|
||||
}
|
||||
}
|
||||
|
||||
public static long step(String idTimer, String stepName) {
|
||||
init();
|
||||
if (!timers.containsKey(idTimer)) {
|
||||
log(indent(indent) + "Warning (end): timer " + idTimer + " does'nt exist"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
return -1;
|
||||
} else {
|
||||
TimeStack timeStack = timers.get(idTimer);
|
||||
timeStack.addStep();
|
||||
/*
|
||||
* trace the timeline of every step,problem is that the code below " Calendar ca = Calendar.getInstance();
|
||||
* Date now = ca.getTime();" will cost almost 13ms~15ms
|
||||
*/
|
||||
long time = timeStack.getLastStepElapsedTime();
|
||||
String timerStepName = idTimer + "', step name '" + stepName; //$NON-NLS-1$
|
||||
|
||||
log(indent(indent)
|
||||
+ "-> '" + timerStepName + "', elapsed time since previous step: " + time + " ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
|
||||
return time;
|
||||
}
|
||||
}
|
||||
|
||||
private static void configureLogger() {
|
||||
try {
|
||||
PerformanceLogManager logManager = new PerformanceLogManager();
|
||||
logger = logManager.getLogger(TimeMeasurePerformance.class.getName());
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Error while initializing log properties.", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -212,4 +212,8 @@ public class CommonTextCellEditorWithProposal {
|
||||
return this.contentProposalAdapter;
|
||||
}
|
||||
|
||||
public int getPreviousActivatedIndex() {
|
||||
return previousActivatedIndex;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -97,4 +97,7 @@ public class ExtendedTextCellEditorWithProposal extends ExtendedTextCellEditor i
|
||||
super.fireCancelEditor();
|
||||
}
|
||||
|
||||
public CommonTextCellEditorWithProposal getCommonTextEditor() {
|
||||
return commonTextEditor;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,4 +67,9 @@ public class SyncLibrariesLoginTask extends AbstractLoginTask implements IRunnab
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRequiredAlways() {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -837,8 +837,8 @@ public abstract class AbstractEMFRepositoryFactory extends AbstractRepositoryFac
|
||||
Object fullFolder = getFullFolder(project, type, relativeFolder);
|
||||
serializableAllVersion = getSerializableFromFolder(project, fullFolder, id, type, false, false, true, true);
|
||||
if (serializableAllVersion.isEmpty()) {
|
||||
// look in all folders
|
||||
serializableAllVersion = getSerializable(project, id, false, false);
|
||||
// look in all folders for this item type
|
||||
serializableAllVersion = getSerializableFromFolder(project, fullFolder, id, type, false, false, true, true, true);
|
||||
}
|
||||
int size = serializableAllVersion.size();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -15,6 +15,7 @@ package org.talend.core.repository.model;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.beans.PropertyChangeSupport;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
@@ -71,7 +72,7 @@ import org.talend.commons.ui.gmf.util.DisplayUtils;
|
||||
import org.talend.commons.ui.runtime.exception.MessageBoxExceptionHandler;
|
||||
import org.talend.commons.utils.data.container.RootContainer;
|
||||
import org.talend.commons.utils.network.TalendProxySelector;
|
||||
import org.talend.commons.utils.time.TimeMeasure;
|
||||
import org.talend.commons.utils.time.TimeMeasurePerformance;
|
||||
import org.talend.commons.utils.workbench.resources.ResourceUtils;
|
||||
import org.talend.core.AbstractDQModelService;
|
||||
import org.talend.core.GlobalServiceRegister;
|
||||
@@ -84,6 +85,7 @@ import org.talend.core.context.Context;
|
||||
import org.talend.core.context.RepositoryContext;
|
||||
import org.talend.core.exception.TalendInternalPersistenceException;
|
||||
import org.talend.core.hadoop.BigDataBasicUtil;
|
||||
import org.talend.core.model.general.ILibrariesService;
|
||||
import org.talend.core.model.general.ModuleNeeded;
|
||||
import org.talend.core.model.general.Project;
|
||||
import org.talend.core.model.metadata.MetadataTalendType;
|
||||
@@ -124,6 +126,7 @@ import org.talend.core.repository.constants.Constant;
|
||||
import org.talend.core.repository.constants.FileConstants;
|
||||
import org.talend.core.repository.i18n.Messages;
|
||||
import org.talend.core.repository.recyclebin.RecycleBinManager;
|
||||
import org.talend.core.repository.utils.LoginTaskRegistryReader;
|
||||
import org.talend.core.repository.utils.ProjectDataJsonProvider;
|
||||
import org.talend.core.repository.utils.RepositoryPathProvider;
|
||||
import org.talend.core.repository.utils.XmiResourceManager;
|
||||
@@ -132,10 +135,10 @@ import org.talend.core.runtime.repository.item.ItemProductKeys;
|
||||
import org.talend.core.runtime.services.IMavenUIService;
|
||||
import org.talend.core.runtime.util.ItemDateParser;
|
||||
import org.talend.core.service.ICoreUIService;
|
||||
import org.talend.core.service.IUpdateService;
|
||||
import org.talend.cwm.helper.SubItemHelper;
|
||||
import org.talend.cwm.helper.TableHelper;
|
||||
import org.talend.designer.runprocess.IRunProcessService;
|
||||
import org.talend.login.ILoginTask;
|
||||
import org.talend.repository.ProjectManager;
|
||||
import org.talend.repository.ReferenceProjectProblemManager;
|
||||
import org.talend.repository.ReferenceProjectProvider;
|
||||
@@ -177,6 +180,8 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
|
||||
private boolean isCancelled;
|
||||
|
||||
private static final LoginTaskRegistryReader LOGIN_TASK_REGISTRY_READER = new LoginTaskRegistryReader();
|
||||
|
||||
@Override
|
||||
public synchronized void addPropertyChangeListener(PropertyChangeListener l) {
|
||||
if (l == null) {
|
||||
@@ -226,6 +231,13 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
return null;
|
||||
}
|
||||
|
||||
private ILibrariesService getLibrariesService() {
|
||||
if (GlobalServiceRegister.getDefault().isServiceRegistered(ILibrariesService.class)) {
|
||||
return GlobalServiceRegister.getDefault().getService(ILibrariesService.class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
@@ -1213,6 +1225,28 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
return this.repositoryFactoryFromProvider.getLastVersion(project, ProcessUtils.getPureItemId(id), folderPath, type);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public IRepositoryViewObject getLastVersion(String id, ERepositoryObjectType type)
|
||||
throws PersistenceException {
|
||||
return getLastVersion(id , "", type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IRepositoryViewObject getLastVersion(String id, List<ERepositoryObjectType> types) throws PersistenceException {
|
||||
if (types != null) {
|
||||
IRepositoryViewObject object = null;
|
||||
for (ERepositoryObjectType type : types) {
|
||||
object = getLastVersion(id, type);
|
||||
if (object != null) {
|
||||
return object;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IRepositoryViewObject getLastVersion(String id, String folderPath, ERepositoryObjectType type)
|
||||
throws PersistenceException {
|
||||
String objId = id;
|
||||
@@ -1224,7 +1258,25 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
return this.repositoryFactoryFromProvider.getLastVersion(project, objId, folderPath, type);
|
||||
}
|
||||
}
|
||||
return this.repositoryFactoryFromProvider.getLastVersion(projectManager.getCurrentProject(), objId , folderPath, type);
|
||||
return getLastRefVersion(projectManager.getCurrentProject(), objId , folderPath, type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IRepositoryViewObject getLastRefVersion(Project project, String id, String folderPath, ERepositoryObjectType type) throws PersistenceException {
|
||||
String projectLabel = ProcessUtils.getProjectLabelFromItemId(id);
|
||||
IRepositoryViewObject lastVersion = getLastVersion(project, ProcessUtils.getPureItemId(id), folderPath, type);
|
||||
if (lastVersion == null) {
|
||||
for (Project p : projectManager.getReferencedProjects(project)) {
|
||||
if (projectLabel != null && !projectLabel.equals(p.getTechnicalLabel())) {
|
||||
continue;
|
||||
}
|
||||
lastVersion = getLastRefVersion(p, id);
|
||||
if (lastVersion != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return lastVersion;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1442,7 +1494,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
String folderName = parentPath.append(folderLabel).toString();
|
||||
boolean found = false;
|
||||
for (String existedFolder : folders) {
|
||||
if (folderName.toUpperCase().equals(existedFolder.toUpperCase())) {
|
||||
if (folderName.equalsIgnoreCase(existedFolder)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
@@ -1546,14 +1598,15 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
|
||||
@Override
|
||||
public void save(Project project, Item item, boolean... isMigrationTask) throws PersistenceException {
|
||||
this.repositoryFactoryFromProvider.save(project, item);
|
||||
if (isMigrationTask == null || isMigrationTask.length == 0 || !isMigrationTask[0]) {
|
||||
this.repositoryFactoryFromProvider.save(project, item);
|
||||
boolean avoidGenerateProm = false;
|
||||
if (isMigrationTask != null && isMigrationTask.length == 2) {
|
||||
avoidGenerateProm = isMigrationTask[1];
|
||||
}
|
||||
fireRepositoryPropertyChange(ERepositoryActionName.SAVE.getName(), avoidGenerateProm, item);
|
||||
|
||||
} else {
|
||||
this.repositoryFactoryFromProvider.save(project, item, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2035,11 +2088,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
*/
|
||||
public void logOnProject(Project project, IProgressMonitor monitor) throws LoginException, PersistenceException {
|
||||
try {
|
||||
TimeMeasure.display = CommonsPlugin.isDebugMode();
|
||||
TimeMeasure.displaySteps = CommonsPlugin.isDebugMode();
|
||||
TimeMeasure.measureActive = CommonsPlugin.isDebugMode();
|
||||
|
||||
TimeMeasure.begin("logOnProject"); //$NON-NLS-1$
|
||||
TimeMeasurePerformance.begin("logOnProject"); //$NON-NLS-1$
|
||||
try {
|
||||
/**
|
||||
* init/check proxy selector, in case default proxy selector is not registed yet
|
||||
@@ -2083,6 +2132,10 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
this.repositoryFactoryFromProvider.beforeLogon(project);
|
||||
ProjectManager.getInstance().getBeforeLogonRecords().clear();
|
||||
ProjectManager.getInstance().getUpdatedRemoteHandlerRecords().clear();
|
||||
ILibrariesService librariesService = getLibrariesService();
|
||||
if (librariesService != null) {
|
||||
librariesService.setForceReloadCustomUri();
|
||||
}
|
||||
|
||||
ProjectDataJsonProvider.checkAndRectifyRelationShipSetting(project.getEmfProject());
|
||||
|
||||
@@ -2106,7 +2159,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
throw new OperationCanceledException(""); //$NON-NLS-1$
|
||||
}
|
||||
// monitorWrap.worked(1);
|
||||
TimeMeasure.step("logOnProject", "beforeLogon"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
TimeMeasurePerformance.step("logOnProject", "beforeLogon"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
// Check project compatibility
|
||||
checkProjectCompatibility(project);
|
||||
@@ -2124,7 +2177,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
currentMonitor = subMonitor.newChild(1, SubMonitor.SUPPRESS_NONE);
|
||||
currentMonitor.beginTask(Messages.getString("ProxyRepositoryFactory.synchronizeLibraries"), 1); //$NON-NLS-1$
|
||||
coreService.syncLibraries(currentMonitor);
|
||||
TimeMeasure.step("logOnProject", "Sync components libraries"); //$NON-NLS-1$
|
||||
TimeMeasurePerformance.step("logOnProject", "Sync components libraries"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
currentMonitor = subMonitor.newChild(1, SubMonitor.SUPPRESS_NONE);
|
||||
@@ -2133,7 +2186,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
executeMigrations(project, true, currentMonitor);
|
||||
ProjectManager.getInstance().getMigrationRecords().clear();
|
||||
// monitorWrap.worked(1);
|
||||
TimeMeasure.step("logOnProject", "executeMigrations(beforeLogonTasks)"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
TimeMeasurePerformance.step("logOnProject", "executeMigrations(beforeLogonTasks)"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
currentMonitor = subMonitor.newChild(1, SubMonitor.SUPPRESS_NONE);
|
||||
currentMonitor.beginTask(Messages.getString("ProxyRepositoryFactory.logonInProgress"), 1); //$NON-NLS-1$
|
||||
@@ -2141,7 +2194,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
this.repositoryFactoryFromProvider.logOnProject(project);
|
||||
ProjectManager.getInstance().getLogonRecords().clear();
|
||||
// monitorWrap.worked(1);
|
||||
TimeMeasure.step("logOnProject", "logOnProject"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
TimeMeasurePerformance.step("logOnProject", "logOnProject"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
emptyTempFolder(project);
|
||||
|
||||
@@ -2157,11 +2210,6 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
|
||||
fireRepositoryPropertyChange(ERepositoryActionName.PROJECT_PREFERENCES_RELOAD.getName(), null, null);
|
||||
|
||||
if (GlobalServiceRegister.getDefault().isServiceRegistered(IUpdateService.class)) {
|
||||
IUpdateService updateService = GlobalServiceRegister.getDefault().getService(IUpdateService.class);
|
||||
updateService.syncComponentM2Jars(currentMonitor);
|
||||
}
|
||||
|
||||
IRunProcessService runProcessService = getRunProcessService();
|
||||
if (runProcessService != null) {
|
||||
runProcessService.initMavenJavaProject(monitor, project);
|
||||
@@ -2172,7 +2220,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
ProjectManager.getInstance().getMigrationRecords().clear();
|
||||
executeMigrations(project, false, currentMonitor);
|
||||
ProjectManager.getInstance().getMigrationRecords().clear();
|
||||
TimeMeasure.step("logOnProject", "executeMigrations(afterLogonTasks)"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
TimeMeasurePerformance.step("logOnProject", "executeMigrations(afterLogonTasks)"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
if (monitor != null && monitor.isCanceled()) {
|
||||
throw new OperationCanceledException(""); //$NON-NLS-1$
|
||||
}
|
||||
@@ -2188,12 +2236,12 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
// clean workspace
|
||||
currentMonitor.beginTask(Messages.getString("ProxyRepositoryFactory.cleanWorkspace"), 1); //$NON-NLS-1$
|
||||
|
||||
TimeMeasure.step("logOnProject", "clean Java project"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
TimeMeasurePerformance.step("logOnProject", "clean Java project"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
if (workspace instanceof Workspace) {
|
||||
((Workspace) workspace).getFileSystemManager().getHistoryStore().clean(currentMonitor);
|
||||
}
|
||||
TimeMeasure.step("logOnProject", "clean workspace history"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
TimeMeasurePerformance.step("logOnProject", "clean workspace history"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
currentMonitor = subMonitor.newChild(1, SubMonitor.SUPPRESS_NONE);
|
||||
currentMonitor.beginTask(Messages.getString("ProxyRepositoryFactory.synch.repo.items"), 1); //$NON-NLS-1$
|
||||
@@ -2219,12 +2267,12 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
if (monitor != null && monitor.isCanceled()) {
|
||||
throw new OperationCanceledException(""); //$NON-NLS-1$
|
||||
}
|
||||
TimeMeasure.step("logOnProject", "sync repository (routines/rules/beans)"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
TimeMeasurePerformance.step("logOnProject", "sync repository (routines/rules/beans)"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
// log4j prefs
|
||||
if (coreUiService != null && coreService != null) {
|
||||
coreService.syncLog4jSettings(null);
|
||||
TimeMeasure.step("logOnProject", "sync log4j"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
TimeMeasurePerformance.step("logOnProject", "sync log4j"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -2241,7 +2289,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
if (runProcessService != null && !isCommandLineLocalRefProject) {
|
||||
runProcessService.initializeRootPoms(monitor);
|
||||
|
||||
TimeMeasure.step("logOnProject", "install / setup root poms"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
TimeMeasurePerformance.step("logOnProject", "install / setup root poms"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
if (GlobalServiceRegister.getDefault().isServiceRegistered(ITDQRepositoryService.class)) {
|
||||
ITDQRepositoryService tdqRepositoryService = GlobalServiceRegister.getDefault()
|
||||
@@ -2258,10 +2306,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
fullLogonFinished = true;
|
||||
this.repositoryFactoryFromProvider.afterLogon(monitor);
|
||||
} finally {
|
||||
TimeMeasure.end("logOnProject"); //$NON-NLS-1$
|
||||
TimeMeasure.display = false;
|
||||
TimeMeasure.displaySteps = false;
|
||||
TimeMeasure.measureActive = false;
|
||||
TimeMeasurePerformance.end("logOnProject"); //$NON-NLS-1$
|
||||
}
|
||||
String str[] = new String[] { getRepositoryContext().getUser() + "", projectManager.getCurrentProject() + "" }; //$NON-NLS-1$ //$NON-NLS-2$
|
||||
log.info(Messages.getString("ProxyRepositoryFactory.log.loggedOn", str)); //$NON-NLS-1$
|
||||
@@ -2662,4 +2707,13 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory {
|
||||
public RepositoryWorkUnit getWorkUnitInProgress() {
|
||||
return repositoryFactoryFromProvider.getWorkUnitInProgress();
|
||||
}
|
||||
|
||||
public void executeRequiredLoginTasks(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
|
||||
ILoginTask[] allLoginTasks = LOGIN_TASK_REGISTRY_READER.getAllTaskListInstance();
|
||||
for (ILoginTask task : allLoginTasks) {
|
||||
if (task.isRequiredAlways()) {
|
||||
task.run(monitor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
<?xml version="1.0"?>
|
||||
<mapping>
|
||||
<dbms product="DATABRICKS_DELTA_LAKE" id="databricks_delta_lake_id" label="Mapping Databricks Delta Lake" default="true">
|
||||
<dbTypes>
|
||||
<dbType type="SMALLINT" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="FLOAT" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="DOUBLE" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="BIGINT" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="INT" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="TINYINT" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="STRING" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="DECIMAL" ignoreLen="false" ignorePre="false"/>
|
||||
<dbType type="BOOLEAN" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="STRUCT" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="MAP" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="ARRAY" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="TIMESTAMP" ignoreLen="true" ignorePre="true"/>
|
||||
<dbType type="DATE" ignoreLen="true" ignorePre="true"/>
|
||||
</dbTypes>
|
||||
|
||||
<language name="java">
|
||||
<talendToDbTypes><!-- Adviced mappings -->
|
||||
<talendType type="id_List"/>
|
||||
<talendType type="id_Boolean">
|
||||
<dbType type="BOOLEAN" default="true"/>
|
||||
</talendType>
|
||||
<talendType type="id_Byte">
|
||||
<dbType type="TINYINT" default="true"/>
|
||||
<dbType type="BIGINT"/>
|
||||
<dbType type="INT"/>
|
||||
<dbType type="SMALLINT"/>
|
||||
</talendType>
|
||||
<talendType type="id_byte[]"/>
|
||||
<talendType type="id_Character">
|
||||
<dbType type="STRING" default="true"/>
|
||||
</talendType>
|
||||
<talendType type="id_Date">
|
||||
<dbType type="TIMESTAMP" default="true"/>
|
||||
<dbType type="DATE"/>
|
||||
</talendType>
|
||||
<talendType type="id_BigDecimal">
|
||||
<dbType type="DECIMAL" default="true"/>
|
||||
<dbType type="BIGINT"/>
|
||||
<dbType type="FLOAT"/>
|
||||
<dbType type="DOUBLE"/>
|
||||
</talendType>
|
||||
<talendType type="id_Double">
|
||||
<dbType type="DOUBLE" default="true" />
|
||||
<dbType type="FLOAT"/>
|
||||
</talendType>
|
||||
<talendType type="id_Float">
|
||||
<dbType type="FLOAT" default="true" />
|
||||
<dbType type="DOUBLE"/>
|
||||
</talendType>
|
||||
<talendType type="id_Integer">
|
||||
<dbType type="INT" default="true" />
|
||||
<dbType type="BIGINT" />
|
||||
</talendType>
|
||||
<talendType type="id_Long">
|
||||
<dbType type="BIGINT" default="true" />
|
||||
</talendType>
|
||||
<talendType type="id_Object">
|
||||
<dbType type="STRUCT" default="true" />
|
||||
<dbType type="MAP" />
|
||||
<dbType type="ARRAY" />
|
||||
</talendType>
|
||||
<talendType type="id_Short">
|
||||
<dbType type="SMALLINT" default="true" />
|
||||
<dbType type="INT" />
|
||||
</talendType>
|
||||
<talendType type="id_String">
|
||||
<dbType type="STRING" default="true"/>
|
||||
</talendType>
|
||||
</talendToDbTypes>
|
||||
<dbToTalendTypes><!-- Adviced mappings -->
|
||||
<dbType type="STRING">
|
||||
<talendType type="id_String" default="true"/>
|
||||
</dbType>
|
||||
<dbType type="BOOLEAN">
|
||||
<talendType type="id_Boolean" default="true"/>
|
||||
</dbType>
|
||||
<dbType type="DOUBLE">
|
||||
<talendType type="id_Double" default="true"/>
|
||||
<talendType type="id_BigDecimal"/>
|
||||
<talendType type="id_Float"/>
|
||||
</dbType>
|
||||
<dbType type="DECIMAL">
|
||||
<talendType type="id_BigDecimal" default="true"/>
|
||||
</dbType>
|
||||
<dbType type="BIGINT">
|
||||
<talendType type="id_Long" default="true"/>
|
||||
<talendType type="id_Integer"/>
|
||||
</dbType>
|
||||
<dbType type="INT">
|
||||
<talendType type="id_Integer" default="true"/>
|
||||
<talendType type="id_Short"/>
|
||||
</dbType>
|
||||
<dbType type="SMALLINT">
|
||||
<talendType type="id_Short" default="true"/>
|
||||
<talendType type="id_Byte"/>
|
||||
</dbType>
|
||||
<dbType type="TINYINT">
|
||||
<talendType type="id_Byte" default="true"/>
|
||||
</dbType>
|
||||
<dbType type="FLOAT">
|
||||
<talendType type="id_Float" default="true"/>
|
||||
<talendType type="id_Double"/>
|
||||
<talendType type="id_BigDecimal"/>
|
||||
</dbType>
|
||||
<dbType type="STRUCT">
|
||||
<talendType type="id_Object" default="true"/>
|
||||
</dbType>
|
||||
<dbType type="MAP">
|
||||
<talendType type="id_Object" default="true"/>
|
||||
</dbType>
|
||||
<dbType type="ARRAY">
|
||||
<talendType type="id_Object" default="true"/>
|
||||
</dbType>
|
||||
<dbType type="TIMESTAMP">
|
||||
<talendType type="id_Date" default="true"/>
|
||||
</dbType>
|
||||
<dbType type="DATE">
|
||||
<talendType type="id_Date" default="true"/>
|
||||
</dbType>
|
||||
</dbToTalendTypes>
|
||||
</language>
|
||||
</dbms>
|
||||
</mapping>
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ public enum EDatabaseVersion4Drivers {
|
||||
|
||||
PLUSPSQL_PRIOR_TO_V9(new DbVersion4Drivers(EDatabaseTypeName.PLUSPSQL,
|
||||
"Prior to v9", "PRIOR_TO_V9", "postgresql-8.4-703.jdbc4.jar")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
PLUSPSQL_V9_X(new DbVersion4Drivers(EDatabaseTypeName.PLUSPSQL, "v9 and later", "V9_X", "postgresql-9.4-1201.jdbc41.jar")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
PLUSPSQL_V9_X(new DbVersion4Drivers(EDatabaseTypeName.PLUSPSQL, "v9 and later", "V9_X", "postgresql-42.2.14.jar")), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
IBMDB2(new DbVersion4Drivers(EDatabaseTypeName.IBMDB2, new String[] { "db2jcc4.jar", "db2jcc_license_cu.jar", //$NON-NLS-1$ //$NON-NLS-2$
|
||||
"db2jcc_license_cisuz.jar" })), //$NON-NLS-1$
|
||||
IBMDB2ZOS(new DbVersion4Drivers(EDatabaseTypeName.IBMDB2ZOS, new String[] { "db2jcc4.jar", "db2jcc_license_cu.jar", //$NON-NLS-1$ //$NON-NLS-2$
|
||||
@@ -166,7 +166,7 @@ public enum EDatabaseVersion4Drivers {
|
||||
REDSHIFT(new DbVersion4Drivers(EDatabaseTypeName.REDSHIFT, "redshift", "REDSHIFT", //$NON-NLS-1$ //$NON-NLS-2$
|
||||
"redshift-jdbc42-no-awssdk-1.2.37.1061.jar")), //$NON-NLS-1$
|
||||
REDSHIFT_SSO(new DbVersion4Drivers(EDatabaseTypeName.REDSHIFT_SSO, "redshift sso", "REDSHIFT_SSO", //$NON-NLS-1$ //$NON-NLS-2$
|
||||
new String[] { "redshift-jdbc42-no-awssdk-1.2.37.1061.jar", "aws-java-sdk-1.11.729.jar", "jackson-core-2.10.1.jar", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
new String[] { "redshift-jdbc42-no-awssdk-1.2.37.1061.jar", "aws-java-sdk-1.11.848.jar", "jackson-core-2.10.1.jar", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
"jackson-databind-2.10.1.jar", "jackson-annotations-2.10.1.jar", "httpcore-4.4.11.jar", "httpclient-4.5.9.jar", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$//$NON-NLS-4$
|
||||
"joda-time-2.8.1.jar", "commons-logging-1.2.jar", "commons-codec-1.11.jar" })), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
@@ -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$
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -779,7 +779,7 @@ public final class MetadataToolHelper {
|
||||
for (IMetadataColumn inputColumn : sourceColumns) {
|
||||
for (IMetadataColumn outputcolumn : target.getListColumns()) {
|
||||
String outputColumnName = outputcolumn.getLabel();
|
||||
if (inputColumn.getLabel().toLowerCase().equals(("" + outputColumnName).toLowerCase())) {
|
||||
if (inputColumn.getLabel().equalsIgnoreCase("" + outputColumnName)) {
|
||||
columnsToRemoveMap.put(inputColumn, outputColumnName);
|
||||
}
|
||||
if (outputcolumn.isReadOnly()) {
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
package org.talend.core.model.process;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -368,4 +369,38 @@ public class BigDataNode extends AbstractNode implements IBigDataNode {
|
||||
public void processDatasetConditions(){
|
||||
// BigDataNode does not do anything related to Dataset, only anabled from SparkNode
|
||||
}
|
||||
|
||||
public List<? extends IConnection> getIncomingConnections(EConnectionType... connectionTypes) {
|
||||
List<IConnection> conns = null;
|
||||
List<EConnectionType> types = Arrays.asList(connectionTypes);
|
||||
List<? extends IConnection> incomingConnections = this.getIncomingConnections();
|
||||
if (incomingConnections != null) {
|
||||
conns = new ArrayList<IConnection>();
|
||||
|
||||
for (int i = 0; i < incomingConnections.size(); i++) {
|
||||
IConnection connection = incomingConnections.get(i);
|
||||
if (types.contains(connection.getLineStyle())) {
|
||||
conns.add(connection);
|
||||
}
|
||||
}
|
||||
}
|
||||
return conns;
|
||||
}
|
||||
|
||||
public List<? extends IConnection> getOutgoingConnections(EConnectionType... connectionTypes) {
|
||||
List<IConnection> conns = null;
|
||||
List<EConnectionType> types = Arrays.asList(connectionTypes);
|
||||
List<? extends IConnection> incomingConnections = this.getOutgoingConnections();
|
||||
if (incomingConnections != null) {
|
||||
conns = new ArrayList<IConnection>();
|
||||
|
||||
for (int i = 0; i < incomingConnections.size(); i++) {
|
||||
IConnection connection = incomingConnections.get(i);
|
||||
if (types.contains(connection.getLineStyle())) {
|
||||
conns.add(connection);
|
||||
}
|
||||
}
|
||||
}
|
||||
return conns;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,5 +141,19 @@ public interface IBigDataNode extends INode {
|
||||
* Loading and processing should be separated because conditions can be dependent on future component (in subjob order)
|
||||
*/
|
||||
public void processDatasetConditions();
|
||||
|
||||
/**
|
||||
*
|
||||
* @param connectionTypes
|
||||
* @return connections according to multiple EConnectionType
|
||||
*/
|
||||
public List<? extends IConnection> getIncomingConnections(EConnectionType... connectionTypes);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param connectionTypes
|
||||
* @return connections according to multiple EConnectionType
|
||||
*/
|
||||
public List<? extends IConnection> getOutgoingConnections(EConnectionType... connectionTypes);
|
||||
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@ import org.talend.designer.core.model.utils.emf.talendfile.NodeType;
|
||||
import org.talend.designer.core.model.utils.emf.talendfile.ProcessType;
|
||||
import org.talend.repository.ProjectManager;
|
||||
import org.talend.repository.model.IProxyRepositoryFactory;
|
||||
import org.talend.repository.model.IRepositoryNode;
|
||||
|
||||
/**
|
||||
* This class store all relationships between jobs/joblets and other items from the repository. Be sure to update the
|
||||
@@ -223,9 +224,9 @@ public class RelationshipItemBuilder {
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Current System Routines Map, key: routine id, value: routine name
|
||||
*
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public Map<String, String> getCurrentSystemRoutinesMap() {
|
||||
@@ -929,7 +930,10 @@ public class RelationshipItemBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
private void addRelationShip(Item baseItem, String relatedId, String relatedVersion, String type) {
|
||||
public void addRelationShip(Item baseItem, String relatedId, String relatedVersion, String type) {
|
||||
if (!loaded) {
|
||||
loadRelations();
|
||||
}
|
||||
Relation relation = new Relation();
|
||||
relation.setId(baseItem.getProperty().getId());
|
||||
relation.setType(getTypeFromItem(baseItem));
|
||||
@@ -945,6 +949,30 @@ public class RelationshipItemBuilder {
|
||||
itemRelations.put(relation, new HashSet<Relation>());
|
||||
}
|
||||
itemRelations.get(relation).add(addedRelation);
|
||||
|
||||
autoSaveRelations();
|
||||
}
|
||||
|
||||
public Set<Relation> getBeanRelations(Collection<Item> items) {
|
||||
Set<Relation> relationships = new HashSet<Relation>();
|
||||
for (Item item : items) {
|
||||
Relation relation = new Relation();
|
||||
relation.setId(item.getProperty().getId());
|
||||
relation.setType(getTypeFromItem(item));
|
||||
relation.setVersion(item.getProperty().getVersion());
|
||||
|
||||
Map<Relation, Set<Relation>> itemRelations = getRelatedRelations(item);
|
||||
|
||||
Set<Relation> repositoryNode = (Set<Relation>) itemRelations.get(relation);
|
||||
|
||||
for (Relation rel : repositoryNode) {
|
||||
if (rel.getType().equals("Beans")) {
|
||||
relationships.add(rel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return relationships;
|
||||
}
|
||||
|
||||
private Map<Relation, Set<Relation>> getRelatedRelations(Item baseItem) {
|
||||
|
||||
@@ -12,13 +12,10 @@
|
||||
// ============================================================================
|
||||
package org.talend.core.service;
|
||||
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
import org.talend.core.IService;
|
||||
|
||||
public interface IUpdateService extends IService {
|
||||
|
||||
boolean checkComponentNexusUpdate();
|
||||
|
||||
void syncComponentM2Jars(IProgressMonitor monitor);
|
||||
|
||||
}
|
||||
|
||||
@@ -42,4 +42,9 @@ public abstract class AbstractLoginTask implements ILoginTask {
|
||||
return gc.getTime();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRequiredAlways() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -27,4 +27,10 @@ public interface ILoginTask {
|
||||
public boolean isCommandlineTask();
|
||||
|
||||
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException;
|
||||
|
||||
/**
|
||||
* Which indicates the task will be executed for each logon of a project, by default return false(execute only once
|
||||
* at the time of logon studio).
|
||||
*/
|
||||
boolean isRequiredAlways();
|
||||
}
|
||||
|
||||
@@ -268,12 +268,20 @@ public interface IProxyRepositoryFactory {
|
||||
|
||||
public abstract IRepositoryViewObject getLastVersion(Project project, String id, String relativeFolder,
|
||||
ERepositoryObjectType type) throws PersistenceException;
|
||||
|
||||
public abstract IRepositoryViewObject getLastVersion(String id, String folderPath, ERepositoryObjectType type) throws PersistenceException;
|
||||
|
||||
public abstract IRepositoryViewObject getLastVersion(String id, ERepositoryObjectType type) throws PersistenceException;
|
||||
|
||||
public abstract IRepositoryViewObject getLastVersion(String id, List<ERepositoryObjectType> types) throws PersistenceException;
|
||||
|
||||
public abstract IRepositoryViewObject getLastVersion(Project project, String id) throws PersistenceException;
|
||||
|
||||
public abstract IRepositoryViewObject getLastVersion(String id) throws PersistenceException;
|
||||
|
||||
public IRepositoryViewObject getLastRefVersion(Project project, String id) throws PersistenceException;
|
||||
|
||||
public IRepositoryViewObject getLastRefVersion(Project project, String id, String folderPath, ERepositoryObjectType type) throws PersistenceException;
|
||||
|
||||
public abstract IRepositoryViewObject getSpecificVersion(Project project, String id, String version, boolean avoidSaveProject)
|
||||
throws PersistenceException;
|
||||
|
||||
@@ -31,7 +31,9 @@ Require-Bundle: org.apache.commons.lang,
|
||||
org.talend.themes.core,
|
||||
ca.odell.glazedlists,
|
||||
org.talend.core,
|
||||
org.apache.commons.io
|
||||
org.apache.commons.io,
|
||||
org.apache.httpcomponents.httpcore,
|
||||
org.apache.httpcomponents.httpclient
|
||||
Import-Package: org.eclipse.jdt.internal.ui.workingsets
|
||||
Export-Package: org.talend.core.ui,
|
||||
org.talend.core.ui.actions,
|
||||
|
||||
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -75,9 +75,9 @@ public class ComponentsSettingsHelper {
|
||||
hiddenComponents.put(component.getPaletteType(), new HashMap<String, Set<String>>());
|
||||
}
|
||||
if (!component.isVisibleInComponentDefinition()) {
|
||||
hiddenComponents.get(component.getPaletteType()).put(component.getName(), new HashSet<String>());
|
||||
hiddenComponents.get(component.getPaletteType()).put(component.getDisplayName(), new HashSet<String>());
|
||||
for (String family : component.getOriginalFamilyName().split(ComponentsFactoryProvider.FAMILY_SEPARATOR_REGEX)) {
|
||||
hiddenComponents.get(component.getPaletteType()).get(component.getName()).add(family);
|
||||
hiddenComponents.get(component.getPaletteType()).get(component.getDisplayName()).add(family);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -168,8 +168,8 @@ public class ComponentsSettingsHelper {
|
||||
}
|
||||
|
||||
if (hiddenComponents.containsKey(component.getPaletteType())) {
|
||||
if (hiddenComponents.get(component.getPaletteType()).containsKey(component.getName())) {
|
||||
if (hiddenComponents.get(component.getPaletteType()).get(component.getName()).contains(family)) {
|
||||
if (hiddenComponents.get(component.getPaletteType()).containsKey(component.getDisplayName())) {
|
||||
if (hiddenComponents.get(component.getPaletteType()).get(component.getDisplayName()).contains(family)) {
|
||||
// not visible if in the hidden component list;
|
||||
return false;
|
||||
}
|
||||
@@ -225,7 +225,7 @@ public class ComponentsSettingsHelper {
|
||||
EList list = emfProject.getComponentsSettings();
|
||||
if (!list.isEmpty()) {
|
||||
list.clear();
|
||||
IRepositoryService service = (IRepositoryService) GlobalServiceRegister.getDefault().getService(
|
||||
IRepositoryService service = GlobalServiceRegister.getDefault().getService(
|
||||
IRepositoryService.class);
|
||||
|
||||
IProxyRepositoryFactory prf = service.getProxyRepositoryFactory();
|
||||
|
||||
@@ -496,7 +496,7 @@ public class SelectRepositoryContextGroupDialog extends SelectionDialog {
|
||||
for (IContext context : manager.getListContext()) {
|
||||
String contextName = context.getName();
|
||||
if (contextName != null && repContextGrpName != null
|
||||
&& contextName.toLowerCase().equals(repContextGrpName.toLowerCase())) {
|
||||
&& contextName.equalsIgnoreCase(repContextGrpName)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ public class AddRepositoryContextGroupCommand extends Command {
|
||||
if (name != null) {
|
||||
if (contextNames.contains(name.toLowerCase())
|
||||
|| (!isJobContextExistInRepository(nameSet, item.getDefaultContext())
|
||||
&& name.toLowerCase().equals(defaultContext.getName().toLowerCase()))) {
|
||||
&& name.equalsIgnoreCase(defaultContext.getName()))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -214,7 +214,7 @@ public class AddRepositoryContextGroupCommand extends Command {
|
||||
while (it.hasNext()) {
|
||||
String selectedName = it.next();
|
||||
if (selectedName != null && defaultContextName != null) {
|
||||
if (selectedName.toLowerCase().equals(defaultContextName.toLowerCase())) {
|
||||
if (selectedName.equalsIgnoreCase(defaultContextName)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,8 @@ public class ContextAutoResizeTextPainter extends TextPainter {
|
||||
|
||||
private boolean changeBackgroundColor = false;
|
||||
|
||||
private boolean containsRowName = false;
|
||||
|
||||
public ContextAutoResizeTextPainter(boolean wrapText, boolean paintBg, boolean calculate) {
|
||||
super(wrapText, paintBg, calculate);
|
||||
}
|
||||
@@ -43,6 +45,8 @@ public class ContextAutoResizeTextPainter extends TextPainter {
|
||||
super.setupGCFromConfig(gc, cellStyle);
|
||||
if (cellStyle.getAttributeValue(CellStyleAttributes.FOREGROUND_COLOR).equals(GUIHelper.COLOR_RED)) {
|
||||
gc.setForeground(GUIHelper.COLOR_BLACK);
|
||||
} else if (containsRowName) {
|
||||
gc.setForeground(GUIHelper.COLOR_RED);
|
||||
} else if (changeBackgroundColor) {
|
||||
gc.setForeground(GUIHelper.COLOR_WIDGET_DARK_SHADOW);
|
||||
}
|
||||
@@ -52,6 +56,9 @@ public class ContextAutoResizeTextPainter extends TextPainter {
|
||||
changeBackgroundColor = isChange;
|
||||
}
|
||||
|
||||
public void setContainsRowName(boolean containsRowName) {
|
||||
this.containsRowName = containsRowName;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setNewMinLength(ILayerCell cell, int contentWidth) {
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
// ============================================================================
|
||||
package org.talend.core.ui.context.nattableTree;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
|
||||
import org.eclipse.nebula.widgets.nattable.data.IDataProvider;
|
||||
import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsDataProvider;
|
||||
@@ -23,6 +28,7 @@ import org.eclipse.swt.graphics.GC;
|
||||
import org.eclipse.swt.graphics.Rectangle;
|
||||
import org.talend.core.ui.context.ContextTreeTable.ContextTreeNode;
|
||||
import org.talend.core.ui.context.model.ContextTabChildModel;
|
||||
import org.talend.core.ui.context.model.ContextTabParentModel;
|
||||
import org.talend.core.ui.context.model.table.ContextTableTabParentModel;
|
||||
|
||||
/**
|
||||
@@ -33,6 +39,8 @@ public class ContextNatTableBackGroudPainter extends BackgroundPainter {
|
||||
|
||||
private IDataProvider dataProvider;
|
||||
|
||||
private Map<String, String> rowNames = new HashMap<String, String>();
|
||||
|
||||
public ContextNatTableBackGroudPainter(ICellPainter painter, IDataProvider dataProvider) {
|
||||
super(painter);
|
||||
this.dataProvider = dataProvider;
|
||||
@@ -53,9 +61,11 @@ public class ContextNatTableBackGroudPainter extends BackgroundPainter {
|
||||
ContextTabChildModel rowChildModel = (ContextTabChildModel) rowNode.getTreeData();
|
||||
if (rowChildModel != null) {
|
||||
((ContextAutoResizeTextPainter) getWrappedPainter()).setChangeBackgroundColor(true);
|
||||
checkContainsRowName(rowNode, rowChildModel);
|
||||
}
|
||||
}
|
||||
super.paintCell(cell, gc, bounds, configRegistry);
|
||||
((ContextAutoResizeTextPainter) getWrappedPainter()).setContainsRowName(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -63,4 +73,33 @@ public class ContextNatTableBackGroudPainter extends BackgroundPainter {
|
||||
return super.getBackgroundColour(cell, configRegistry);
|
||||
}
|
||||
|
||||
private void checkContainsRowName(ContextTreeNode rowNode, ContextTabChildModel rowChildModel) {
|
||||
// Check any duplicate / similar variable from different context to show in red .
|
||||
String rowName = rowNode.getName();
|
||||
String parentSourceName = null;
|
||||
ContextTabParentModel rowTabParentModel = rowChildModel.getParent();
|
||||
if (rowTabParentModel != null && rowTabParentModel instanceof ContextTableTabParentModel) {
|
||||
ContextTableTabParentModel rowTableTabParentModel = (ContextTableTabParentModel) rowTabParentModel;
|
||||
parentSourceName = rowTableTabParentModel.getSourceName();
|
||||
}
|
||||
if (StringUtils.isNotBlank(rowName) && StringUtils.isNotBlank(parentSourceName)) {
|
||||
rowName = rowName.toUpperCase();
|
||||
parentSourceName = parentSourceName.toUpperCase();
|
||||
if (rowNames.containsValue(rowName)) {
|
||||
Iterator<String> iterator = rowNames.keySet().iterator();
|
||||
while (iterator.hasNext()) {
|
||||
String key = iterator.next();
|
||||
String value = rowNames.get(key);
|
||||
if (rowName.equalsIgnoreCase(value)) {
|
||||
if (!parentSourceName.equalsIgnoreCase(key)) {
|
||||
((ContextAutoResizeTextPainter) getWrappedPainter()).setContainsRowName(true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
rowNames.put(parentSourceName, rowName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,10 +124,10 @@ public class MetadataEmfTableEditor extends ExtendedTableModel<MetadataColumn> {
|
||||
for (int i = 0; i < lstSize; i++) {
|
||||
if (columnName.equals(metadataColumns.get(i).getLabel()) && i != beanPosition) {
|
||||
return Messages.getString("MetadataEmfTableEditor.ColumnNameExists", columnName); //$NON-NLS-1$
|
||||
} else if (columnName.toLowerCase().equals(metadataColumns.get(i).getLabel().toLowerCase()) && i != beanPosition) {
|
||||
} else if (columnName.equalsIgnoreCase(metadataColumns.get(i).getLabel()) && i != beanPosition) {
|
||||
String index = columnName.substring(0, 1);
|
||||
String last = metadataColumns.get(i).getLabel().substring(0, 1);
|
||||
if (index.toLowerCase().equals(last.toLowerCase())) {
|
||||
if (index.equalsIgnoreCase(last)) {
|
||||
return Messages.getString("MetadataTableEditor.ColumnNameIsInvalid", columnName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,10 +113,10 @@ public class MetadataTableEditor extends ExtendedTableModel<IMetadataColumn> {
|
||||
for (int i = 0; i < lstSize; i++) {
|
||||
if (columnName.equals(getBeansList().get(i).getLabel()) && i != beanPosition) {
|
||||
return Messages.getString("MetadataTableEditor.ColumnNameExists", columnName); //$NON-NLS-1$
|
||||
} else if (columnName.toLowerCase().equals(getBeansList().get(i).getLabel().toLowerCase()) && i != beanPosition) {
|
||||
} else if (columnName.equalsIgnoreCase(getBeansList().get(i).getLabel()) && i != beanPosition) {
|
||||
String index = columnName.substring(0, 1);
|
||||
String last = getBeansList().get(i).getLabel().substring(0, 1);
|
||||
if (index.toLowerCase().equals(last.toLowerCase())) {
|
||||
if (index.equalsIgnoreCase(last)) {
|
||||
return Messages.getString("MetadataTableEditor.ColumnNameIsInvalid", columnName); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,15 +14,39 @@ package org.talend.core.ui.token;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.net.Authenticator;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.PasswordAuthentication;
|
||||
import java.net.Proxy;
|
||||
import java.net.Proxy.Type;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpHost;
|
||||
import org.apache.http.StatusLine;
|
||||
import org.apache.http.auth.AuthScope;
|
||||
import org.apache.http.auth.UsernamePasswordCredentials;
|
||||
import org.apache.http.client.config.RequestConfig;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.client.protocol.HttpClientContext;
|
||||
import org.apache.http.entity.mime.MultipartEntityBuilder;
|
||||
import org.apache.http.entity.mime.content.ByteArrayBody;
|
||||
import org.apache.http.impl.client.BasicCredentialsProvider;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClientBuilder;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.apache.log4j.Level;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.apache.log4j.Priority;
|
||||
@@ -37,17 +61,13 @@ import org.eclipse.jface.preference.IPreferenceStore;
|
||||
import org.eclipse.ui.preferences.ScopedPreferenceStore;
|
||||
import org.talend.commons.exception.ExceptionHandler;
|
||||
import org.talend.commons.utils.network.NetworkUtil;
|
||||
import org.talend.commons.utils.network.TalendProxySelector;
|
||||
import org.talend.core.GlobalServiceRegister;
|
||||
import org.talend.core.prefs.ITalendCorePrefConstants;
|
||||
import org.talend.core.ui.CoreUIPlugin;
|
||||
import org.talend.core.ui.branding.IBrandingService;
|
||||
|
||||
import us.monoid.json.JSONObject;
|
||||
import us.monoid.web.AbstractContent;
|
||||
import us.monoid.web.FormData;
|
||||
import us.monoid.web.Resty;
|
||||
import us.monoid.web.TextResource;
|
||||
import us.monoid.web.mime.MultipartContent;
|
||||
|
||||
/**
|
||||
* ggu class global comment. Detailled comment
|
||||
@@ -219,7 +239,7 @@ public final class TokenCollectorFactory {
|
||||
boolean isPoweredbyTalend = false;
|
||||
|
||||
if (GlobalServiceRegister.getDefault().isServiceRegistered(IBrandingService.class)) {
|
||||
IBrandingService service = (IBrandingService) GlobalServiceRegister.getDefault().getService(IBrandingService.class);
|
||||
IBrandingService service = GlobalServiceRegister.getDefault().getService(IBrandingService.class);
|
||||
isPoweredbyTalend = service.isPoweredbyTalend();
|
||||
}
|
||||
if (isPoweredbyTalend) {
|
||||
@@ -228,26 +248,18 @@ public final class TokenCollectorFactory {
|
||||
@Override
|
||||
protected IStatus run(IProgressMonitor monitor) {
|
||||
if (NetworkUtil.isNetworkValid()) {
|
||||
Authenticator defaultAuth = NetworkUtil.getDefaultAuthenticator();
|
||||
try {
|
||||
JSONObject tokenInfors = collectTokenInfors();
|
||||
Resty r = new Resty();
|
||||
// set back the rath for Resty.
|
||||
Field rathField = Resty.class.getDeclaredField("rath"); //$NON-NLS-1$
|
||||
rathField.setAccessible(true);
|
||||
Authenticator auth = (Authenticator) rathField.get(null);
|
||||
Authenticator.setDefault(auth);
|
||||
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
GZIPOutputStream gzos = new GZIPOutputStream(baos);
|
||||
gzos.write(tokenInfors.toString().getBytes());
|
||||
gzos.close();
|
||||
AbstractContent ac = Resty.content(baos.toByteArray());
|
||||
byte[] data = baos.toByteArray();
|
||||
baos.close();
|
||||
MultipartContent mpc = Resty.form(new FormData("data", ac)); //$NON-NLS-1$
|
||||
|
||||
TextResource result = r.text("https://www.talend.com/TalendRegisterWS/tokenstudio_v2.php", mpc); //$NON-NLS-1$
|
||||
String resultStr = new JSONObject(result.toString()).getString("result"); //$NON-NLS-1$
|
||||
String responseString = sendData(data);
|
||||
String resultStr = new JSONObject(responseString).getString("result"); //$NON-NLS-1$
|
||||
boolean okReturned = (resultStr != null && resultStr.endsWith("OK")); //$NON-NLS-1$
|
||||
if (okReturned) {
|
||||
// set new days
|
||||
@@ -267,7 +279,6 @@ public final class TokenCollectorFactory {
|
||||
} catch (Exception e) {
|
||||
ExceptionHandler.process(e);
|
||||
} finally {
|
||||
Authenticator.setDefault(defaultAuth);
|
||||
}
|
||||
}
|
||||
return org.eclipse.core.runtime.Status.OK_STATUS;
|
||||
@@ -288,4 +299,84 @@ public final class TokenCollectorFactory {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addProxy(String url, HttpClientBuilder clientBuilder) throws URISyntaxException {
|
||||
TalendProxySelector proxySelector = TalendProxySelector.getInstance();
|
||||
final List<Proxy> proxyList = proxySelector.getDefaultProxySelector().select(new URI(url));
|
||||
Proxy usedProxy = null;
|
||||
if (proxyList != null && !proxyList.isEmpty()) {
|
||||
usedProxy = proxyList.get(0);
|
||||
}
|
||||
|
||||
if (usedProxy != null) {
|
||||
if (!Type.DIRECT.equals(usedProxy.type())) {
|
||||
final Proxy finalProxy = usedProxy;
|
||||
InetSocketAddress address = (InetSocketAddress) finalProxy.address();
|
||||
String proxyServer = address.getHostString();
|
||||
int proxyPort = address.getPort();
|
||||
PasswordAuthentication proxyAuthentication = proxySelector.getHttpPasswordAuthentication();
|
||||
if (proxyAuthentication != null) {
|
||||
String proxyUser = proxyAuthentication.getUserName();
|
||||
if (StringUtils.isNotBlank(proxyUser)) {
|
||||
String proxyPassword = "";
|
||||
char[] passwordChars = proxyAuthentication.getPassword();
|
||||
if (passwordChars != null) {
|
||||
proxyPassword = new String(passwordChars);
|
||||
}
|
||||
BasicCredentialsProvider credProvider = new BasicCredentialsProvider();
|
||||
credProvider.setCredentials(new AuthScope(proxyServer, proxyPort),
|
||||
new UsernamePasswordCredentials(proxyUser, proxyPassword));
|
||||
clientBuilder.setDefaultCredentialsProvider(credProvider);
|
||||
}
|
||||
}
|
||||
HttpHost proxyHost = new HttpHost(proxyServer, proxyPort);
|
||||
clientBuilder.setProxy(proxyHost);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private String sendData(byte[] data) throws Exception {
|
||||
CloseableHttpClient client = null;
|
||||
CloseableHttpResponse response = null;
|
||||
try {
|
||||
final String url = "https://www.talend.com/TalendRegisterWS/tokenstudio_v2.php";
|
||||
|
||||
HttpClientBuilder clientBuilder = HttpClients.custom();
|
||||
clientBuilder.disableCookieManagement();
|
||||
addProxy(url, clientBuilder);
|
||||
client = clientBuilder.build();
|
||||
|
||||
HttpPost httpPost = new HttpPost(url);
|
||||
httpPost.setConfig(RequestConfig.DEFAULT);
|
||||
|
||||
MultipartEntityBuilder dataBuilder = MultipartEntityBuilder.create();
|
||||
dataBuilder.addPart("data", new ByteArrayBody(data, null));
|
||||
HttpEntity reqEntity = dataBuilder.build();
|
||||
httpPost.setEntity(reqEntity);
|
||||
|
||||
response = client.execute(httpPost, HttpClientContext.create());
|
||||
StatusLine statusLine = response.getStatusLine();
|
||||
String responseStr = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
|
||||
if (HttpURLConnection.HTTP_OK != statusLine.getStatusCode()) {
|
||||
throw new Exception(statusLine.toString() + ", server message: [" + responseStr + "]");
|
||||
}
|
||||
return responseStr;
|
||||
} finally {
|
||||
if (response != null) {
|
||||
try {
|
||||
response.close();
|
||||
} catch (Throwable e) {
|
||||
ExceptionHandler.process(e);
|
||||
}
|
||||
}
|
||||
if (client != null) {
|
||||
try {
|
||||
client.close();
|
||||
} catch (Throwable e) {
|
||||
ExceptionHandler.process(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.9 KiB |
@@ -9,6 +9,7 @@ package org.talend.datatools.xml.utils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* This class is a Utility class which is used to help UI to populate the list of possible XPath Expressions.
|
||||
@@ -89,7 +90,7 @@ final public class XPathPopulationUtil {
|
||||
}
|
||||
String tempRootPath = rootPath + UtilConstants.XPATH_SLASH;
|
||||
if (columnPath.startsWith(tempRootPath)) {
|
||||
return columnPath.replaceFirst("\\Q" + rootPath + "\\E", "");
|
||||
return columnPath.replaceFirst(Pattern.quote(rootPath), "");
|
||||
} else {
|
||||
return getXPathExpression(rootPath, columnPath);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<dependency>
|
||||
<groupId>org.apache.maven.surefire</groupId>
|
||||
<artifactId>surefire-junit4</artifactId>
|
||||
<version>2.12.4</version>
|
||||
<version>2.20</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hamcrest</groupId>
|
||||
@@ -23,7 +23,7 @@
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.10</version>
|
||||
<version>4.13</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<artifactId>studio-tacokit-dependencies</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<properties>
|
||||
<tacokit.components.version>1.11.0-SNAPSHOT</tacokit.components.version>
|
||||
<tacokit.components.version>1.14.0-SNAPSHOT</tacokit.components.version>
|
||||
</properties>
|
||||
<repositories>
|
||||
<repository>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<properties>
|
||||
<tcomp.version>1.1.15</tcomp.version>
|
||||
<tcomp.version>1.1.25</tcomp.version>
|
||||
<slf4j.version>1.7.25</slf4j.version>
|
||||
</properties>
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ import static org.talend.designer.maven.model.TalendJavaProjectConstants.*;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
@@ -328,26 +329,10 @@ public class AggregatorPomsHelper {
|
||||
}
|
||||
|
||||
public static void addToParentModules(IFile pomFile, Property property, boolean checkFilter) throws Exception {
|
||||
// Check relation for ESB service job, should not be added into main pom
|
||||
if (property != null) {
|
||||
List<Relation> relations = RelationshipItemBuilder.getInstance().getItemsRelatedTo(property.getId(),
|
||||
property.getVersion(), RelationshipItemBuilder.JOB_RELATION);
|
||||
for (Relation relation : relations) {
|
||||
if (RelationshipItemBuilder.SERVICES_RELATION.equals(relation.getType())) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!checkIfCanAddToParentModules(property, checkFilter)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (checkFilter) {
|
||||
if (GlobalServiceRegister.getDefault().isServiceRegistered(IFilterService.class)) {
|
||||
IFilterService filterService = (IFilterService) GlobalServiceRegister.getDefault()
|
||||
.getService(IFilterService.class);
|
||||
if (property != null && !filterService.isFilterAccepted(property.getItem(), PomIdsHelper.getPomFilter())) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
IFile parentPom = getParentModulePomFile(pomFile);
|
||||
if (parentPom != null) {
|
||||
if (!parentPom.isSynchronized(IResource.DEPTH_ZERO)) {
|
||||
@@ -367,6 +352,36 @@ public class AggregatorPomsHelper {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean checkIfCanAddToParentModules(Property property, boolean checkFilter) {
|
||||
// Check relation for ESB service job, should not be added into main pom
|
||||
if (property != null) {
|
||||
List<Relation> relations = RelationshipItemBuilder.getInstance().getItemsRelatedTo(property.getId(),
|
||||
property.getVersion(), RelationshipItemBuilder.JOB_RELATION);
|
||||
for (Relation relation : relations) {
|
||||
if (RelationshipItemBuilder.SERVICES_RELATION.equals(relation.getType())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// for import won't add for exclude option
|
||||
if (property.getItem() != null && property.getItem().getState() != null && property.getItem().getState().isDeleted()
|
||||
&& PomIdsHelper.getIfExcludeDeletedItems(property)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (checkFilter) {
|
||||
if (GlobalServiceRegister.getDefault().isServiceRegistered(IFilterService.class)) {
|
||||
IFilterService filterService = (IFilterService) GlobalServiceRegister.getDefault()
|
||||
.getService(IFilterService.class);
|
||||
if (property != null && !filterService.isFilterAccepted(property.getItem(), PomIdsHelper.getPomFilter())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void removeFromParentModules(IFile pomFile) throws Exception {
|
||||
IFile parentPom = getParentModulePomFile(pomFile);
|
||||
if (parentPom != null) {
|
||||
@@ -384,6 +399,69 @@ public class AggregatorPomsHelper {
|
||||
}
|
||||
}
|
||||
|
||||
public static void removeAllVersionsFromParentModules(Property property) throws Exception {
|
||||
IFile parentPom = getParentModulePomFile(
|
||||
AggregatorPomsHelper.getItemPomFolder(property).getFile(TalendMavenConstants.POM_FILE_NAME));
|
||||
if (parentPom == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<String> relativePathList = new ArrayList<String>();
|
||||
List<IRepositoryViewObject> allVersion = ProxyRepositoryFactory.getInstance().getAllVersion(property.getId());
|
||||
for (IRepositoryViewObject object : allVersion) {
|
||||
IFile pomFile = AggregatorPomsHelper.getItemPomFolder(object.getProperty())
|
||||
.getFile(TalendMavenConstants.POM_FILE_NAME);
|
||||
String relativePath = pomFile.getParent().getLocation().makeRelativeTo(parentPom.getParent().getLocation())
|
||||
.toPortableString();
|
||||
if (StringUtils.isNotBlank(relativePath)) {
|
||||
relativePathList.add(relativePath);
|
||||
}
|
||||
}
|
||||
|
||||
Model model = MavenPlugin.getMaven().readModel(parentPom.getContents());
|
||||
List<String> modules = model.getModules();
|
||||
if (modules != null && modules.size() > 0) {
|
||||
modules.removeAll(relativePathList);
|
||||
PomUtil.savePom(null, model, parentPom);
|
||||
}
|
||||
}
|
||||
|
||||
public static void restoreAllVersionsFromParentModules(Property property) throws Exception {
|
||||
IFile parentPom = getParentModulePomFile(
|
||||
AggregatorPomsHelper.getItemPomFolder(property).getFile(TalendMavenConstants.POM_FILE_NAME));
|
||||
if (parentPom == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<String> relativePathList = new ArrayList<String>();
|
||||
Model model = MavenPlugin.getMaven().readModel(parentPom.getContents());
|
||||
List<String> modules = model.getModules();
|
||||
if (modules == null) {
|
||||
modules = new ArrayList<>();
|
||||
model.setModules(modules);
|
||||
}
|
||||
|
||||
List<IRepositoryViewObject> allVersion = ProxyRepositoryFactory.getInstance().getAllVersion(property.getId());
|
||||
for (IRepositoryViewObject object : allVersion) {
|
||||
Property itemProperty = object.getProperty();
|
||||
if (!checkIfCanAddToParentModules(itemProperty, true)) {
|
||||
continue;
|
||||
}
|
||||
IFile pomFile = AggregatorPomsHelper.getItemPomFolder(object.getProperty(), object.getVersion())
|
||||
.getFile(TalendMavenConstants.POM_FILE_NAME);
|
||||
|
||||
String relativePath = pomFile.getParent().getLocation().makeRelativeTo(parentPom.getParent().getLocation())
|
||||
.toPortableString();
|
||||
if (StringUtils.isNoneBlank(relativePath) && !modules.contains(relativePath)) {
|
||||
relativePathList.add(relativePath);
|
||||
}
|
||||
}
|
||||
Collections.sort(relativePathList);
|
||||
modules.addAll(relativePathList);
|
||||
PomUtil.savePom(null, model, parentPom);
|
||||
|
||||
}
|
||||
|
||||
private static IFile getParentModulePomFile(IFile pomFile) {
|
||||
IFile parentPom = null;
|
||||
if (pomFile == null || pomFile.getParent() == null || pomFile.getParent().getParent() == null) {
|
||||
@@ -538,7 +616,10 @@ public class AggregatorPomsHelper {
|
||||
String jobFolderName = getJobProjectFolderName(property.getLabel(), version);
|
||||
ERepositoryObjectType type = ERepositoryObjectType.getItemType(property.getItem());
|
||||
IFolder jobFolder = helper.getProcessFolder(type).getFolder(itemRelativePath).getFolder(jobFolderName);
|
||||
createFoldersIfNeeded(jobFolder);
|
||||
List<ERepositoryObjectType> allTypesOfProcess2 = ERepositoryObjectType.getAllTypesOfProcess2();
|
||||
if (allTypesOfProcess2.contains(type)) {
|
||||
createFoldersIfNeeded(jobFolder);
|
||||
}
|
||||
return jobFolder;
|
||||
}
|
||||
|
||||
|
||||
@@ -395,4 +395,25 @@ public class BuildCacheManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean containsMultipleVersionModules() {
|
||||
return containsMultipleVersionModules(currentJobletmodules) || containsMultipleVersionModules(currentJobmodules);
|
||||
}
|
||||
|
||||
private static boolean containsMultipleVersionModules(Set<String> mods) {
|
||||
Set<String> joblets = new HashSet<String>();
|
||||
for (String mod : mods) {
|
||||
int idx = mod.lastIndexOf('_');
|
||||
if (idx == -1) {
|
||||
continue;
|
||||
}
|
||||
String jobletWithoutVersion = mod.substring(0, idx);
|
||||
if (joblets.contains(jobletWithoutVersion)) {
|
||||
return true;
|
||||
} else {
|
||||
joblets.add(jobletWithoutVersion);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 609 B |
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@@ -1,28 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>org.talend.libraries.jdbc.postgresql</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.pde.ManifestBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.pde.SchemaBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.pde.PluginNature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -1,7 +0,0 @@
|
||||
Manifest-Version: 1.0
|
||||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: Postgresql Plug-in
|
||||
Bundle-SymbolicName: org.talend.libraries.jdbc.postgresql
|
||||
Bundle-Version: 7.4.1.qualifier
|
||||
Bundle-Vendor: .Talend SA.
|
||||
Eclipse-BundleShape: dir
|
||||
@@ -1 +0,0 @@
|
||||
jarprocessor.exclude.children=true
|
||||
@@ -1,5 +0,0 @@
|
||||
output.. = bin/
|
||||
bin.includes = META-INF/,\
|
||||
.,\
|
||||
lib/postgresql-8.4-703.jdbc4.jar,\
|
||||
lib/postgresql-9.4-1201.jdbc41.jar
|
||||
@@ -1,30 +0,0 @@
|
||||
BSD License
|
||||
|
||||
The PostgreSQL JDBC driver is distributed under the BSD license, same as the server. The simplest explanation of the licensing terms is that you can do whatever you want with the product and source code as long as you don't claim you wrote it or sue us. You should give it a read though, it's only half a page.
|
||||
|
||||
Copyright (c) 1997-2008, PostgreSQL Global Development Group
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
3. Neither the name of the PostgreSQL Global Development Group nor the names
|
||||
of its contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -1,12 +0,0 @@
|
||||
<?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">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.talend.studio</groupId>
|
||||
<artifactId>tcommon-studio-se</artifactId>
|
||||
<version>7.4.1-SNAPSHOT</version>
|
||||
<relativePath>../../../</relativePath>
|
||||
</parent>
|
||||
<artifactId>org.talend.libraries.jdbc.postgresql</artifactId>
|
||||
<packaging>eclipse-plugin</packaging>
|
||||
</project>
|
||||
@@ -40,6 +40,7 @@ import org.talend.core.GlobalServiceRegister;
|
||||
import org.talend.core.ILibraryManagerService;
|
||||
import org.talend.core.model.general.ModuleNeeded;
|
||||
import org.talend.librariesmanager.model.ModulesNeededProvider;
|
||||
import org.talend.librariesmanager.model.service.CustomUriManager;
|
||||
import org.talend.librariesmanager.ui.dialogs.CustomURITextCellEditor;
|
||||
import org.talend.librariesmanager.ui.dialogs.InstallModuleDialog;
|
||||
import org.talend.librariesmanager.ui.i18n.Messages;
|
||||
@@ -298,6 +299,7 @@ public class ModulesViewComposite extends Composite {
|
||||
* @see org.talend.designer.codegen.perlmodule.ui.views.IModulesViewComposite#refresh()
|
||||
*/
|
||||
public void refresh() {
|
||||
CustomUriManager.getInstance().setForeceReloadCustomUri();
|
||||
List<ModuleNeeded> modulesNeeded = new ArrayList<ModuleNeeded>();
|
||||
modulesNeeded.addAll(ModulesNeededProvider.getAllManagedModules());
|
||||
ModulesViewComposite.getTableViewerCreator().init(modulesNeeded);
|
||||
|
||||
@@ -34,6 +34,9 @@ import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
@@ -45,6 +48,7 @@ import org.eclipse.jface.operation.IRunnableWithProgress;
|
||||
import org.talend.commons.CommonsPlugin;
|
||||
import org.talend.commons.exception.ExceptionHandler;
|
||||
import org.talend.commons.utils.network.NetworkUtil;
|
||||
import org.talend.commons.utils.threading.TalendCustomThreadPoolExecutor;
|
||||
import org.talend.core.GlobalServiceRegister;
|
||||
import org.talend.core.ILibraryManagerService;
|
||||
import org.talend.core.model.general.ModuleNeeded;
|
||||
@@ -96,6 +100,8 @@ public class RemoteModulesHelper {
|
||||
*/
|
||||
private final Map<String, List<ModuleNeeded>> contextMap;
|
||||
|
||||
private TalendCustomThreadPoolExecutor threadPool = null;
|
||||
|
||||
/**
|
||||
*
|
||||
* DOC wchen RemoteModulesFetchRunnable constructor comment.
|
||||
@@ -112,6 +118,17 @@ public class RemoteModulesHelper {
|
||||
this.onlyUseLocalLicenseData = onlyUseLocalLicenseData;
|
||||
}
|
||||
|
||||
public TalendCustomThreadPoolExecutor getThreadPool() {
|
||||
if (threadPool != null) {
|
||||
return threadPool;
|
||||
}
|
||||
synchronized (this) {
|
||||
threadPool = new TalendCustomThreadPoolExecutor(50, 100, 0, TimeUnit.MILLISECONDS,
|
||||
new ArrayBlockingQueue<Runnable>(200), new ThreadPoolExecutor.CallerRunsPolicy());
|
||||
}
|
||||
return threadPool;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
|
||||
final Set<String> mavenUrisTofetch = new HashSet<String>(contextMap.keySet());
|
||||
@@ -260,24 +277,36 @@ public class RemoteModulesHelper {
|
||||
}
|
||||
|
||||
private void searchFromRemoteNexus(Set<String> mavenUristoSearch, IProgressMonitor monitor) {
|
||||
LibraryDataService service = LibraryDataService.getInstance();
|
||||
List<MavenArtifact> artifactList = new ArrayList<MavenArtifact>();
|
||||
final Iterator<String> iterator = mavenUristoSearch.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
if (monitor.isCanceled()) {
|
||||
break;
|
||||
}
|
||||
String uriToCheck = iterator.next();
|
||||
final MavenArtifact parseMvnUrl = MavenUrlHelper.parseMvnUrl(uriToCheck);
|
||||
if (parseMvnUrl != null) {
|
||||
service.fillLibraryDataByRemote(uriToCheck, parseMvnUrl);
|
||||
if (!MavenConstants.DOWNLOAD_MANUAL.equals(parseMvnUrl.getDistribution())) {
|
||||
artifactList.add(parseMvnUrl);
|
||||
try {
|
||||
LibraryDataService service = LibraryDataService.getInstance();
|
||||
List<MavenArtifact> artifactList = Collections.synchronizedList(new ArrayList<MavenArtifact>());
|
||||
final Iterator<String> iterator = mavenUristoSearch.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
if (monitor.isCanceled()) {
|
||||
break;
|
||||
}
|
||||
Runnable runnable = new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
String uriToCheck = iterator.next();
|
||||
final MavenArtifact parseMvnUrl = MavenUrlHelper.parseMvnUrl(uriToCheck);
|
||||
if (parseMvnUrl != null) {
|
||||
service.fillLibraryDataByRemote(uriToCheck, parseMvnUrl);
|
||||
if (!MavenConstants.DOWNLOAD_MANUAL.equals(parseMvnUrl.getDistribution())) {
|
||||
artifactList.add(parseMvnUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
getThreadPool().execute(runnable);
|
||||
}
|
||||
service.saveData();
|
||||
addModulesToCache(mavenUristoSearch, artifactList, remoteCache);
|
||||
} finally {
|
||||
getThreadPool().clearThreads();
|
||||
threadPool = null;
|
||||
}
|
||||
service.saveData();
|
||||
addModulesToCache(mavenUristoSearch, artifactList, remoteCache);
|
||||
}
|
||||
|
||||
private void addModulesToCache(Set<String> mavenUristoSearch, List<MavenArtifact> searchResults,
|
||||
@@ -641,7 +670,7 @@ public class RemoteModulesHelper {
|
||||
public RemoteModulesFetchRunnable getNotInstalledModulesRunnable(List<ModuleNeeded> neededModules,
|
||||
List<ModuleToInstall> toInstall, boolean collectModulesWithJarName, boolean useLocalLicenseData, boolean onlyUseLocalLicenseData) {
|
||||
Map<String, List<ModuleNeeded>> contextMap = new HashMap<String, List<ModuleNeeded>>();
|
||||
ILibraryManagerService librairesManagerService = (ILibraryManagerService) GlobalServiceRegister.getDefault()
|
||||
ILibraryManagerService librairesManagerService = GlobalServiceRegister.getDefault()
|
||||
.getService(ILibraryManagerService.class);
|
||||
// collect mvnuri and modules incase many modules have the same mvnuri
|
||||
final Iterator<ModuleNeeded> iterator = neededModules.iterator();
|
||||
|
||||
@@ -128,7 +128,7 @@ public class GetJarsToRegister {
|
||||
line = line.replace(libStringFinder, replacement);
|
||||
} else if (line.toLowerCase().contains(libStringFinder2)) {
|
||||
line = line.toLowerCase().replace(libStringFinder2, replacement);
|
||||
} else if (line.toLowerCase().equals(jarName)) {
|
||||
} else if (line.equalsIgnoreCase(jarName)) {
|
||||
line = replacement;
|
||||
} else if (line.contains(":$ROOT_PATH/" + jarName + ":")) {
|
||||
line = line.replace(":$ROOT_PATH/" + jarName + ":", ":$ROOT_PATH/" + replacement + ":");
|
||||
|
||||
@@ -100,6 +100,9 @@ public class ResumeUtil {
|
||||
csvWriter.write("dynamicData");// dynamicData
|
||||
csvWriter.endRecord();
|
||||
csvWriter.flush();
|
||||
csvWriter.close();
|
||||
//To avoid use File.delete() as it cannot make sure file being deleted.
|
||||
this.csvWriter = new SimpleCsvWriter(new FileWriter(logFileName, true));
|
||||
}
|
||||
} else {
|
||||
csvWriter = sharedWriter;
|
||||
|
||||
@@ -993,7 +993,7 @@ public class ModulesNeededProvider {
|
||||
public static List<ModuleNeeded> getModulesNeeded(String componentName) {
|
||||
List<ModuleNeeded> toReturn = new ArrayList<ModuleNeeded>();
|
||||
for (ModuleNeeded current : getModulesNeeded()) {
|
||||
if (current.getContext().equals(componentName)) {
|
||||
if (componentName.equals(current.getContext())) {
|
||||
toReturn.add(current);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -318,4 +318,8 @@ public abstract class AbstractLibrariesService implements ILibrariesService {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setForceReloadCustomUri() {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,8 @@ public class CustomUriManager {
|
||||
private static final String CUSTOM_URI_MAP = "custom_uri_mapping.json";
|
||||
|
||||
private static long lastModified = 0;
|
||||
|
||||
private static boolean isNeedReload = false;
|
||||
|
||||
private CustomUriManager() {
|
||||
try {
|
||||
@@ -159,15 +161,19 @@ public class CustomUriManager {
|
||||
try {
|
||||
File file = new File(getResourcePath(), CUSTOM_URI_MAP);
|
||||
long modifyDate = file.lastModified();
|
||||
if (modifyDate > lastModified) {
|
||||
if (isNeedReload || modifyDate > lastModified) {
|
||||
customURIObject.clear();
|
||||
JSONObject loadResources = loadResources(getResourcePath(), CUSTOM_URI_MAP);
|
||||
customURIObject.putAll(loadResources);
|
||||
lastModified = modifyDate;
|
||||
isNeedReload = false;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
ExceptionHandler.process(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void setForeceReloadCustomUri() {
|
||||
isNeedReload = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,5 +267,9 @@ public class LibrariesService implements ILibrariesService {
|
||||
public void deployLibrary(URL source, String mavenUri, boolean refresh, boolean updateNexusJar) throws IOException {
|
||||
getLibrariesService().deployLibrary(source, mavenUri, refresh, updateNexusJar);
|
||||
}
|
||||
|
||||
public void setForceReloadCustomUri() {
|
||||
CustomUriManager.getInstance().setForeceReloadCustomUri();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -82,6 +82,7 @@ import org.talend.core.runtime.services.IMavenUIService;
|
||||
import org.talend.core.utils.TalendQuoteUtils;
|
||||
import org.talend.designer.maven.tools.BuildCacheManager;
|
||||
import org.talend.designer.maven.utils.PomUtil;
|
||||
import org.talend.designer.runprocess.IRunProcessService;
|
||||
import org.talend.librariesmanager.maven.MavenArtifactsHandler;
|
||||
import org.talend.librariesmanager.model.ExtensionModuleManager;
|
||||
import org.talend.librariesmanager.model.ModulesNeededProvider;
|
||||
@@ -1054,7 +1055,13 @@ public class LocalLibraryManager implements ILibraryManagerService, IChangedLibr
|
||||
MavenArtifact ma = MavenUrlHelper.parseMvnUrl(mvnUri);
|
||||
if (ma != null) {
|
||||
String repositoryUrl = ma.getRepositoryUrl();
|
||||
if (repositoryUrl == null || repositoryUrl.trim().isEmpty()
|
||||
boolean isCIMode = false;
|
||||
if (GlobalServiceRegister.getDefault().isServiceRegistered(IRunProcessService.class)) {
|
||||
IRunProcessService runProcessService = GlobalServiceRegister.getDefault()
|
||||
.getService(IRunProcessService.class);
|
||||
isCIMode = runProcessService.isCIMode();
|
||||
}
|
||||
if (isCIMode || repositoryUrl == null || repositoryUrl.trim().isEmpty()
|
||||
|| MavenConstants.LOCAL_RESOLUTION_URL.equalsIgnoreCase(repositoryUrl)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1597,7 +1597,7 @@ public final class ConnectionContextHelper {
|
||||
ContextType contextType = null;
|
||||
List<ContextType> contextTypeList = contextItem.getContext();
|
||||
for (ContextType contye : contextTypeList) {
|
||||
if (context.getName() != null && contye.getName().toLowerCase().equals(context.getName().toLowerCase())) {
|
||||
if (context.getName() != null && contye.getName().equalsIgnoreCase(context.getName())) {
|
||||
contextType = contye;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,8 @@ import java.util.Map;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.talend.commons.exception.ExceptionHandler;
|
||||
import org.talend.commons.exception.PersistenceException;
|
||||
import org.talend.core.GlobalServiceRegister;
|
||||
import org.talend.core.ITDQRepositoryService;
|
||||
import org.talend.core.database.EDatabaseTypeName;
|
||||
import org.talend.core.database.conn.DatabaseConnStrUtil;
|
||||
import org.talend.core.hadoop.IHadoopClusterService;
|
||||
@@ -100,7 +102,8 @@ public class SwitchContextGroupNameImpl implements ISwitchContext {
|
||||
newContextName = newContextType == null ? null : newContextType.getName();
|
||||
}
|
||||
|
||||
if (!isContextIsValid(newContextName, oldContextName, con)) {
|
||||
if (!isContextIsValid(newContextName, oldContextName, connItem) && hasDependency(connItem)) {
|
||||
// can not update connection when context is invalid(catalog or schema is null) and has dependecy
|
||||
return false;
|
||||
}
|
||||
con.setContextName(newContextName);
|
||||
@@ -108,7 +111,7 @@ public class SwitchContextGroupNameImpl implements ISwitchContext {
|
||||
DatabaseConnection dbConn = (DatabaseConnection) connItem.getConnection();
|
||||
String newURL = getChangedURL(dbConn, newContextName);
|
||||
dbConn.setURL(newURL);
|
||||
|
||||
// do nothing when schema or catalog is null
|
||||
updateConnectionForSidOrUiSchema(dbConn, oldContextName);
|
||||
}
|
||||
|
||||
@@ -123,14 +126,27 @@ public class SwitchContextGroupNameImpl implements ISwitchContext {
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean hasDependency(ConnectionItem connItem) {
|
||||
// Added TDQ-18565
|
||||
if (GlobalServiceRegister.getDefault().isServiceRegistered(ITDQRepositoryService.class)) {
|
||||
ITDQRepositoryService tdqRepService =
|
||||
GlobalServiceRegister.getDefault().getService(ITDQRepositoryService.class);
|
||||
if (tdqRepService.hasClientDependences(connItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* DOC talend Comment method "checkContextIsValid".
|
||||
*
|
||||
* @param selectedContext
|
||||
* @paramconn
|
||||
*/
|
||||
private boolean isContextIsValid(String selectedContext, String oldContextName, Connection conn) {
|
||||
private boolean isContextIsValid(String selectedContext, String oldContextName, ConnectionItem connItem) {
|
||||
boolean retCode = false;
|
||||
Connection conn = connItem.getConnection();
|
||||
if (conn instanceof DatabaseConnection) {
|
||||
EDatabaseTypeName dbType = EDatabaseTypeName.getTypeFromDbType(((DatabaseConnection) conn).getDatabaseType());
|
||||
|
||||
@@ -138,33 +154,45 @@ public class SwitchContextGroupNameImpl implements ISwitchContext {
|
||||
retCode = true;
|
||||
} else if (dbType == EDatabaseTypeName.GENERAL_JDBC) {
|
||||
retCode = true;
|
||||
} else {
|
||||
DatabaseConnection dbConn = (DatabaseConnection) conn;
|
||||
boolean hasCatalog = ConnectionHelper.hasCatalog(dbConn);
|
||||
boolean hasSchema = ConnectionHelper.hasSchema(dbConn);
|
||||
ContextType newContextType = ConnectionContextHelper.getContextTypeForContextMode(dbConn, selectedContext, false);
|
||||
ContextType oldContextType = ConnectionContextHelper.getContextTypeForContextMode(dbConn, oldContextName, false);
|
||||
String newSidOrDatabase = ConnectionContextHelper.getOriginalValue(newContextType, dbConn.getSID());
|
||||
String newUiShema = ConnectionContextHelper.getOriginalValue(newContextType, dbConn.getUiSchema());
|
||||
String oldSidOrDatabase = ConnectionContextHelper.getOriginalValue(oldContextType, dbConn.getSID());
|
||||
String oldUiShema = ConnectionContextHelper.getOriginalValue(oldContextType, dbConn.getUiSchema());
|
||||
if (hasCatalog) {// for example mysql
|
||||
retCode = !isEmptyString(oldSidOrDatabase) && !isEmptyString(newSidOrDatabase);
|
||||
if (hasSchema) {// for example mssql
|
||||
retCode &= !isEmptyString(oldUiShema) && !isEmptyString(newUiShema);
|
||||
}
|
||||
} else if (hasSchema) {// for example oracle
|
||||
retCode = !isEmptyString(oldUiShema) && !isEmptyString(newUiShema);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
DatabaseConnection dbConn = (DatabaseConnection) conn;
|
||||
boolean hasCatalog = ConnectionHelper.hasCatalog(dbConn);
|
||||
boolean hasSchema = ConnectionHelper.hasSchema(dbConn);
|
||||
ContextType newContextType = ConnectionContextHelper.getContextTypeForContextMode(dbConn,
|
||||
selectedContext, false);
|
||||
ContextType oldContextType = ConnectionContextHelper.getContextTypeForContextMode(dbConn,
|
||||
oldContextName, false);
|
||||
String newSidOrDatabase = ConnectionContextHelper.getOriginalValue(newContextType, dbConn.getSID());
|
||||
String newUiShema = ConnectionContextHelper.getOriginalValue(newContextType, dbConn.getUiSchema());
|
||||
String oldSidOrDatabase = ConnectionContextHelper.getOriginalValue(oldContextType, dbConn.getSID());
|
||||
String oldUiShema = ConnectionContextHelper.getOriginalValue(oldContextType, dbConn.getUiSchema());
|
||||
if (hasCatalog) {// for example mysql
|
||||
retCode = checkEmpty(newSidOrDatabase, oldSidOrDatabase);
|
||||
if (hasSchema) {// for example mssql
|
||||
retCode &= checkEmpty(newUiShema, oldUiShema);
|
||||
}
|
||||
} else if (hasSchema) {// for example oracle
|
||||
retCode = checkEmpty(newUiShema, oldUiShema);
|
||||
}else {//some db didnot have catelog and schema
|
||||
retCode = true;
|
||||
}
|
||||
|
||||
}
|
||||
} else if (conn instanceof FileConnection) {
|
||||
retCode = true;
|
||||
}
|
||||
|
||||
|
||||
return retCode;
|
||||
|
||||
}
|
||||
|
||||
private boolean checkEmpty(String newSidOrDatabase, String oldSidOrDatabase) {
|
||||
if (isEmptyString(oldSidOrDatabase) && isEmptyString(newSidOrDatabase)) {
|
||||
return true;
|
||||
}
|
||||
return !isEmptyString(oldSidOrDatabase) && !isEmptyString(newSidOrDatabase);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* change context Group need to synchronization name of catalog or schema
|
||||
|
||||
@@ -36,6 +36,14 @@
|
||||
</extension>
|
||||
<extension
|
||||
point="org.talend.core.runtime.librariesNeeded">
|
||||
<libraryNeeded
|
||||
context="PostgresPlus wizard"
|
||||
language="java"
|
||||
message="wizard for PostgresPlus"
|
||||
mvn_uri="mvn:org.postgresql/postgresql/42.2.14"
|
||||
name="postgresql-42.2.14.jar"
|
||||
required="true">
|
||||
</libraryNeeded>
|
||||
<libraryNeeded
|
||||
context="plugin:org.talend.metadata.managment"
|
||||
language="java"
|
||||
|
||||
@@ -60,6 +60,8 @@ import org.talend.core.model.metadata.builder.database.JavaSqlFactory;
|
||||
import org.talend.core.model.metadata.builder.database.PluginConstant;
|
||||
import org.talend.core.model.metadata.builder.database.TableInfoParameters;
|
||||
import org.talend.core.model.metadata.builder.database.manager.ExtractManager;
|
||||
import org.talend.core.model.metadata.types.JavaTypesManager;
|
||||
import org.talend.core.model.metadata.types.PerlTypesManager;
|
||||
import org.talend.core.runtime.CoreRuntimePlugin;
|
||||
import org.talend.core.service.TalendCWMService;
|
||||
import org.talend.core.utils.TalendQuoteUtils;
|
||||
@@ -1524,14 +1526,14 @@ public class DBConnectionFillerImpl extends MetadataFillerImpl<DatabaseConnectio
|
||||
typeName = MetadataToolHelper.validateValueForDBType(typeName);
|
||||
String pattern = null;
|
||||
if (MetadataConnectionUtils.isMssql(dbJDBCMetadata)) {
|
||||
if (typeName.toLowerCase().equals("date")) { //$NON-NLS-1$
|
||||
if (typeName.equalsIgnoreCase("date")) { //$NON-NLS-1$
|
||||
dataType = 91;
|
||||
pattern = TalendQuoteUtils.addQuotes("dd-MM-yyyy");
|
||||
// MOD scorreia 2010-07-24 removed the call to column.getSQLDataType() here because
|
||||
// obviously
|
||||
// the sql
|
||||
// data type it is null and results in a NPE
|
||||
} else if (typeName.toLowerCase().equals("time")) { //$NON-NLS-1$
|
||||
} else if (typeName.equalsIgnoreCase("time")) { //$NON-NLS-1$
|
||||
dataType = 92;
|
||||
pattern = TalendQuoteUtils.addQuotes("HH:mm:ss");
|
||||
// MOD scorreia 2010-07-24 removed the call to column.getSQLDataType() here because
|
||||
@@ -1614,6 +1616,15 @@ public class DBConnectionFillerImpl extends MetadataFillerImpl<DatabaseConnectio
|
||||
ExtractMetaDataUtils.getInstance().getIntMetaDataInfo(columns, "DECIMAL_DIGITS"));
|
||||
column.setTalendType(talendType);
|
||||
column.setSourceType(typeName);
|
||||
if (StringUtils.isBlank(column.getPattern())) {
|
||||
if (JavaTypesManager.DATE.getId().equals(talendType)
|
||||
|| PerlTypesManager.DATE.equals(talendType)) {
|
||||
String pattern1 = mappingTypeRetriever.getDefaultPattern(dbmsId, typeName);
|
||||
column.setPattern(
|
||||
StringUtils.isNotBlank(pattern1) ? TalendQuoteUtils.addQuotes(pattern1)
|
||||
: TalendQuoteUtils.addQuotes("dd-MM-yyyy"));//$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
@@ -1736,19 +1747,19 @@ public class DBConnectionFillerImpl extends MetadataFillerImpl<DatabaseConnectio
|
||||
}
|
||||
}
|
||||
if (MetadataConnectionUtils.isMssql(dbJDBCMetadata)) {
|
||||
if (typeName.toLowerCase().equals("date")) { //$NON-NLS-1$
|
||||
if (typeName.equalsIgnoreCase("date")) { //$NON-NLS-1$
|
||||
dataType = 91;
|
||||
// MOD scorreia 2010-07-24 removed the call to column.getSQLDataType() here because
|
||||
// obviously
|
||||
// the sql
|
||||
// data type it is null and results in a NPE
|
||||
} else if (typeName.toLowerCase().equals("time")) { //$NON-NLS-1$
|
||||
} else if (typeName.equalsIgnoreCase("time")) { //$NON-NLS-1$
|
||||
dataType = 92;
|
||||
// MOD scorreia 2010-07-24 removed the call to column.getSQLDataType() here because
|
||||
// obviously
|
||||
// the sql
|
||||
// data type it is null and results in a NPE
|
||||
} else if (typeName.toLowerCase().equals("datetime2")) { //$NON-NLS-1$
|
||||
} else if (typeName.equalsIgnoreCase("datetime2")) { //$NON-NLS-1$
|
||||
dataType = 93;
|
||||
}
|
||||
}
|
||||
@@ -1802,6 +1813,16 @@ public class DBConnectionFillerImpl extends MetadataFillerImpl<DatabaseConnectio
|
||||
column.setTalendType(talendType);
|
||||
String defaultSelectedDbType = mappingTypeRetriever.getDefaultSelectedDbType(talendType);
|
||||
column.setSourceType(defaultSelectedDbType);
|
||||
if (StringUtils.isBlank(column.getPattern())) {
|
||||
if (JavaTypesManager.DATE.getId().equals(talendType)
|
||||
|| PerlTypesManager.DATE.equals(talendType)) {
|
||||
String pattern1 = mappingTypeRetriever.getDefaultPattern(dbmsId, defaultSelectedDbType);
|
||||
column.setPattern(
|
||||
StringUtils.isNotBlank(pattern1) ? TalendQuoteUtils.addQuotes(pattern1)
|
||||
: TalendQuoteUtils.addQuotes("dd-MM-yyyy"));//$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Comment
|
||||
|
||||
@@ -1264,7 +1264,7 @@ public class MetadataConnectionUtils {
|
||||
if (metadata != null) {
|
||||
try {
|
||||
String name = metadata.getDatabaseProductName();
|
||||
if (name != null && name.toUpperCase().equals(EDatabaseTypeName.ORACLEFORSID.getProduct().toUpperCase())) {
|
||||
if (name != null && name.equalsIgnoreCase(EDatabaseTypeName.ORACLEFORSID.getProduct())) {
|
||||
return true;
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
|
||||
@@ -199,12 +199,12 @@ public class TDColumnAttributeHelper {
|
||||
// MOD zshen when the database is mssql,the datatype for "date" and "time" is "-9" and "-2"
|
||||
// ,respective.so change them to "91" and "92" for adapt to Java2SqlType.
|
||||
if (typeName != null && isMssql()) {
|
||||
if (typeName.toLowerCase().equals("date")) {
|
||||
if (typeName.equalsIgnoreCase("date")) {
|
||||
dataType = 91;
|
||||
// MOD scorreia 2010-07-24 removed the call to column.getSQLDataType() here because obviously
|
||||
// the sql
|
||||
// data type it is null and results in a NPE
|
||||
} else if (typeName.toLowerCase().equals("time")) {
|
||||
} else if (typeName.equalsIgnoreCase("time")) {
|
||||
dataType = 92;
|
||||
// MOD scorreia 2010-07-24 removed the call to column.getSQLDataType() here because obviously
|
||||
// the sql
|
||||
|
||||
@@ -231,13 +231,6 @@ public class MigrationToolService implements IMigrationToolService {
|
||||
int nbMigrationsToDo = 0;
|
||||
for (IProjectMigrationTask task : toExecute) {
|
||||
MigrationTask mgTask = MigrationUtil.findMigrationTask(done, task);
|
||||
if (mgTask != null) {
|
||||
String taskId = mgTask.getId();
|
||||
if (taskId != null && taskId.endsWith(".repeat")) { //$NON-NLS-1$
|
||||
MigrationUtil.removeMigrationTaskById(done, taskId);
|
||||
mgTask = null;
|
||||
}
|
||||
}
|
||||
if (mgTask == null && !task.isDeprecated()) {
|
||||
nbMigrationsToDo++;
|
||||
}
|
||||
@@ -319,13 +312,22 @@ public class MigrationToolService implements IMigrationToolService {
|
||||
|
||||
@Override
|
||||
public int compare(ERepositoryObjectType arg0, ERepositoryObjectType arg1) {
|
||||
if (arg0 == ERepositoryObjectType.PROCESS) {
|
||||
return 1;
|
||||
return getImportPriority(arg0) - getImportPriority(arg1);
|
||||
}
|
||||
|
||||
private int getImportPriority(ERepositoryObjectType objectType) {
|
||||
if (ERepositoryObjectType.CONTEXT.getType().equals(objectType)) {
|
||||
return 10;
|
||||
} else if ("SERVICES".equals(objectType)) {
|
||||
return 20;
|
||||
} else if (ERepositoryObjectType.JOBLET != null
|
||||
&& ERepositoryObjectType.JOBLET.getType().equals(objectType)) {
|
||||
return 30;
|
||||
} else if (ERepositoryObjectType.PROCESS_ROUTELET != null
|
||||
&& ERepositoryObjectType.PROCESS_ROUTELET.getType().equals(objectType)) {
|
||||
return 40;
|
||||
}
|
||||
if (arg0 == ERepositoryObjectType.JOBLET) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
return 100;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 641 B |