Compare commits
1 Commits
release/7.
...
allDeltaAn
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b7ef5e95c |
@@ -584,11 +584,13 @@ EParameterName.jdbcURL=JDBC URL
|
||||
EParameterName.driverJar=Driver jar
|
||||
EParameterName.className=Class name
|
||||
EParameterName.mappingFile=Mapping file
|
||||
SetupProcessDependenciesRoutinesAction.title=Setup Codes Dependencies
|
||||
SetupProcessDependenciesRoutinesAction.title=Setup routine dependencies
|
||||
SetupProcessDependenciesRoutinesDialog.systemRoutineLabel=System routines
|
||||
SetupProcessDependenciesRoutinesDialog.userRoutineLabel=User routines
|
||||
PerformancePreferencePage.addAllSystemRoutines=Add all system routines to job dependencies, when creating a new job
|
||||
PerformancePreferencePage.addAllUserRoutines=Add all user routines to job dependencies, when creating a new job
|
||||
ShowRoutineItemsDialog.systemTitle=Select Sytem Routines
|
||||
ShowRoutineItemsDialog.title=Select Routines
|
||||
AbstractMultiPageTalendEditor_pleaseWait=Saving Please Wait....
|
||||
DocumentationPreferencePage.use_css_template=Use CSS file as a template when export to HTML
|
||||
DocumentationPreferencePage.css_file=CSS File
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
NavigatorContent.contexts=Contexts
|
||||
NavigatorContent.routines=Global Routines
|
||||
NavigatorContent.routines=Routines
|
||||
NavigatorContent.sqlTemplates=SQL Templates
|
||||
NavigatorContent.documentation=Documentation
|
||||
NavigatorContent.activation=di.fake.for.activation
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<license url="http://www.example.com/license">[Enter License Description here.]</license>
|
||||
<requires>
|
||||
<import feature="org.eclipse.test" version="0.0.0" match="greaterOrEqual"/>
|
||||
<import plugin="org.junit" version="4.13.2" match="greaterOrEqual"/>
|
||||
<import plugin="org.junit" version="0.0.0" match="greaterOrEqual"/>
|
||||
<import plugin="org.talend.commons.runtime" version="0.0.0" match="greaterOrEqual"/>
|
||||
<import plugin="org.talend.commons.ui" version="0.0.0" match="greaterOrEqual"/>
|
||||
<import plugin="org.talend.core" version="0.0.0" match="greaterOrEqual"/>
|
||||
|
||||
@@ -16,9 +16,11 @@
|
||||
</requires>
|
||||
<plugin id="org.talend.libraries.apache" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.apache.axis2" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.apache.batik" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.apache.chemistry" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.apache.common" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.apache.cxf" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.apache.google" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.apache.http" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.apache.lucene" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.apache.xml" download-size="0" install-size="0" version="0.0.0"/>
|
||||
@@ -50,4 +52,5 @@
|
||||
<plugin id="org.talend.libraries.slf4j" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.xml" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.zmq" download-size="0" install-size="0" version="0.0.0"/>
|
||||
<plugin id="org.talend.libraries.zookeeper" download-size="0" install-size="0" version="0.0.0"/>
|
||||
</feature>
|
||||
|
||||
@@ -50,11 +50,8 @@ List<IConnection> allSubProcessConnection = codeGenArgument.getAllMainSubTreeCon
|
||||
String cid = node.getUniqueName();
|
||||
|
||||
List<? extends INode> jobCatcherNodes = process.getNodesOfType("tJobStructureCatcher");
|
||||
boolean jobCatcherExists = jobCatcherNodes != null && !jobCatcherNodes.isEmpty();
|
||||
INode jobCatcherNode = jobCatcherExists ? jobCatcherNodes.get(0) : null;
|
||||
|
||||
boolean enableLogStash = !Boolean.getBoolean("deactivate_extended_component_log") && jobCatcherExists;
|
||||
boolean logstashCurrent = enableLogStash && !cid.startsWith("tJobStructureCatcher") && !cid.startsWith("talend");
|
||||
boolean enableLogStash = jobCatcherNodes != null && !jobCatcherNodes.isEmpty();
|
||||
boolean logstashCurrent = !cid.startsWith("tJobStructureCatcher") && !cid.startsWith("talend") && enableLogStash;
|
||||
|
||||
if((codePart.equals(ECodePart.END))&&(stat || logstashCurrent)){
|
||||
boolean iterateInVFComp = (node.getVirtualLinkTo() != null && node.getVirtualLinkTo() == EConnectionType.ITERATE);
|
||||
@@ -91,10 +88,10 @@ if((codePart.equals(ECodePart.END))&&(stat || logstashCurrent)){
|
||||
String sourceNodeId = source.getUniqueName();
|
||||
|
||||
String sourceLabel = ElementParameterParser.getValue(source, "__LABEL__");
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel.trim());
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel);
|
||||
|
||||
String targetLabel = ElementParameterParser.getValue(node, "__LABEL__");
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel.trim());
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel);
|
||||
|
||||
String sourceNodeComponent = source.getComponent().getName();
|
||||
for (INode jobStructureCatcher : jobCatcherNodes) {
|
||||
@@ -125,10 +122,10 @@ if((codePart.equals(ECodePart.END))&&(stat || logstashCurrent)){
|
||||
String sourceNodeId = source.getUniqueName();
|
||||
|
||||
String sourceLabel = ElementParameterParser.getValue(source, "__LABEL__");
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel.trim());
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel);
|
||||
|
||||
String targetLabel = ElementParameterParser.getValue(node, "__LABEL__");
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel.trim());
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel);
|
||||
|
||||
String sourceNodeComponent = source.getComponent().getName();
|
||||
for (INode jobStructureCatcher : jobCatcherNodes) {
|
||||
@@ -167,7 +164,6 @@ if((codePart.equals(ECodePart.END))&&(stat || logstashCurrent)){
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<IMetadataTable> metadatas = node.getMetadataList();
|
||||
if ((!node.isSubProcessStart())&&(NodeUtil.isDataAutoPropagated(node))) {
|
||||
if (inputColName!=null) {
|
||||
@@ -193,117 +189,6 @@ if((codePart.equals(ECodePart.END))&&(stat || logstashCurrent)){
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//log runtime lineage
|
||||
boolean enable_runtime_lineage_log = NodeUtil.isJobUsingRuntimeLineage(process) && jobCatcherExists && !cid.startsWith("tJobStructureCatcher") && !cid.startsWith("talend");
|
||||
if(enable_runtime_lineage_log) {//}
|
||||
|
||||
List<? extends IConnection> outConns = node.getOutgoingConnections();
|
||||
if(!outConns.isEmpty()) {
|
||||
%>
|
||||
if(tos_count_<%=node.getUniqueName() %> == 0) {
|
||||
<%
|
||||
//}
|
||||
}
|
||||
|
||||
for (IConnection conn : outConns) {
|
||||
if(!conn.getLineStyle().equals(EConnectionType.FLOW_MAIN) && !conn.getLineStyle().equals(EConnectionType.FLOW_MERGE) && !conn.getLineStyle().equals(EConnectionType.FLOW_REF)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
IMetadataTable metadata = conn.getMetadataTable();
|
||||
if (metadata==null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
List<IMetadataColumn> columns = metadata.getListColumns();
|
||||
|
||||
if(columns == null || columns.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
%>
|
||||
|
||||
class SchemaUtil_<%=conn.getUniqueName()%>_<%=conn.getMetadataTable().getTableName()%> {
|
||||
|
||||
public java.util.List<java.util.Map<String, String>> getSchema(final <%=NodeUtil.getPrivateConnClassName(conn) %>Struct <%=conn.getName()%>) {
|
||||
java.util.List<java.util.Map<String, String>> schema = new java.util.ArrayList<>();
|
||||
if(<%=conn.getName()%> == null) {
|
||||
return schema;
|
||||
}
|
||||
java.util.Map<String, String> field = null;
|
||||
<%
|
||||
for(IMetadataColumn column : columns){
|
||||
if("id_Dynamic".equals(column.getTalendType())) {
|
||||
%>
|
||||
routines.system.Dynamic dynamic = <%=conn.getName()%>.<%=column.getLabel()%>;
|
||||
if(dynamic != null) {
|
||||
for(routines.system.DynamicMetadata metadata : dynamic.metadatas) {
|
||||
field = new java.util.HashMap<>();
|
||||
field.put("name", metadata.getName());
|
||||
field.put("origin_name", metadata.getDbName());
|
||||
field.put("iskey", "" + metadata.isKey());
|
||||
field.put("talend_type", metadata.getType());
|
||||
field.put("type", metadata.getDbType());
|
||||
field.put("nullable", "" + metadata.isNullable());
|
||||
field.put("pattern", metadata.getFormat());
|
||||
field.put("length", "" + metadata.getLength());
|
||||
field.put("precision", "" + metadata.getPrecision());
|
||||
schema.add(field);
|
||||
}
|
||||
}
|
||||
|
||||
<%
|
||||
continue;
|
||||
}
|
||||
|
||||
String pattern = column.getPattern();
|
||||
if(pattern == null || pattern.isEmpty() || pattern.equals("\"\"")) {
|
||||
pattern = "\"\"";
|
||||
}
|
||||
%>
|
||||
field = new java.util.HashMap<>();
|
||||
field.put("name", "<%=column.getLabel()%>");
|
||||
field.put("origin_name", "<%=column.getOriginalDbColumnName()%>");
|
||||
field.put("iskey", "<%=column.isKey()%>");
|
||||
field.put("talend_type", "<%=column.getTalendType()%>");
|
||||
field.put("type", "<%=column.getType()%>");
|
||||
field.put("nullable", "<%=column.isNullable()%>");
|
||||
field.put("pattern", <%=pattern%>);
|
||||
field.put("length", "<%=column.getLength()%>");
|
||||
field.put("precision", "<%=column.getPrecision()%>");
|
||||
schema.add(field);
|
||||
<%
|
||||
}
|
||||
%>
|
||||
return schema;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
java.util.List<java.util.Map<String, String>> schema_<%=conn.getUniqueName()%>_<%=conn.getMetadataTable().getTableName()%> = new SchemaUtil_<%=conn.getUniqueName()%>_<%=conn.getMetadataTable().getTableName()%>().getSchema(<%=conn.getName()%>);
|
||||
<%
|
||||
INode target = conn.getTarget();
|
||||
String targetNodeId = target.getUniqueName();
|
||||
String targetNodeComponent = target.getComponent().getName();
|
||||
|
||||
%>
|
||||
<%=jobCatcherNode.getUniqueName()%>.addConnectionSchemaMessage("<%=node.getUniqueName()%>","<%=node.getComponent().getName()%>",
|
||||
"<%=targetNodeId%>","<%=targetNodeComponent%>", "<%=conn.getUniqueName()%>" + iterateId, schema_<%=conn.getUniqueName()%>_<%=conn.getMetadataTable().getTableName()%>);
|
||||
<%=jobCatcherNode.getDesignSubjobStartNode().getUniqueName() %>Process(globalMap);
|
||||
<%
|
||||
}
|
||||
|
||||
if(!outConns.isEmpty()) {
|
||||
//{
|
||||
%>
|
||||
}
|
||||
<%
|
||||
}
|
||||
|
||||
//{
|
||||
}
|
||||
|
||||
//======================================TDI-17183 end=====================================
|
||||
boolean traceCodeGenerated = false;
|
||||
for (IConnection conn : node.getOutgoingConnections()) {
|
||||
|
||||
@@ -8,9 +8,6 @@
|
||||
org.talend.core.model.metadata.IMetadataColumn
|
||||
org.talend.core.model.process.EConnectionType
|
||||
org.talend.core.model.process.ElementParameterParser
|
||||
org.talend.core.model.process.EParameterFieldType
|
||||
org.talend.designer.core.model.components.EParameterName
|
||||
org.talend.designer.core.model.components.ElementParameter
|
||||
org.talend.designer.codegen.config.CodeGeneratorArgument
|
||||
org.talend.core.model.utils.NodeUtil
|
||||
org.talend.core.model.process.IConnectionCategory
|
||||
@@ -143,14 +140,10 @@
|
||||
connSet.addAll(node.getIncomingConnections(EConnectionType.FLOW_MAIN));
|
||||
connSet.addAll(node.getIncomingConnections(EConnectionType.FLOW_MERGE));
|
||||
|
||||
String cid = node.getUniqueName();
|
||||
|
||||
List<? extends INode> jobCatcherNodes = node.getProcess().getNodesOfType("tJobStructureCatcher");
|
||||
boolean jobCatcherExists = jobCatcherNodes != null && !jobCatcherNodes.isEmpty();
|
||||
INode jobCatcherNode = jobCatcherExists ? jobCatcherNodes.get(0) : null;
|
||||
|
||||
boolean enableLogStash = !Boolean.getBoolean("deactivate_extended_component_log") && jobCatcherExists;
|
||||
boolean logstashCurrent = enableLogStash && !cid.startsWith("tJobStructureCatcher") && !cid.startsWith("talend");
|
||||
boolean enableLogStash = jobCatcherNodes != null && !jobCatcherNodes.isEmpty();
|
||||
String cid = node.getUniqueName();
|
||||
boolean logstashCurrent = !cid.startsWith("tJobStructureCatcher") && !cid.startsWith("talend") && enableLogStash;
|
||||
|
||||
//about performance monitor, no way to support more than one job catcher component, also that is not necessary
|
||||
final String subprocessName4Catcher = logstashCurrent ? jobCatcherNodes.get(0).getDesignSubjobStartNode().getUniqueName() : null;
|
||||
@@ -197,10 +190,10 @@
|
||||
String sourceNodeId = source.getUniqueName();
|
||||
|
||||
String sourceLabel = ElementParameterParser.getValue(source, "__LABEL__");
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel.trim());
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel);
|
||||
|
||||
String targetLabel = ElementParameterParser.getValue(node, "__LABEL__");
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel.trim());
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel);
|
||||
|
||||
String sourceNodeComponent = source.getComponent().getName();
|
||||
%>
|
||||
@@ -233,10 +226,10 @@
|
||||
String sourceNodeId = source.getUniqueName();
|
||||
|
||||
String sourceLabel = ElementParameterParser.getValue(source, "__LABEL__");
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel.trim());
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel);
|
||||
|
||||
String targetLabel = ElementParameterParser.getValue(node, "__LABEL__");
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel.trim());
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel);
|
||||
|
||||
String sourceNodeComponent = source.getComponent().getName();
|
||||
%>
|
||||
@@ -260,10 +253,10 @@
|
||||
String sourceNodeId = source.getUniqueName();
|
||||
|
||||
String sourceLabel = ElementParameterParser.getValue(source, "__LABEL__");
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel.trim());
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel);
|
||||
|
||||
String targetLabel = ElementParameterParser.getValue(node, "__LABEL__");
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel.trim());
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel);
|
||||
|
||||
String sourceNodeComponent = source.getComponent().getName();
|
||||
|
||||
@@ -296,10 +289,10 @@
|
||||
String sourceNodeId = source.getUniqueName();
|
||||
|
||||
String sourceLabel = ElementParameterParser.getValue(source, "__LABEL__");
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel.trim());
|
||||
String sourceNodeLabel = ((sourceLabel==null || "__UNIQUE_NAME__".equals(sourceLabel) || sourceLabel.contains("\"")) ? sourceNodeId : sourceLabel);
|
||||
|
||||
String targetLabel = ElementParameterParser.getValue(node, "__LABEL__");
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel.trim());
|
||||
String targetNodeLabel = ((targetLabel==null || "__UNIQUE_NAME__".equals(targetLabel) || targetLabel.contains("\"")) ? node.getUniqueName() : targetLabel);
|
||||
|
||||
String sourceNodeComponent = source.getComponent().getName();
|
||||
|
||||
@@ -338,104 +331,11 @@
|
||||
<%
|
||||
log.startWork();
|
||||
log.logCompSetting();
|
||||
boolean enable_runtime_lineage_log = NodeUtil.isJobUsingRuntimeLineage(node.getProcess()) && jobCatcherExists && !cid.startsWith("tJobStructureCatcher") && !cid.startsWith("talend");
|
||||
if(enable_runtime_lineage_log) {
|
||||
%>
|
||||
class ParameterUtil_<%=cid%>{
|
||||
|
||||
public java.util.Map<String, String> getParameter() throws Exception{
|
||||
java.util.Map<String, String> component_parameters = new java.util.HashMap<>();
|
||||
<%
|
||||
java.util.Set<org.talend.core.model.process.EParameterFieldType> ignoredParamsTypes = new java.util.HashSet<org.talend.core.model.process.EParameterFieldType>();
|
||||
ignoredParamsTypes.addAll(
|
||||
java.util.Arrays.asList(
|
||||
org.talend.core.model.process.EParameterFieldType.SCHEMA_TYPE,
|
||||
org.talend.core.model.process.EParameterFieldType.SCHEMA_REFERENCE,
|
||||
org.talend.core.model.process.EParameterFieldType.LABEL,
|
||||
org.talend.core.model.process.EParameterFieldType.EXTERNAL,
|
||||
org.talend.core.model.process.EParameterFieldType.MAPPING_TYPE,
|
||||
org.talend.core.model.process.EParameterFieldType.IMAGE,
|
||||
org.talend.core.model.process.EParameterFieldType.TNS_EDITOR,
|
||||
org.talend.core.model.process.EParameterFieldType.WSDL2JAVA,
|
||||
org.talend.core.model.process.EParameterFieldType.GENERATEGRAMMARCONTROLLER,
|
||||
org.talend.core.model.process.EParameterFieldType.GENERATE_SURVIVORSHIP_RULES_CONTROLLER,
|
||||
org.talend.core.model.process.EParameterFieldType.REFRESH_REPORTS,
|
||||
org.talend.core.model.process.EParameterFieldType.BROWSE_REPORTS,
|
||||
org.talend.core.model.process.EParameterFieldType.PALO_DIM_SELECTION,
|
||||
org.talend.core.model.process.EParameterFieldType.GUESS_SCHEMA,
|
||||
org.talend.core.model.process.EParameterFieldType.MATCH_RULE_IMEX_CONTROLLER,
|
||||
org.talend.core.model.process.EParameterFieldType.MEMO_PERL,
|
||||
org.talend.core.model.process.EParameterFieldType.DBTYPE_LIST,
|
||||
org.talend.core.model.process.EParameterFieldType.VERSION,
|
||||
org.talend.core.model.process.EParameterFieldType.TECHNICAL,
|
||||
org.talend.core.model.process.EParameterFieldType.ICON_SELECTION,
|
||||
org.talend.core.model.process.EParameterFieldType.JAVA_COMMAND,
|
||||
org.talend.core.model.process.EParameterFieldType.TREE_TABLE,
|
||||
org.talend.core.model.process.EParameterFieldType.VALIDATION_RULE_TYPE,
|
||||
org.talend.core.model.process.EParameterFieldType.DCSCHEMA,
|
||||
org.talend.core.model.process.EParameterFieldType.SURVIVOR_RELATION,
|
||||
org.talend.core.model.process.EParameterFieldType.REST_RESPONSE_SCHEMA_TYPE,
|
||||
org.talend.core.model.process.EParameterFieldType.BUTTON
|
||||
)
|
||||
);
|
||||
for(org.talend.core.model.process.IElementParameter ep : org.talend.core.model.utils.NodeUtil.getDisplayedParameters(node)){
|
||||
if(!ep.isLog4JEnabled() || ignoredParamsTypes.contains(ep.getFieldType())){
|
||||
continue;
|
||||
}
|
||||
|
||||
ElementParameter p = (ElementParameter)ep;
|
||||
Object pluginValue = p.getTaggedValue("org.talend.sdk.component.source");
|
||||
if(pluginValue != null && String.class.cast(pluginValue).equalsIgnoreCase("tacokit")) {
|
||||
try {
|
||||
if (!(Boolean) org.talend.core.runtime.IAdditionalInfo.class.cast(p).func("isPersisted")) {
|
||||
continue;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
%>
|
||||
<%@ include file="./tacokit_runtime_log.javajet"%>
|
||||
<%
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
String name = ep.getName();
|
||||
java.util.Set<String> ignoredParamsNames = new java.util.HashSet<String>();
|
||||
ignoredParamsNames.add("SQLPATTERN_VALUE");
|
||||
ignoredParamsNames.add("ADDITIONAL_INSERT_COLUMNS");
|
||||
ignoredParamsNames.add("ADDITIONAL_UPDATE_COLUMNS");
|
||||
ignoredParamsNames.add("SELECTION_TABLE");
|
||||
ignoredParamsNames.add("DIFFER_MESSAGE");
|
||||
ignoredParamsNames.add("NO_DIFFER_MESSAGE");
|
||||
|
||||
if(ignoredParamsNames.contains(name)) {
|
||||
//do nothing
|
||||
} else if(org.talend.core.model.process.EParameterFieldType.PASSWORD.equals(ep.getFieldType()) || org.talend.core.model.process.EParameterFieldType.HIDDEN_TEXT.equals(ep.getFieldType())){
|
||||
//not log password
|
||||
}else{
|
||||
String value = org.talend.core.model.utils.NodeUtil.getRuntimeParameterValue(node, ep);
|
||||
%>
|
||||
component_parameters.put("<%=name%>", String.valueOf(<%=value%>));
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
return component_parameters;
|
||||
}
|
||||
}
|
||||
|
||||
<%=jobCatcherNode.getUniqueName()%>.addComponentParameterMessage("<%=node.getUniqueName()%>", "<%=node.getComponent().getName()%>",
|
||||
new ParameterUtil_<%=cid%>().getParameter());
|
||||
<%=jobCatcherNode.getDesignSubjobStartNode().getUniqueName() %>Process(globalMap);
|
||||
<%
|
||||
}
|
||||
|
||||
if(logstashCurrent) {
|
||||
for (INode jobStructureCatcher : jobCatcherNodes) {
|
||||
String label = ElementParameterParser.getValue(node, "__LABEL__");
|
||||
String nodeLabel = ((label==null || "__UNIQUE_NAME__".equals(label) || label.contains("\"")) ? node.getUniqueName() : label.trim());
|
||||
String nodeLabel = ((label==null || "__UNIQUE_NAME__".equals(label) || label.contains("\"")) ? node.getUniqueName() : label);
|
||||
%>
|
||||
if(enableLogStash) {
|
||||
<%=jobStructureCatcher.getUniqueName() %>.addCM("<%=node.getUniqueName()%>", "<%=nodeLabel%>", "<%=node.getComponent().getName()%>");
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
org.talend.core.model.process.ProcessUtils
|
||||
org.talend.core.model.components.IComponent
|
||||
org.talend.core.model.components.EComponentType
|
||||
org.talend.core.model.utils.NodeUtil
|
||||
"
|
||||
class="Footer"
|
||||
skeleton="footer_java.skeleton"
|
||||
@@ -126,16 +125,8 @@
|
||||
|
||||
boolean exist_tSCP = false;
|
||||
List<INode> scpComponentsList = (List<INode>)process.getNodesOfType("tSCPConnection");
|
||||
String parameterNames = "";
|
||||
int scpsize = scpComponentsList.size();
|
||||
if (scpsize > 0) {
|
||||
if (scpComponentsList.size() > 0) {
|
||||
exist_tSCP = true;
|
||||
for (int i = 0; i < scpsize; i++) {
|
||||
parameterNames += "\"conn_" + scpComponentsList.get(i).getUniqueName() + "\"";
|
||||
if(i < scpsize-1){
|
||||
parameterNames += ",";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean exist_tCassandra = false;
|
||||
@@ -514,94 +505,21 @@
|
||||
}
|
||||
org.apache.logging.log4j.core.config.Configurator.setLevel(org.apache.logging.log4j.LogManager.getRootLogger().getName(), log.getLevel());
|
||||
<%}%>
|
||||
}
|
||||
log.info("TalendJob: '<%=codeGenArgument.getJobName()%>' - Start.");
|
||||
<%}%>
|
||||
|
||||
<%
|
||||
INode jobCatcherNode = null;
|
||||
|
||||
int threadPoolSize = 0;
|
||||
boolean tRESTRequestLoopExists = false;
|
||||
}
|
||||
log.info("TalendJob: '<%=codeGenArgument.getJobName()%>' - Start.");
|
||||
<%}%>
|
||||
|
||||
<%
|
||||
INode jobCatcherNode = null;
|
||||
for (INode nodeInProcess : process.getGeneratingNodes()) {
|
||||
String componentName = nodeInProcess.getComponent().getName();
|
||||
|
||||
if(jobCatcherNode==null && "tJobStructureCatcher".equals(componentName)) {
|
||||
if("tJobStructureCatcher".equals(componentName)) {
|
||||
jobCatcherNode = nodeInProcess;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!nodeInProcess.isActivate()) continue;
|
||||
|
||||
if("tRESTRequestLoop".equals(componentName)) {
|
||||
tRESTRequestLoopExists = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if("tWriteXMLFieldOut".equals(componentName)) {
|
||||
IConnection nextMergeConn = NodeUtil.getNextMergeConnection(nodeInProcess);
|
||||
if(nextMergeConn == null || nextMergeConn.getInputId()==1){
|
||||
threadPoolSize++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
boolean enableLogStash = !Boolean.getBoolean("deactivate_extended_component_log") && (jobCatcherNode!=null);
|
||||
boolean enable_runtime_lineage_log = NodeUtil.isJobUsingRuntimeLineage(process) && (jobCatcherNode!=null);
|
||||
if(enable_runtime_lineage_log) {
|
||||
%>
|
||||
java.util.Properties p_<%=jobCatcherNode.getUniqueName()%> = new java.util.Properties();
|
||||
p_<%=jobCatcherNode.getUniqueName()%>.setProperty("root.logger", "runtime");
|
||||
p_<%=jobCatcherNode.getUniqueName()%>.setProperty("encoding", "UTF-8");
|
||||
p_<%=jobCatcherNode.getUniqueName()%>.setProperty("application.name", "Talend Studio");
|
||||
p_<%=jobCatcherNode.getUniqueName()%>.setProperty("service.name", "Talend Studio Job");
|
||||
p_<%=jobCatcherNode.getUniqueName()%>.setProperty("instance.name", "Talend Studio Job Instance");
|
||||
p_<%=jobCatcherNode.getUniqueName()%>.setProperty("propagate.appender.exceptions", "none");
|
||||
p_<%=jobCatcherNode.getUniqueName()%>.setProperty("log.appender", "file");
|
||||
p_<%=jobCatcherNode.getUniqueName()%>.setProperty("appender.file.path", "runtime.json");
|
||||
p_<%=jobCatcherNode.getUniqueName()%>.setProperty("appender.file.maxsize", "52428800");
|
||||
p_<%=jobCatcherNode.getUniqueName()%>.setProperty("appender.file.maxbackup", "20");
|
||||
p_<%=jobCatcherNode.getUniqueName()%>.setProperty("host", "false");
|
||||
|
||||
final String runtime_dir_<%=jobCatcherNode.getUniqueName()%> = System.getProperty("runtime.lineage.outputpath");
|
||||
final String runtime_path_<%=jobCatcherNode.getUniqueName()%> = System.getProperty("runtime.lineage.appender.file.path");
|
||||
if(runtime_path_<%=jobCatcherNode.getUniqueName()%>==null || runtime_path_<%=jobCatcherNode.getUniqueName()%>.isEmpty()) {
|
||||
if(runtime_dir_<%=jobCatcherNode.getUniqueName()%>!=null && !runtime_dir_<%=jobCatcherNode.getUniqueName()%>.isEmpty()) {
|
||||
System.setProperty("runtime.lineage.appender.file.path",
|
||||
new StringBuilder().append(runtime_dir_<%=jobCatcherNode.getUniqueName()%>)
|
||||
.append((runtime_dir_<%=jobCatcherNode.getUniqueName()%>.endsWith("/") || runtime_dir_<%=jobCatcherNode.getUniqueName()%>.endsWith("\\")) ? "" : java.io.File.separator)
|
||||
.append(projectName)
|
||||
.append(java.io.File.separatorChar)
|
||||
.append(jobName)
|
||||
.append(java.io.File.separatorChar)
|
||||
.append(jobVersion)
|
||||
.append(java.io.File.separatorChar)
|
||||
.append("runtime_log_")
|
||||
.append(new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(new java.util.Date()))
|
||||
.append(".json")
|
||||
.toString()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
System.getProperties().stringPropertyNames().stream()
|
||||
.filter(it -> it.startsWith("runtime.lineage.") && !"runtime.lineage.outputpath".equals(it))
|
||||
.forEach(key -> p_<%=jobCatcherNode.getUniqueName()%>.setProperty(key.substring("runtime.lineage.".length()), System.getProperty(key)));
|
||||
|
||||
<%if(isLog4j1Enabled) {%>
|
||||
org.apache.log4j.Logger.getLogger(p_<%=jobCatcherNode.getUniqueName()%>.getProperty("root.logger")).setLevel(org.apache.log4j.Level.DEBUG);
|
||||
<%}%>
|
||||
|
||||
<%if(isLog4j2Enabled) {%>
|
||||
org.apache.logging.log4j.core.config.Configurator.setLevel(p_<%=jobCatcherNode.getUniqueName()%>.getProperty("root.logger"), org.apache.logging.log4j.Level.DEBUG);
|
||||
<%}%>
|
||||
|
||||
runtime_lineage_logger_<%=jobCatcherNode.getUniqueName()%> = org.talend.job.audit.JobEventAuditLoggerFactory.createJobAuditLogger(p_<%=jobCatcherNode.getUniqueName()%>);
|
||||
<%
|
||||
}
|
||||
|
||||
if(enableLogStash) {
|
||||
String location = ElementParameterParser.getValue(jobCatcherNode, "__LOCATION__");
|
||||
if(jobCatcherNode!=null) {
|
||||
String location = ElementParameterParser.getValue(jobCatcherNode, "__LOCATION__");
|
||||
%>
|
||||
if(enableLogStash) {
|
||||
java.util.Properties properties_<%=jobCatcherNode.getUniqueName()%> = new java.util.Properties();
|
||||
@@ -632,7 +550,7 @@
|
||||
}
|
||||
<%
|
||||
}
|
||||
%>
|
||||
%>
|
||||
|
||||
if(clientHost == null) {
|
||||
clientHost = defaultClientHost;
|
||||
@@ -668,41 +586,20 @@
|
||||
}
|
||||
%>
|
||||
|
||||
boolean inOSGi = routines.system.BundleUtils.inOSGi();
|
||||
|
||||
try {
|
||||
java.util.Dictionary<String, Object> jobProperties = null;
|
||||
if (inOSGi) {
|
||||
jobProperties = routines.system.BundleUtils.getJobProperties(jobName);
|
||||
|
||||
if (jobProperties != null && jobProperties.get("context") != null) {
|
||||
contextStr = (String)jobProperties.get("context");
|
||||
}
|
||||
}
|
||||
//call job/subjob with an existing context, like: --context=production. if without this parameter, there will use the default context instead.
|
||||
java.io.InputStream inContext = <%=className%>.class.getClassLoader().getResourceAsStream("<%=jobClassPackageFolder%>/contexts/" + contextStr + ".properties");
|
||||
if (inContext == null) {
|
||||
inContext = <%=className%>.class.getClassLoader().getResourceAsStream("config/contexts/" + contextStr + ".properties");
|
||||
}
|
||||
if (inContext != null) {
|
||||
try {
|
||||
//defaultProps is in order to keep the original context value
|
||||
if(context != null && context.isEmpty()) {
|
||||
defaultProps.load(inContext);
|
||||
if (inOSGi && jobProperties != null) {
|
||||
java.util.Enumeration<String> keys = jobProperties.keys();
|
||||
while (keys.hasMoreElements()) {
|
||||
String propKey = keys.nextElement();
|
||||
if (defaultProps.containsKey(propKey)) {
|
||||
defaultProps.put(propKey, (String) jobProperties.get(propKey));
|
||||
}
|
||||
}
|
||||
}
|
||||
context = new ContextProperties(defaultProps);
|
||||
}
|
||||
} finally {
|
||||
inContext.close();
|
||||
//defaultProps is in order to keep the original context value
|
||||
if(context != null && context.isEmpty()) {
|
||||
defaultProps.load(inContext);
|
||||
context = new ContextProperties(defaultProps);
|
||||
}
|
||||
|
||||
inContext.close();
|
||||
} else if (!isDefaultContext) {
|
||||
//print info and job continue to run, for case: context_param is not empty.
|
||||
System.err.println("Could not find the context " + contextStr);
|
||||
@@ -768,39 +665,34 @@
|
||||
<%
|
||||
} else if(typeToGenerate.equals("java.util.Date")) {
|
||||
%>
|
||||
try{
|
||||
String context_<%=ctxParam.getName()%>_value = context.getProperty("<%=ctxParam.getName()%>");
|
||||
try{
|
||||
if (context_<%=ctxParam.getName()%>_value == null){
|
||||
context_<%=ctxParam.getName()%>_value = "";
|
||||
}
|
||||
int context_<%=ctxParam.getName()%>_pos = context_<%=ctxParam.getName()%>_value.indexOf(";");
|
||||
String context_<%=ctxParam.getName()%>_pattern = "yyyy-MM-dd HH:mm:ss";
|
||||
if(context_<%=ctxParam.getName()%>_pos > -1){
|
||||
context_<%=ctxParam.getName()%>_pattern = context_<%=ctxParam.getName()%>_value.substring(0, context_<%=ctxParam.getName()%>_pos);
|
||||
context_<%=ctxParam.getName()%>_value = context_<%=ctxParam.getName()%>_value.substring(context_<%=ctxParam.getName()%>_pos + 1);
|
||||
}
|
||||
|
||||
context.<%=ctxParam.getName()%>=(java.util.Date)(new java.text.SimpleDateFormat(context_<%=ctxParam.getName()%>_pattern).parse(context_<%=ctxParam.getName()%>_value));
|
||||
|
||||
} catch(ParseException e) {
|
||||
try { <% /*try to check if date passed as long also*/ %>
|
||||
long context_<%=ctxParam.getName()%>_longValue = Long.valueOf(context_<%=ctxParam.getName()%>_value);
|
||||
context.<%=ctxParam.getName()%> = new java.util.Date(context_<%=ctxParam.getName()%>_longValue);
|
||||
} catch (NumberFormatException cantParseToLongException) {
|
||||
<%
|
||||
if (isLog4jEnabled) {
|
||||
%>
|
||||
log.warn(String.format("<%=warningMessageFormat %>", "<%=ctxParam.getName() %>", "Can't parse date string: " + e.getMessage() + " and long: " + cantParseToLongException.getMessage()));
|
||||
<%
|
||||
} else {
|
||||
%>
|
||||
System.err.println(String.format("<%=warningMessageFormat %>", "<%=ctxParam.getName() %>", "Can't parse date string: " + e.getMessage() + " and long: " + cantParseToLongException.getMessage()));
|
||||
<%
|
||||
}
|
||||
%>
|
||||
context.<%=ctxParam.getName()%>=null;
|
||||
}
|
||||
if (context_<%=ctxParam.getName()%>_value == null){
|
||||
context_<%=ctxParam.getName()%>_value = "";
|
||||
}
|
||||
int context_<%=ctxParam.getName()%>_pos = context_<%=ctxParam.getName()%>_value.indexOf(";");
|
||||
String context_<%=ctxParam.getName()%>_pattern = "yyyy-MM-dd HH:mm:ss";
|
||||
if(context_<%=ctxParam.getName()%>_pos > -1){
|
||||
context_<%=ctxParam.getName()%>_pattern = context_<%=ctxParam.getName()%>_value.substring(0, context_<%=ctxParam.getName()%>_pos);
|
||||
context_<%=ctxParam.getName()%>_value = context_<%=ctxParam.getName()%>_value.substring(context_<%=ctxParam.getName()%>_pos + 1);
|
||||
}
|
||||
|
||||
context.<%=ctxParam.getName()%>=(java.util.Date)(new java.text.SimpleDateFormat(context_<%=ctxParam.getName()%>_pattern).parse(context_<%=ctxParam.getName()%>_value));
|
||||
|
||||
} catch(ParseException e) {
|
||||
<%
|
||||
if (isLog4jEnabled) {
|
||||
%>
|
||||
log.warn(String.format("<%=warningMessageFormat %>", "<%=ctxParam.getName() %>", e.getMessage()));
|
||||
<%
|
||||
} else {
|
||||
%>
|
||||
System.err.println(String.format("<%=warningMessageFormat %>", "<%=ctxParam.getName() %>", e.getMessage()));
|
||||
<%
|
||||
}
|
||||
%>
|
||||
context.<%=ctxParam.getName()%>=null;
|
||||
}
|
||||
<%
|
||||
} else if(typeToGenerate.equals("Object")||typeToGenerate.equals("String")||typeToGenerate.equals("java.lang.String")) {
|
||||
%>
|
||||
@@ -884,7 +776,7 @@
|
||||
}
|
||||
%>
|
||||
//Resume: jobStart
|
||||
resumeUtil.addLog("JOB_STARTED", "JOB:" + jobName, parent_part_launcher, Thread.currentThread().getId() + "", "","","","",resumeUtil.convertToJsonText(context,ContextProperties.class,parametersToEncrypt));
|
||||
resumeUtil.addLog("JOB_STARTED", "JOB:" + jobName, parent_part_launcher, Thread.currentThread().getId() + "", "","","","",resumeUtil.convertToJsonText(context,parametersToEncrypt));
|
||||
|
||||
<%
|
||||
if (stats) {
|
||||
@@ -1054,7 +946,7 @@ this.globalResumeTicket = true;//to run tPreJob
|
||||
<%
|
||||
}
|
||||
|
||||
if(enableLogStash) {
|
||||
if(jobCatcherNode!=null) {
|
||||
%>
|
||||
if(enableLogStash) {
|
||||
<%=jobCatcherNode.getUniqueName() %>.addJobStartMessage();
|
||||
@@ -1157,15 +1049,9 @@ this.globalResumeTicket = false;//to run others jobs
|
||||
if (!componentName.equals("tJobStructureCatcher") && !componentName.equals("tLogCatcher") && !componentName.equals("tFlowMeterCatcher") && !componentName.equals("tAssertCatcher") && !componentName.equals("tStatCatcher") && !componentName.equals("tAsyncIn")) {
|
||||
%>
|
||||
<%=createCallProcess(rootNode, className, false) %>
|
||||
<%
|
||||
if (process.getNodesOfType("tStatCatcher").size() > 0) {
|
||||
%>
|
||||
<%=statsErrorHandlingAfterMainCall(rootNode, process.getNodesOfType("tStatCatcher"))%>
|
||||
<%
|
||||
}
|
||||
}
|
||||
}
|
||||
}// end if(isRunInMultiThread)
|
||||
<% }
|
||||
}
|
||||
}// end if(isRunInMultiThread)
|
||||
%>
|
||||
|
||||
this.globalResumeTicket = true;//to run tPostJob
|
||||
@@ -1213,7 +1099,7 @@ this.globalResumeTicket = true;//to run tPostJob
|
||||
<%
|
||||
}
|
||||
|
||||
if(enableLogStash) {
|
||||
if(jobCatcherNode!=null) {
|
||||
%>
|
||||
if(enableLogStash) {
|
||||
<%=jobCatcherNode.getUniqueName() %>.addJobEndMessage(startTime, end, status);
|
||||
@@ -1223,26 +1109,6 @@ this.globalResumeTicket = true;//to run tPostJob
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
<%
|
||||
}
|
||||
|
||||
//tRESTRequest may appear in microservice, the code may be called before call submit(task) method, so can't shutdown it here
|
||||
if(!tRESTRequestLoopExists && threadPoolSize>0) {
|
||||
%>
|
||||
es.shutdown();
|
||||
<%//shutdownNow should never be executed, only for safe%>
|
||||
try {
|
||||
if(!es.awaitTermination(60, java.util.concurrent.TimeUnit.SECONDS)) {
|
||||
es.shutdownNow();
|
||||
if(!es.awaitTermination(60, java.util.concurrent.TimeUnit.SECONDS)) {
|
||||
|
||||
}
|
||||
}
|
||||
} catch (java.lang.InterruptedException ie) {
|
||||
es.shutdownNow();
|
||||
} catch (java.lang.Exception e) {
|
||||
|
||||
}
|
||||
<%
|
||||
}
|
||||
%>
|
||||
@@ -1251,12 +1117,9 @@ this.globalResumeTicket = true;//to run tPostJob
|
||||
closeJmsConnections();
|
||||
<% } %>
|
||||
|
||||
<% if (exist_tSCP) {
|
||||
%>
|
||||
closeCloseableConnections(<%=parameterNames%>);
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<% if (exist_tSCP) { %>
|
||||
closeScpConnections();
|
||||
<% } %>
|
||||
|
||||
<%
|
||||
if (stats) {
|
||||
@@ -1275,31 +1138,13 @@ if (execStat) {
|
||||
}
|
||||
%>
|
||||
int returnCode = 0;
|
||||
|
||||
<%
|
||||
if (isRunInMultiThread) {
|
||||
%>
|
||||
Integer localErrorCode = (Integer)(((java.util.Map)threadLocal.get()).get("errorCode"));
|
||||
String localStatus = (String)(((java.util.Map)threadLocal.get()).get("status"));
|
||||
if (localErrorCode != null) {
|
||||
if (errorCode == null || localErrorCode.compareTo(errorCode) > 0) {
|
||||
errorCode = localErrorCode;
|
||||
}
|
||||
}
|
||||
if (localStatus != null && !status.equals("failure")){
|
||||
status = localStatus;
|
||||
}
|
||||
<%
|
||||
}
|
||||
%>
|
||||
|
||||
if(errorCode == null) {
|
||||
returnCode = status != null && status.equals("failure") ? 1 : 0;
|
||||
} else {
|
||||
returnCode = errorCode.intValue();
|
||||
}
|
||||
resumeUtil.addLog("JOB_ENDED", "JOB:" + jobName, parent_part_launcher, Thread.currentThread().getId() + "", "","" + returnCode,"","","");
|
||||
resumeUtil.flush();
|
||||
|
||||
return returnCode;
|
||||
|
||||
}
|
||||
@@ -1310,7 +1155,7 @@ if (execStat) {
|
||||
closeJmsConnections();
|
||||
<% } %>
|
||||
<% if(exist_tSCP) { %>
|
||||
closeCloseableConnections(<%=parameterNames%>);
|
||||
closeScpConnections();
|
||||
<% } %>
|
||||
<% if (exist_tSQLDB) { %>
|
||||
closeSqlDbConnections();
|
||||
@@ -1378,17 +1223,22 @@ if (execStat) {
|
||||
<%
|
||||
if(exist_tSCP) {
|
||||
%>
|
||||
private void closeCloseableConnections(String... names) {
|
||||
java.util.Arrays.stream(names).forEach(name-> {
|
||||
try {
|
||||
Object obj_conn = globalMap.remove(name);
|
||||
if(obj_conn != null){
|
||||
((java.io.Closeable)obj_conn).close();
|
||||
}
|
||||
} catch (IOException ioException) {
|
||||
private void closeScpConnections() {
|
||||
try {
|
||||
Object obj_conn;
|
||||
<%
|
||||
for (INode scpNode : scpComponentsList) {
|
||||
%>
|
||||
obj_conn = globalMap.remove("conn_<%=scpNode.getUniqueName() %>");
|
||||
if (null != obj_conn) {
|
||||
((ch.ethz.ssh2.Connection) obj_conn).close();
|
||||
}
|
||||
});
|
||||
}
|
||||
<%
|
||||
}
|
||||
%>
|
||||
} catch (java.lang.Exception e) {
|
||||
}
|
||||
}
|
||||
<%
|
||||
}
|
||||
%>
|
||||
@@ -1498,7 +1348,6 @@ if (execStat) {
|
||||
if ("sftp".equals(type)) { %>
|
||||
((com.jcraft.jsch.ChannelSftp) obj_conn).quit();
|
||||
<%} else { %>
|
||||
((org.apache.commons.net.ftp.FTPClient) obj_conn).logout();
|
||||
((org.apache.commons.net.ftp.FTPClient) obj_conn).disconnect();
|
||||
<%}%>
|
||||
}
|
||||
|
||||
@@ -42,10 +42,10 @@ public class CLASS
|
||||
|
||||
//List< ? extends IConnection> onSubJobErrorConns = rootNode.getOutgoingConnections(EConnectionType.ON_SUBJOB_ERROR);
|
||||
//if(onSubJobErrorConns!=null){
|
||||
// for(IConnection conn : onSubJobErrorConns) {
|
||||
// for(IConnection conn : onSubJobErrorConns) {
|
||||
// toReturn += createCallProcess(conn.getTarget(), className, isMultiThread);
|
||||
// }
|
||||
//}
|
||||
//}
|
||||
if(isMultiThread){
|
||||
toReturn += "\n}catch (java.lang.Error e_" + rootNode.getUniqueName() + ") {\n";
|
||||
toReturn += "globalMap.put(\""+rootNode.getUniqueName()+ "_SUBPROCESS_STATE\", -1);\n";
|
||||
@@ -55,20 +55,7 @@ public class CLASS
|
||||
toReturn += "\n}";
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
public String statsErrorHandlingAfterMainCall(INode rootNode, List<? extends INode> statsNodes) {
|
||||
String catchErrorReturn = "catch (Error error_" + rootNode.getUniqueName() + " ) {\n";
|
||||
catchErrorReturn+="end = System.currentTimeMillis();\n";
|
||||
for (INode statCatcherNode : statsNodes) {
|
||||
catchErrorReturn += statCatcherNode.getUniqueName() + ".addMessage(\"failure\", (end-startTime));\n";
|
||||
catchErrorReturn += "try {\n " + statCatcherNode.getDesignSubjobStartNode().getUniqueName() + "Process(globalMap);\n";
|
||||
catchErrorReturn += "} catch (Exception e_" + statCatcherNode.getUniqueName() + ") {\n";
|
||||
catchErrorReturn += "e_" + statCatcherNode.getUniqueName() + ".printStackTrace();\n}\n";
|
||||
}
|
||||
catchErrorReturn+= "throw error_" + rootNode.getUniqueName() + ";\n}\n";
|
||||
return catchErrorReturn;
|
||||
}
|
||||
|
||||
|
||||
public String generate(Object argument) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@@ -56,28 +56,10 @@ if ((metadatas != null) && (metadatas.size() > 0)) { // metadata
|
||||
// Set up the component definition, and the properties for all types of
|
||||
// components.
|
||||
|
||||
List<? extends IConnection> allInLineJobConns = NodeUtil.getFirstIncomingLineConnectionsOfType(node, "tRESTRequestIn");
|
||||
%>
|
||||
boolean doesNodeBelongToRequest_<%=cid%> = <%= allInLineJobConns.size() %> == 0;
|
||||
@SuppressWarnings("unchecked")
|
||||
java.util.Map<String, Object> restRequest_<%=cid%> = (java.util.Map<String, Object>)globalMap.get("restRequest");
|
||||
String currentTRestRequestOperation_<%=cid%> = (String)(restRequest_<%=cid%> != null ? restRequest_<%=cid%>.get("OPERATION") : null);
|
||||
<%
|
||||
for (IConnection inLineConn : allInLineJobConns) {
|
||||
%>
|
||||
if("<%= inLineConn.getName() %>".equals(currentTRestRequestOperation_<%=cid%>)) {
|
||||
doesNodeBelongToRequest_<%=cid%> = true;
|
||||
}
|
||||
<%
|
||||
}
|
||||
%>
|
||||
|
||||
org.talend.components.api.component.ComponentDefinition def_<%=cid %> =
|
||||
new <%= def.getClass().getName()%>();
|
||||
|
||||
org.talend.components.api.component.runtime.Writer writer_<%=cid%> = null;
|
||||
org.talend.components.api.component.runtime.Reader reader_<%=cid%> = null;
|
||||
|
||||
<%
|
||||
List<Component.CodegenPropInfo> propsToProcess = component.getCodegenPropInfos(componentProps);
|
||||
%>
|
||||
@@ -163,7 +145,7 @@ globalMap.put("TALEND_COMPONENTS_VERSION", "<%=component.getVersion()%>");
|
||||
boolean isParallelize ="true".equalsIgnoreCase(ElementParameterParser.getValue(node, "__PARALLELIZE__"));
|
||||
if (isParallelize) {
|
||||
%>
|
||||
final String buffersSizeKey_<%=cid%> = "buffersSizeKey_<%=cid%>_" + Thread.currentThread().getId();
|
||||
final String buffersSizeKey_<%=cid%> = "buffersSizeKey_<%=cid%>_" + Thread.currentThread().getId();
|
||||
<%
|
||||
}
|
||||
%>
|
||||
@@ -233,11 +215,9 @@ if(componentRuntime_<%=cid%> instanceof org.talend.components.api.component.runt
|
||||
org.talend.components.api.component.runtime.SourceOrSink sourceOrSink_<%=cid%> = null;
|
||||
if(componentRuntime_<%=cid%> instanceof org.talend.components.api.component.runtime.SourceOrSink) {
|
||||
sourceOrSink_<%=cid%> = (org.talend.components.api.component.runtime.SourceOrSink)componentRuntime_<%=cid%>;
|
||||
if (doesNodeBelongToRequest_<%=cid%>) {
|
||||
org.talend.daikon.properties.ValidationResult vr_<%=cid%> = sourceOrSink_<%=cid%>.validate(container_<%=cid%>);
|
||||
if (vr_<%=cid%>.getStatus() == org.talend.daikon.properties.ValidationResult.Result.ERROR ) {
|
||||
throw new RuntimeException(vr_<%=cid%>.getMessage());
|
||||
}
|
||||
org.talend.daikon.properties.ValidationResult vr_<%=cid%> = sourceOrSink_<%=cid%>.validate(container_<%=cid%>);
|
||||
if (vr_<%=cid%>.getStatus() == org.talend.daikon.properties.ValidationResult.Result.ERROR ) {
|
||||
throw new RuntimeException(vr_<%=cid%>.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -260,11 +240,11 @@ if(isTopologyNone) {
|
||||
|
||||
if (hasOutputOnly || asInputComponent) {
|
||||
%>
|
||||
if (sourceOrSink_<%=cid%> instanceof org.talend.components.api.component.runtime.Source) {
|
||||
org.talend.components.api.component.runtime.Source source_<%=cid%> =
|
||||
(org.talend.components.api.component.runtime.Source)sourceOrSink_<%=cid%>;
|
||||
reader_<%=cid%> = source_<%=cid%>.createReader(container_<%=cid%>);
|
||||
reader_<%=cid%> = new org.talend.codegen.flowvariables.runtime.FlowVariablesReader(reader_<%=cid%>, container_<%=cid%>);
|
||||
org.talend.components.api.component.runtime.Source source_<%=cid%> =
|
||||
(org.talend.components.api.component.runtime.Source)sourceOrSink_<%=cid%>;
|
||||
org.talend.components.api.component.runtime.Reader reader_<%=cid%> =
|
||||
source_<%=cid%>.createReader(container_<%=cid%>);
|
||||
reader_<%=cid%> = new org.talend.codegen.flowvariables.runtime.FlowVariablesReader(reader_<%=cid%>, container_<%=cid%>);
|
||||
|
||||
<%
|
||||
IConnection main = null;
|
||||
@@ -286,19 +266,19 @@ if (hasOutputOnly || asInputComponent) {
|
||||
IConnection schemaSourceConnector = (main!=null ? main : reject);
|
||||
String schemaSourceConnectorName = schemaSourceConnector.getMetadataTable().getAttachedConnector();
|
||||
%>
|
||||
boolean multi_output_is_allowed_<%=cid%> = false;
|
||||
boolean multi_output_is_allowed_<%=cid%> = false;
|
||||
<% //take care SourceOrSink.validate will change the schema if it contains include-all-fields, so need to get design Avro schema before validate %>
|
||||
org.talend.components.api.component.Connector c_<%=cid%> = null;
|
||||
for (org.talend.components.api.component.Connector currentConnector : props_<%=cid %>.getAvailableConnectors(null, true)) {
|
||||
if (currentConnector.getName().equals("<%=schemaSourceConnectorName%>")) {
|
||||
c_<%=cid%> = currentConnector;
|
||||
}
|
||||
|
||||
if (currentConnector.getName().equals("REJECT")) {//it's better to move the code to javajet
|
||||
multi_output_is_allowed_<%=cid%> = true;
|
||||
}
|
||||
org.talend.components.api.component.Connector c_<%=cid%> = null;
|
||||
for (org.talend.components.api.component.Connector currentConnector : props_<%=cid %>.getAvailableConnectors(null, true)) {
|
||||
if (currentConnector.getName().equals("<%=schemaSourceConnectorName%>")) {
|
||||
c_<%=cid%> = currentConnector;
|
||||
}
|
||||
org.apache.avro.Schema schema_<%=cid%> = props_<%=cid %>.getSchema(c_<%=cid%>, true);
|
||||
|
||||
if (currentConnector.getName().equals("REJECT")) {//it's better to move the code to javajet
|
||||
multi_output_is_allowed_<%=cid%> = true;
|
||||
}
|
||||
}
|
||||
org.apache.avro.Schema schema_<%=cid%> = props_<%=cid %>.getSchema(c_<%=cid%>, true);
|
||||
|
||||
<%
|
||||
irToRow = new IndexedRecordToRowStructGenerator(cid, null, columnList);
|
||||
@@ -306,123 +286,117 @@ if (hasOutputOnly || asInputComponent) {
|
||||
}
|
||||
%>
|
||||
|
||||
// Iterate through the incoming data.
|
||||
boolean available_<%=cid%> = reader_<%=cid%>.start();
|
||||
// Iterate through the incoming data.
|
||||
boolean available_<%=cid%> = reader_<%=cid%>.start();
|
||||
|
||||
resourceMap.put("reader_<%=cid%>", reader_<%=cid%>);
|
||||
resourceMap.put("reader_<%=cid%>", reader_<%=cid%>);
|
||||
|
||||
for (; available_<%=cid%>; available_<%=cid%> = reader_<%=cid%>.advance()) {
|
||||
nb_line_<%=cid %>++;
|
||||
for (; available_<%=cid%>; available_<%=cid%> = reader_<%=cid%>.advance()) {
|
||||
nb_line_<%=cid %>++;
|
||||
|
||||
<%if(hasDataOutput) {%>
|
||||
if (multi_output_is_allowed_<%=cid%>) {
|
||||
<%if(main!=null){%>
|
||||
<%=main.getName()%> = null;
|
||||
<%}%>
|
||||
<%if(hasDataOutput) {%>
|
||||
if (multi_output_is_allowed_<%=cid%>) {
|
||||
<%if(main!=null){%>
|
||||
<%=main.getName()%> = null;
|
||||
<%}%>
|
||||
|
||||
<%if(reject!=null){%>
|
||||
<%=reject.getName()%> = null;
|
||||
<%}%>
|
||||
}
|
||||
<%}%>
|
||||
<%if(reject!=null){%>
|
||||
<%=reject.getName()%> = null;
|
||||
<%}%>
|
||||
}
|
||||
<%}%>
|
||||
|
||||
try {
|
||||
Object data_<%=cid%> = reader_<%=cid%>.getCurrent();
|
||||
<%
|
||||
if (main != null) {
|
||||
%>
|
||||
try {
|
||||
Object data_<%=cid%> = reader_<%=cid%>.getCurrent();
|
||||
<%
|
||||
if (main != null) {
|
||||
%>
|
||||
|
||||
if(multi_output_is_allowed_<%=cid%>) {
|
||||
<%=main.getName()%> = new <%=main.getName() %>Struct();
|
||||
}
|
||||
if(multi_output_is_allowed_<%=cid%>) {
|
||||
<%=main.getName()%> = new <%=main.getName() %>Struct();
|
||||
}
|
||||
|
||||
<%
|
||||
irToRow.generateConvertRecord("data_" + cid, main.getName(), main.getMetadataTable().getListColumns());
|
||||
}
|
||||
%>
|
||||
} catch (org.talend.components.api.exception.DataRejectException e_<%=cid%>) {
|
||||
java.util.Map<String,Object> info_<%=cid%> = e_<%=cid%>.getRejectInfo();
|
||||
<%
|
||||
if (reject!=null) {
|
||||
%>
|
||||
Object data_<%=cid%> = info_<%=cid%>.get("talend_record");
|
||||
<%
|
||||
irToRow.generateConvertRecord("data_" + cid, main.getName(), main.getMetadataTable().getListColumns());
|
||||
}
|
||||
%>
|
||||
} catch (org.talend.components.api.exception.DataRejectException e_<%=cid%>) {
|
||||
java.util.Map<String,Object> info_<%=cid%> = e_<%=cid%>.getRejectInfo();
|
||||
<%
|
||||
if (reject!=null) {
|
||||
%>
|
||||
Object data_<%=cid%> = info_<%=cid%>.get("talend_record");
|
||||
|
||||
if (multi_output_is_allowed_<%=cid%>) {
|
||||
<%=reject.getName()%> = new <%=reject.getName() %>Struct();
|
||||
}
|
||||
try{
|
||||
<%
|
||||
irToRow.generateConvertRecord("data_" + cid, reject.getName());
|
||||
%>
|
||||
}catch(java.lang.Exception e){
|
||||
// do nothing
|
||||
}
|
||||
<%
|
||||
Set<String> commonColumns = new HashSet<String>();
|
||||
if (multi_output_is_allowed_<%=cid%>) {
|
||||
<%=reject.getName()%> = new <%=reject.getName() %>Struct();
|
||||
}
|
||||
try{
|
||||
<%
|
||||
irToRow.generateConvertRecord("data_" + cid, reject.getName());
|
||||
%>
|
||||
}catch(java.lang.Exception e){
|
||||
// do nothing
|
||||
}
|
||||
<%
|
||||
Set<String> commonColumns = new HashSet<String>();
|
||||
|
||||
for (IMetadataColumn column : columnList) {
|
||||
commonColumns.add(column.getLabel());
|
||||
}
|
||||
for (IMetadataColumn column : columnList) {
|
||||
commonColumns.add(column.getLabel());
|
||||
}
|
||||
|
||||
//pass error columns
|
||||
List<IMetadataColumn> rejectColumns = reject.getMetadataTable().getListColumns();
|
||||
for(IMetadataColumn column : rejectColumns) {
|
||||
String columnName = column.getLabel();
|
||||
//pass error columns
|
||||
List<IMetadataColumn> rejectColumns = reject.getMetadataTable().getListColumns();
|
||||
for(IMetadataColumn column : rejectColumns) {
|
||||
String columnName = column.getLabel();
|
||||
|
||||
// JavaType javaType = JavaTypesManager.getJavaTypeFromId(column.getTalendType());
|
||||
String typeToGenerate = JavaTypesManager.getTypeToGenerate(column.getTalendType(), column.isNullable());
|
||||
// JavaType javaType = JavaTypesManager.getJavaTypeFromId(column.getTalendType());
|
||||
String typeToGenerate = JavaTypesManager.getTypeToGenerate(column.getTalendType(), column.isNullable());
|
||||
|
||||
//error columns
|
||||
if(!commonColumns.contains(columnName)) {
|
||||
%>
|
||||
<%=reject.getName()%>.<%=columnName%> = (<%=typeToGenerate%>)info_<%=cid%>.get("<%=columnName%>");
|
||||
<%
|
||||
}
|
||||
}
|
||||
} else {
|
||||
%>
|
||||
//TODO use a method instead of getting method by the special key "error/errorMessage"
|
||||
Object errorMessage_<%=cid%> = null;
|
||||
if(info_<%=cid%>.containsKey("error")){
|
||||
errorMessage_<%=cid%> = info_<%=cid%>.get("error");
|
||||
}else if(info_<%=cid%>.containsKey("errorMessage")){
|
||||
errorMessage_<%=cid%> = info_<%=cid%>.get("errorMessage");
|
||||
}else{
|
||||
errorMessage_<%=cid%> = "Rejected but error message missing";
|
||||
}
|
||||
errorMessage_<%=cid%> = "Row "+ nb_line_<%=cid %> + ": "+errorMessage_<%=cid%>;
|
||||
System.err.println(errorMessage_<%=cid%>);
|
||||
<%
|
||||
}
|
||||
if (main != null) {
|
||||
%>
|
||||
// If the record is reject, the main line record should put NULL
|
||||
<%=main.getName()%> = null;
|
||||
<%
|
||||
}
|
||||
%>
|
||||
} // end of catch
|
||||
//error columns
|
||||
if(!commonColumns.contains(columnName)) {
|
||||
%>
|
||||
<%=reject.getName()%>.<%=columnName%> = (<%=typeToGenerate%>)info_<%=cid%>.get("<%=columnName%>");
|
||||
<%
|
||||
}
|
||||
}
|
||||
} else {
|
||||
%>
|
||||
//TODO use a method instead of getting method by the special key "error/errorMessage"
|
||||
Object errorMessage_<%=cid%> = null;
|
||||
if(info_<%=cid%>.containsKey("error")){
|
||||
errorMessage_<%=cid%> = info_<%=cid%>.get("error");
|
||||
}else if(info_<%=cid%>.containsKey("errorMessage")){
|
||||
errorMessage_<%=cid%> = info_<%=cid%>.get("errorMessage");
|
||||
}else{
|
||||
errorMessage_<%=cid%> = "Rejected but error message missing";
|
||||
}
|
||||
errorMessage_<%=cid%> = "Row "+ nb_line_<%=cid %> + ": "+errorMessage_<%=cid%>;
|
||||
System.err.println(errorMessage_<%=cid%>);
|
||||
<%
|
||||
}
|
||||
if (main != null) {
|
||||
%>
|
||||
// If the record is reject, the main line record should put NULL
|
||||
<%=main.getName()%> = null;
|
||||
<%
|
||||
}
|
||||
%>
|
||||
}
|
||||
<%
|
||||
// The for loop around the incoming records from the reader is left open.
|
||||
|
||||
|
||||
} else if (hasInput) {
|
||||
%>
|
||||
org.talend.codegen.enforcer.IncomingSchemaEnforcer incomingEnforcer_<%=cid%> = null;
|
||||
if (sourceOrSink_<%=cid%> instanceof org.talend.components.api.component.runtime.Sink) {
|
||||
org.talend.components.api.component.runtime.Sink sink_<%=cid%> =
|
||||
(org.talend.components.api.component.runtime.Sink)sourceOrSink_<%=cid%>;
|
||||
org.talend.components.api.component.runtime.WriteOperation writeOperation_<%=cid%> = sink_<%=cid%>.createWriteOperation();
|
||||
if (doesNodeBelongToRequest_<%=cid%>) {
|
||||
writeOperation_<%=cid%>.initialize(container_<%=cid%>);
|
||||
}
|
||||
writer_<%=cid%> = writeOperation_<%=cid%>.createWriter(container_<%=cid%>);
|
||||
if (doesNodeBelongToRequest_<%=cid%>) {
|
||||
writer_<%=cid%>.open("<%=cid%>");
|
||||
}
|
||||
org.talend.components.api.component.runtime.Sink sink_<%=cid%> =
|
||||
(org.talend.components.api.component.runtime.Sink)sourceOrSink_<%=cid%>;
|
||||
org.talend.components.api.component.runtime.WriteOperation writeOperation_<%=cid%> = sink_<%=cid%>.createWriteOperation();
|
||||
writeOperation_<%=cid%>.initialize(container_<%=cid%>);
|
||||
org.talend.components.api.component.runtime.Writer writer_<%=cid%> = writeOperation_<%=cid%>.createWriter(container_<%=cid%>);
|
||||
writer_<%=cid%>.open("<%=cid%>");
|
||||
|
||||
resourceMap.put("writer_<%=cid%>", writer_<%=cid%>);
|
||||
|
||||
resourceMap.put("writer_<%=cid%>", writer_<%=cid%>);
|
||||
} // end of "sourceOrSink_<%=cid%> instanceof ...Sink"
|
||||
org.talend.components.api.component.Connector c_<%=cid%> = null;
|
||||
for (org.talend.components.api.component.Connector currentConnector : props_<%=cid %>.getAvailableConnectors(null, false)) {
|
||||
if (currentConnector.getName().equals("MAIN")) {
|
||||
@@ -431,7 +405,8 @@ if (hasOutputOnly || asInputComponent) {
|
||||
}
|
||||
}
|
||||
org.apache.avro.Schema designSchema_<%=cid%> = props_<%=cid %>.getSchema(c_<%=cid%>, false);
|
||||
incomingEnforcer_<%=cid%> = new org.talend.codegen.enforcer.IncomingSchemaEnforcer(designSchema_<%=cid%>);
|
||||
org.talend.codegen.enforcer.IncomingSchemaEnforcer incomingEnforcer_<%=cid%>
|
||||
= new org.talend.codegen.enforcer.IncomingSchemaEnforcer(designSchema_<%=cid%>);
|
||||
<%
|
||||
List<? extends IConnection> outgoingConns = node.getOutgoingSortedConnections();
|
||||
if (outgoingConns!=null){
|
||||
@@ -467,8 +442,7 @@ if (hasOutputOnly || asInputComponent) {
|
||||
}
|
||||
}
|
||||
}
|
||||
%>
|
||||
|
||||
%>
|
||||
java.lang.Iterable<?> outgoingMainRecordsList_<%=cid%> = new java.util.ArrayList<Object>();
|
||||
java.util.Iterator outgoingMainRecordsIt_<%=cid%> = null;
|
||||
|
||||
|
||||
@@ -58,24 +58,13 @@ if(isTopologyNone) {
|
||||
else if(hasOutputOnly || asInputComponent){
|
||||
%>
|
||||
} // while
|
||||
<%
|
||||
if (hasOutputOnly || asInputComponent) {
|
||||
%>
|
||||
} // end of "if (sourceOrSink_<%=cid%> instanceof ...Source)"
|
||||
<% } %>
|
||||
java.util.Map<String, Object> resultMap_<%=cid%> = null;
|
||||
if (reader_<%=cid%> != null) {
|
||||
reader_<%=cid%>.close();
|
||||
resultMap_<%=cid%> = reader_<%=cid%>.getReturnValues();
|
||||
}
|
||||
reader_<%=cid%>.close();
|
||||
final java.util.Map<String, Object> resultMap_<%=cid%> = reader_<%=cid%>.getReturnValues();
|
||||
<%
|
||||
}else if(hasInput){
|
||||
%>
|
||||
java.util.Map<String, Object> resultMap_<%=cid%> = null;
|
||||
if (writer_<%=cid%> != null) {
|
||||
org.talend.components.api.component.runtime.Result resultObject_<%=cid%> = (org.talend.components.api.component.runtime.Result)writer_<%=cid%>.close();
|
||||
resultMap_<%=cid%> = writer_<%=cid%>.getWriteOperation().finalize(java.util.Arrays.<org.talend.components.api.component.runtime.Result>asList(resultObject_<%=cid%>), container_<%=cid%>);
|
||||
}
|
||||
org.talend.components.api.component.runtime.Result resultObject_<%=cid%> = (org.talend.components.api.component.runtime.Result)writer_<%=cid%>.close();
|
||||
final java.util.Map<String, Object> resultMap_<%=cid%> = writer_<%=cid%>.getWriteOperation().finalize(java.util.Arrays.<org.talend.components.api.component.runtime.Result>asList(resultObject_<%=cid%>), container_<%=cid%>);
|
||||
<%
|
||||
} else {
|
||||
return stringBuffer.toString();
|
||||
|
||||
@@ -84,7 +84,7 @@ if(hasInput){
|
||||
for (int i = 0; i < input_columnList.size(); i++) {
|
||||
if(!input_columnList.get(i).getTalendType().equals("id_Dynamic")) {
|
||||
%>
|
||||
if (incomingEnforcer_<%=cid%> != null && incomingEnforcer_<%=cid%>.getDesignSchema().getField("<%=input_columnList.get(i)%>") == null){
|
||||
if (incomingEnforcer_<%=cid%>.getDesignSchema().getField("<%=input_columnList.get(i)%>") == null){
|
||||
incomingEnforcer_<%=cid%>.addIncomingNodeField("<%=input_columnList.get(i)%>", ((Object) <%=inputConn.getName()%>.<%=input_columnList.get(i)%>).getClass().getCanonicalName());
|
||||
shouldCreateRuntimeSchemaForIncomingNode = true;
|
||||
}
|
||||
@@ -92,7 +92,7 @@ if(hasInput){
|
||||
}
|
||||
}
|
||||
%>
|
||||
if (shouldCreateRuntimeSchemaForIncomingNode && incomingEnforcer_<%=cid%> != null){
|
||||
if (shouldCreateRuntimeSchemaForIncomingNode){
|
||||
incomingEnforcer_<%=cid%>.createRuntimeSchema();
|
||||
}
|
||||
<%
|
||||
@@ -111,7 +111,7 @@ if(hasInput){
|
||||
|
||||
if (dynamicPos != -1) {
|
||||
%>
|
||||
if (incomingEnforcer_<%=cid%> != null && !incomingEnforcer_<%=cid%>.areDynamicFieldsInitialized()) {
|
||||
if (!incomingEnforcer_<%=cid%>.areDynamicFieldsInitialized()) {
|
||||
// Initialize the dynamic columns when they are first encountered.
|
||||
for (routines.system.DynamicMetadata dm_<%=cid%> : <%=inputConn.getName()%>.<%=input_columnList.get(dynamicPos).getLabel()%>.metadatas) {
|
||||
incomingEnforcer_<%=cid%>.addDynamicField(
|
||||
@@ -120,8 +120,7 @@ if(hasInput){
|
||||
dm_<%=cid%>.getLogicalType(),
|
||||
dm_<%=cid%>.getFormat(),
|
||||
dm_<%=cid%>.getDescription(),
|
||||
dm_<%=cid%>.isNullable(),
|
||||
dm_<%=cid%>.isKey());
|
||||
dm_<%=cid%>.isNullable());
|
||||
}
|
||||
incomingEnforcer_<%=cid%>.createRuntimeSchema();
|
||||
}
|
||||
@@ -129,26 +128,22 @@ if(hasInput){
|
||||
}
|
||||
|
||||
%>
|
||||
if (incomingEnforcer_<%=cid%> != null) {
|
||||
incomingEnforcer_<%=cid%>.createNewRecord();
|
||||
}
|
||||
incomingEnforcer_<%=cid%>.createNewRecord();
|
||||
<%
|
||||
for (int i = 0; i < input_columnList.size(); i++) { // column
|
||||
IMetadataColumn column = input_columnList.get(i);
|
||||
if (dynamicPos != i) {
|
||||
%>
|
||||
//skip the put action if the input column doesn't appear in component runtime schema
|
||||
if (incomingEnforcer_<%=cid%> != null && incomingEnforcer_<%=cid%>.getRuntimeSchema().getField("<%=input_columnList.get(i)%>") != null){
|
||||
if (incomingEnforcer_<%=cid%>.getRuntimeSchema().getField("<%=input_columnList.get(i)%>") != null){
|
||||
incomingEnforcer_<%=cid%>.put("<%=column.getLabel()%>", <%=inputConn.getName()%>.<%=column.getLabel()%>);
|
||||
}
|
||||
<%
|
||||
} else {
|
||||
%>
|
||||
if (incomingEnforcer_<%=cid%> != null) {
|
||||
for (int i = 0; i < <%=inputConn.getName()%>.<%=column.getLabel()%>.getColumnCount(); i++) {
|
||||
incomingEnforcer_<%=cid%>.put(<%=inputConn.getName()%>.<%=column.getLabel()%>.getColumnMetadata(i).getName(),
|
||||
<%=inputConn.getName()%>.<%=column.getLabel()%>.getColumnValue(i));
|
||||
}
|
||||
for (int i = 0; i < <%=inputConn.getName()%>.<%=column.getLabel()%>.getColumnCount(); i++) {
|
||||
incomingEnforcer_<%=cid%>.put(<%=inputConn.getName()%>.<%=column.getLabel()%>.getColumnMetadata(i).getName(),
|
||||
<%=inputConn.getName()%>.<%=column.getLabel()%>.getColumnValue(i));
|
||||
}
|
||||
<%
|
||||
}
|
||||
@@ -182,11 +177,7 @@ if(hasInput){
|
||||
} // propInfo
|
||||
|
||||
%>
|
||||
|
||||
org.apache.avro.generic.IndexedRecord data_<%=cid%> = null;
|
||||
if (incomingEnforcer_<%=cid%> != null) {
|
||||
data_<%=cid%> = incomingEnforcer_<%=cid%>.getCurrentRecord();
|
||||
}
|
||||
org.apache.avro.generic.IndexedRecord data_<%=cid%> = incomingEnforcer_<%=cid%>.getCurrentRecord();
|
||||
|
||||
<%
|
||||
boolean isParallelize ="true".equalsIgnoreCase(ElementParameterParser.getValue(node, "__PARALLELIZE__"));
|
||||
@@ -199,9 +190,8 @@ if(hasInput){
|
||||
}
|
||||
}
|
||||
%>
|
||||
if (writer_<%=cid%> != null && data_<%=cid%> != null) {
|
||||
writer_<%=cid%>.write(data_<%=cid%>);
|
||||
}
|
||||
|
||||
writer_<%=cid%>.write(data_<%=cid%>);
|
||||
|
||||
nb_line_<%=cid %>++;
|
||||
<%if(hasMainOutput){
|
||||
|
||||
@@ -170,8 +170,16 @@ class IndexedRecordToRowStructGenerator {
|
||||
if (columnName.equals(dynamicColName)) {
|
||||
%>
|
||||
java.util.Map<String, Object> dynamicValue_<%=cid%> = (java.util.Map<String, Object>) <%=codeVarSchemaEnforcer%>.get(<%=i%>);
|
||||
org.apache.avro.Schema dynSchema_<%=cid%> = ((org.talend.codegen.enforcer.OutgoingDynamicSchemaEnforcer) <%=codeVarSchemaEnforcer%>).getDynamicFieldsSchema();
|
||||
for (org.apache.avro.Schema.Field dynamicField_<%=cid%> : dynSchema_<%=cid%>.getFields()){
|
||||
String name = dynamicField_<%=cid%>.name();
|
||||
if("true".equals(dynamicField_<%=cid%>.getProp("ENABLE_SPECIAL_TABLENAME"))){
|
||||
dynamicValue_<%=cid%>.put(dynamicField_<%=cid%>.getProp("talend.field.dbColumnName"), dynamicValue_<%=cid%>.get(name));
|
||||
dynamicValue_<%=cid%>.remove(name);
|
||||
}
|
||||
}
|
||||
for (java.util.Map.Entry<String, Object> dynamicValueEntry_<%=cid%> : dynamicValue_<%=cid%>.entrySet()) {
|
||||
<%=codeVarDynamic%>.addColumnValue(dynamicValueEntry_<%=cid%>.getValue());
|
||||
<%=codeVarDynamic%>.setColumnValue(<%=codeVarDynamic%>.getIndex(dynamicValueEntry_<%=cid%>.getKey()), dynamicValueEntry_<%=cid%>.getValue());
|
||||
}
|
||||
<%=codeVarRowStruct%>.<%=dynamicColName%> = <%=codeVarDynamic%>;
|
||||
<%
|
||||
|
||||
@@ -73,9 +73,6 @@ import pigudf.<%=routine%>;
|
||||
import routines.<%=routine%>;
|
||||
<% }
|
||||
}%>
|
||||
<%for (String codesJar : CodeGeneratorRoutine.getRequiredCodesJarName(process)) {%>
|
||||
import <%=codesJar%>;
|
||||
<%}%>
|
||||
import routines.system.*;
|
||||
import routines.system.api.*;
|
||||
import java.text.ParseException;
|
||||
@@ -385,123 +382,20 @@ public <%=JavaTypesManager.getTypeToGenerate(ctxParam.getType(),true)%> get<%=Ch
|
||||
|
||||
<%
|
||||
INode jobCatcherNode = null;
|
||||
|
||||
//one matched component or part, one thread
|
||||
//why not computed by cpu or resource : please image this case :
|
||||
//loop==>(input==>(twritexmlfield A)==>(twritexmlfield B)==>(twritexmlfield C)==>output), dead lock as cycle dependency and only one thead in thread pool
|
||||
//maybe newCachedThreadPool is a better idea, but that have risk for creating more threads, then more memory for TDI-47230
|
||||
//why not generate thread pool object in subprocess scope :
|
||||
// 1: major reason : difficult to control the var scope, somewhere can't access it, then compiler issue
|
||||
// 2: we may need this thread pool for bigger scope, not only for twritexmlfield/twritejsonfield in future
|
||||
// 3: we don't suppose this thread pool cost big resource after all tasks done, so we can shutdown it more later,
|
||||
// for example, most time, user will use less than 3 twritexmlfield in one job, then 3 threads thread pool, we can close them in job finish code part,
|
||||
// not a big cost to keep that. And of course, we best to start&clean it in subprocess finish, but that's risk of 1 above.
|
||||
int threadPoolSize = 0;
|
||||
boolean tHMapExists = false;
|
||||
boolean tHMapOutExists = false;
|
||||
boolean tRESTRequestLoopExists = false;
|
||||
for (INode nodeInProcess : processNodes) {
|
||||
String componentName = nodeInProcess.getComponent().getName();
|
||||
|
||||
if(jobCatcherNode==null && "tJobStructureCatcher".equals(componentName)) {
|
||||
if("tJobStructureCatcher".equals(componentName)) {
|
||||
jobCatcherNode = nodeInProcess;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!nodeInProcess.isActivate()) continue;
|
||||
|
||||
if("tHMap".equals(componentName)) {
|
||||
tHMapExists = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if("tHMapOut".equals(componentName)) {
|
||||
tHMapOutExists = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if("tRESTRequestLoop".equals(componentName)) {
|
||||
tRESTRequestLoopExists = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if("tWriteXMLFieldOut".equals(componentName)) {
|
||||
IConnection nextMergeConn = NodeUtil.getNextMergeConnection(nodeInProcess);
|
||||
if(nextMergeConn == null || nextMergeConn.getInputId()==1){
|
||||
threadPoolSize++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(threadPoolSize>0) {
|
||||
if(tRESTRequestLoopExists) {//miscroservice
|
||||
%>
|
||||
private class DaemonThreadFactory implements java.util.concurrent.ThreadFactory {
|
||||
java.util.concurrent.ThreadFactory factory = java.util.concurrent.Executors.defaultThreadFactory();
|
||||
|
||||
public java.lang.Thread newThread(java.lang.Runnable r) {
|
||||
java.lang.Thread t = factory.newThread(r);
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
}
|
||||
}
|
||||
<%
|
||||
}
|
||||
|
||||
if(tHMapExists || tHMapOutExists) {
|
||||
%>
|
||||
private final java.util.concurrent.ExecutorService es = java.util.concurrent.Executors.newFixedThreadPool(<%=threadPoolSize%> <%if(tRESTRequestLoopExists) {%>,new DaemonThreadFactory()<%}%>);
|
||||
<%
|
||||
} else {
|
||||
%>
|
||||
private final java.util.concurrent.ExecutorService es = java.util.concurrent.Executors.newCachedThreadPool(<%if(tRESTRequestLoopExists) {%>new DaemonThreadFactory()<%}%>);
|
||||
<%
|
||||
}
|
||||
|
||||
if(tRESTRequestLoopExists) {//miscroservice
|
||||
%>
|
||||
{
|
||||
java.lang.Runtime.getRuntime().addShutdownHook(new java.lang.Thread() {
|
||||
public void run() {
|
||||
es.shutdown();
|
||||
try {
|
||||
if(!es.awaitTermination(60, java.util.concurrent.TimeUnit.SECONDS)) {
|
||||
es.shutdownNow();
|
||||
if(!es.awaitTermination(60, java.util.concurrent.TimeUnit.SECONDS)) {
|
||||
|
||||
}
|
||||
}
|
||||
} catch (java.lang.InterruptedException ie) {
|
||||
es.shutdownNow();
|
||||
} catch (java.lang.Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
<%
|
||||
}
|
||||
}
|
||||
|
||||
boolean enableLogStash = !Boolean.getBoolean("deactivate_extended_component_log") && (jobCatcherNode!=null);
|
||||
boolean enable_runtime_lineage_log = NodeUtil.isJobUsingRuntimeLineage(process) && (jobCatcherNode!=null);
|
||||
|
||||
if(jobCatcherNode!=null) {
|
||||
%>
|
||||
private final JobStructureCatcherUtils <%=jobCatcherNode.getUniqueName() %> = new JobStructureCatcherUtils(jobName, "<%=process.getId() %>", "<%=process.getVersion() %>");
|
||||
<%
|
||||
}
|
||||
if(enable_runtime_lineage_log) {
|
||||
%>
|
||||
private org.talend.job.audit.JobAuditLogger runtime_lineage_logger_<%=jobCatcherNode.getUniqueName()%> = null;
|
||||
<%
|
||||
}
|
||||
|
||||
boolean enableLogStash = jobCatcherNode != null;
|
||||
if (enableLogStash) {
|
||||
%>
|
||||
private final JobStructureCatcherUtils <%=jobCatcherNode.getUniqueName() %> = new JobStructureCatcherUtils(jobName, "<%=process.getId() %>", "<%=process.getVersion() %>");
|
||||
private org.talend.job.audit.JobAuditLogger auditLogger_<%=jobCatcherNode.getUniqueName()%> = null;
|
||||
|
||||
private RunStat runStat = new RunStat(<%=jobCatcherNode.getUniqueName() %>, System.getProperty("audit.interval"));
|
||||
private RunStat runStat = new RunStat(<%=jobCatcherNode.getUniqueName() %>);
|
||||
<%
|
||||
} else if(stats) {
|
||||
%>
|
||||
@@ -530,20 +424,6 @@ private RunTrace runTrace = new RunTrace();
|
||||
globalMap.put(KEY_DB_DATASOURCES, talendDataSources);
|
||||
globalMap.put(KEY_DB_DATASOURCES_RAW, new java.util.HashMap<String, javax.sql.DataSource>(dataSources));
|
||||
}
|
||||
|
||||
public void setDataSourceReferences(List serviceReferences) throws Exception{
|
||||
|
||||
java.util.Map<String, routines.system.TalendDataSource> talendDataSources = new java.util.HashMap<String, routines.system.TalendDataSource>();
|
||||
java.util.Map<String, javax.sql.DataSource> dataSources = new java.util.HashMap<String, javax.sql.DataSource>();
|
||||
|
||||
for (java.util.Map.Entry<String, javax.sql.DataSource> entry : BundleUtils.getServices(serviceReferences, javax.sql.DataSource.class).entrySet()) {
|
||||
dataSources.put(entry.getKey(), entry.getValue());
|
||||
talendDataSources.put(entry.getKey(), new routines.system.TalendDataSource(entry.getValue()));
|
||||
}
|
||||
|
||||
globalMap.put(KEY_DB_DATASOURCES, talendDataSources);
|
||||
globalMap.put(KEY_DB_DATASOURCES_RAW, new java.util.HashMap<String, javax.sql.DataSource>(dataSources));
|
||||
}
|
||||
|
||||
<%
|
||||
for (INode logCatcher : process.getNodesOfType("tLogCatcher")) {
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
org.talend.designer.codegen.config.CodeGeneratorArgument
|
||||
org.talend.designer.codegen.config.NodesSubTree
|
||||
org.talend.core.model.process.IProcess
|
||||
org.talend.core.model.process.ProcessUtils
|
||||
org.talend.core.model.utils.NodeUtil
|
||||
org.talend.core.model.process.IContextParameter
|
||||
java.util.List
|
||||
@@ -29,13 +28,7 @@ INode node = (INode)codeGenArgument.getArgument();
|
||||
boolean containsTPartitioner = node.getProcess().getNodesOfType("tPartitioner").size() > 0 ? true : false;
|
||||
boolean isRunJob = "tRunJob".equals(node.getComponent().getName());
|
||||
IProcess process = node.getProcess();
|
||||
|
||||
boolean isTestContainer=ProcessUtils.isTestContainer(process);
|
||||
String className = process.getName();
|
||||
if (isTestContainer) {
|
||||
className = className + "Test";
|
||||
}
|
||||
|
||||
|
||||
NodesSubTree subTree = (NodesSubTree) codeGenArgument.getSubTree();
|
||||
ECodePart codePart = codeGenArgument.getCodePart();
|
||||
//boolean trace = codeGenArgument.isTrace();
|
||||
@@ -85,10 +78,10 @@ for (IConnection iterateConn : iterateConnSet) { //1
|
||||
@Override
|
||||
public Object put(String key, Object value) {
|
||||
<%if(!isRunInMultiThread){%>
|
||||
synchronized (<%=className%>.this.obj) {
|
||||
synchronized (<%=process.getName()%>.this.obj) {
|
||||
<%}%>
|
||||
super.put(key, value);
|
||||
return <%=className%>.this.globalMap.put(key, value);
|
||||
return <%=process.getName()%>.this.globalMap.put(key, value);
|
||||
<%if(!isRunInMultiThread){%>
|
||||
}
|
||||
<%}%>
|
||||
@@ -165,7 +158,7 @@ for (IConnection iterateConn : iterateConnSet) { //1
|
||||
synchronized (globalMap) {
|
||||
this.globalMap = java.util.Collections.synchronizedMap(new ThreadedMap(globalMap));
|
||||
<%}else{%>
|
||||
synchronized (<%=className%>.this.obj) {
|
||||
synchronized (<%=process.getName()%>.this.obj) {
|
||||
this.globalMap = new ThreadedMap(globalMap);
|
||||
<%}%>
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
INode startNode = subTree.getRootNode();
|
||||
String startNodeId = startNode.getUniqueName();
|
||||
|
||||
if ("tCollector".equals( startNode.getComponent().getOriginalName() )) {
|
||||
if(startNodeId!=null && startNodeId.startsWith("tCollector")) {
|
||||
List<? extends INode> departitioners = startNode.getProcess().getNodesOfType("tDepartitioner");
|
||||
if(departitioners!=null) {
|
||||
for(INode departitioner : departitioners) {
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
org.talend.core.model.process.IHashConfiguration
|
||||
org.talend.core.model.process.IHashableColumn
|
||||
org.talend.core.model.utils.NodeUtil
|
||||
org.talend.core.model.utils.TalendTextUtils
|
||||
"
|
||||
class="SubProcessHeader"
|
||||
skeleton="subprocess_header_java.skeleton"
|
||||
@@ -184,48 +183,6 @@ public static class <%=conn.getName() %>Struct<%=templateOrigin %> implements ro
|
||||
public <%= typeToGenerate %> get<%=column.getLabel().substring(0, 1).toUpperCase()%><%=column.getLabel().substring(1)%> () {
|
||||
return this.<%=column.getLabel()%>;
|
||||
}
|
||||
|
||||
public Boolean <%=column.getLabel()%>IsNullable(){
|
||||
return <%=column.isNullable()%>;
|
||||
}
|
||||
public Boolean <%=column.getLabel()%>IsKey(){
|
||||
return <%=column.isKey()%>;
|
||||
}
|
||||
public Integer <%=column.getLabel()%>Length(){
|
||||
return <%=column.getLength()%>;
|
||||
}
|
||||
public Integer <%=column.getLabel()%>Precision(){
|
||||
return <%=column.getPrecision()%>;
|
||||
}
|
||||
public String <%=column.getLabel()%>Default(){
|
||||
<% if (column.getDefault() == null) { %>
|
||||
return null;
|
||||
<% } else { %>
|
||||
return "<%=TalendTextUtils.escapeJavaText(TalendTextUtils.removeQuotes(column.getDefault()))%>";
|
||||
<% } %>
|
||||
}
|
||||
public String <%=column.getLabel()%>Comment(){
|
||||
<% if (column.getComment() == null) { %>
|
||||
return null;
|
||||
<% } else { %>
|
||||
return "<%=TalendTextUtils.escapeJavaText(TalendTextUtils.removeQuotes(column.getComment()))%>";
|
||||
<% } %>
|
||||
}
|
||||
public String <%=column.getLabel()%>Pattern(){
|
||||
<% if (column.getPattern() == null) { %>
|
||||
return null;
|
||||
<% } else { %>
|
||||
return "<%=TalendTextUtils.escapeJavaText(TalendTextUtils.removeQuotes(column.getPattern()))%>";
|
||||
<% } %>
|
||||
}
|
||||
public String <%=column.getLabel()%>OriginalDbColumnName(){
|
||||
<% if (column.getOriginalDbColumnName() == null) { %>
|
||||
return null;
|
||||
<% } else { %>
|
||||
return "<%=TalendTextUtils.escapeJavaText(TalendTextUtils.removeQuotes(column.getOriginalDbColumnName()))%>";
|
||||
<% } %>
|
||||
}
|
||||
|
||||
<%
|
||||
if((conn.getLineStyle() == EConnectionType.FLOW_REF) && conn.getTarget().getUniqueName().startsWith("tXMLMap") && "id_Document".equals(javaType.getId())) {
|
||||
%>
|
||||
|
||||
@@ -1,121 +0,0 @@
|
||||
<%
|
||||
//copy from configuration.javajet for tacokit
|
||||
%>
|
||||
|
||||
<%
|
||||
//TODO: modify this part for Maps and nested lists.
|
||||
if (p.getFieldType() == EParameterFieldType.TABLE || p.getFieldType() == EParameterFieldType.TACOKIT_SUGGESTABLE_TABLE) {
|
||||
java.util.List<java.util.Map<String, String>> tableValues = ElementParameterParser.createTableValues((java.util.List<java.util.Map<String, Object>>) p.getValue(), p);
|
||||
String[] items = p.getListItemsDisplayCodeName();
|
||||
String tableName = p.getName().replace('$', '.');
|
||||
boolean primitiveTable = items.length == 1 && items[0].equals(tableName + "[]");
|
||||
String tableNamePrefix = tableName + "[]";
|
||||
for (int i = 0; i < tableValues.size(); i++) {
|
||||
java.util.Map<String, String> lineValues = tableValues.get(i);
|
||||
for (int j = 0; j < items.length; j++) {
|
||||
String key = tableName + "[" + i + "]";
|
||||
if (!primitiveTable) {
|
||||
final String columnName = items[j].substring(tableNamePrefix.length(), items[j].length());
|
||||
key = key + columnName;
|
||||
}
|
||||
String value = lineValues.get(items[j]);
|
||||
if (!org.talend.core.model.utils.ContextParameterUtils.isDynamic(value)) {
|
||||
value = org.talend.core.model.utils.TalendTextUtils.removeQuotes(value);
|
||||
value = org.talend.core.model.utils.TalendTextUtils.addQuotes(value);
|
||||
}
|
||||
|
||||
if(value==null || "null".equals(value.trim())) {
|
||||
value = "(Object)null";
|
||||
}
|
||||
%>
|
||||
component_parameters.put("<%=key%>",String.valueOf(<%=value%>));
|
||||
<%
|
||||
}
|
||||
}
|
||||
} else if(p.getFieldType() == EParameterFieldType.SCHEMA_TYPE) {
|
||||
final String parameterName = p.getName();
|
||||
IConnection connection = null;
|
||||
final List<? extends IConnection> connections = NodeUtil.getOutgoingConnections(node, p.getContext());
|
||||
if(connections != null && !connections.isEmpty()) {
|
||||
connection = connections.get(0);
|
||||
}
|
||||
if(connection != null) {
|
||||
IMetadataTable metaTable = connection.getMetadataTable();
|
||||
List<IMetadataColumn> columns = metaTable.getListColumns();
|
||||
for(int i = 0; i < columns.size(); i++) {
|
||||
IMetadataColumn column = columns.get(i);
|
||||
%>
|
||||
component_parameters.put("<%=parameterName%>[<%=i%>]", "<%=column.getLabel()%>");
|
||||
<%
|
||||
}
|
||||
}
|
||||
} else if (p.getFieldType() == EParameterFieldType.TACOKIT_INPUT_SCHEMA) {
|
||||
final String parameterName = p.getName();
|
||||
IConnection connection = null;
|
||||
final List<? extends IConnection> connections = NodeUtil.getIncomingConnections(node, p.getContext());
|
||||
if(connections != null && !connections.isEmpty()) {
|
||||
connection = connections.get(0);
|
||||
}
|
||||
if(connection != null) {
|
||||
IMetadataTable metaTable = connection.getMetadataTable();
|
||||
List<IMetadataColumn> columns = metaTable.getListColumns();
|
||||
for(int i = 0; i < columns.size(); i++) {
|
||||
IMetadataColumn column = columns.get(i);
|
||||
%>
|
||||
component_parameters.put("<%=parameterName%>[<%=i%>]", "<%=column.getLabel()%>");
|
||||
<%
|
||||
}
|
||||
}
|
||||
} else {
|
||||
final String key;
|
||||
if(!p.getName().contains("$")){
|
||||
key = p.getName();
|
||||
}else{
|
||||
final StringBuilder keyBuilder = new StringBuilder();
|
||||
for (String part : p.getName().split("\\.")) {
|
||||
if (keyBuilder.length() != 0) {
|
||||
keyBuilder.append(".");
|
||||
}
|
||||
if (part.contains("$") && !part.startsWith("$")) {
|
||||
keyBuilder.append(part.replace("$", "."));
|
||||
} else {
|
||||
keyBuilder.append(part);
|
||||
}
|
||||
}
|
||||
key = keyBuilder.toString();
|
||||
}
|
||||
String value = null;
|
||||
if(p.getFieldType() == EParameterFieldType.PASSWORD) {
|
||||
continue;
|
||||
} else {
|
||||
value = ElementParameterParser.getStringElementParameterValue(p);
|
||||
if (!org.talend.core.model.utils.ContextParameterUtils.isDynamic(value)) {
|
||||
value = org.talend.core.model.utils.TalendTextUtils.removeQuotes(value);
|
||||
value = org.talend.core.model.utils.TalendTextUtils.addQuotes(value);
|
||||
}
|
||||
}
|
||||
if (value != null) {
|
||||
if(key.endsWith("$maxBatchSize")){
|
||||
%>
|
||||
|
||||
<%
|
||||
} else if(p.getFieldType() == EParameterFieldType.CLOSED_LIST) {
|
||||
String valueTemp = org.talend.core.model.utils.TalendTextUtils.removeQuotes(value);
|
||||
if ("".equals(valueTemp)) {
|
||||
String[] listItemsDisplayCodeValue = p.getListItemsDisplayCodeName();
|
||||
if(listItemsDisplayCodeValue != null && listItemsDisplayCodeValue.length > 0){
|
||||
valueTemp = listItemsDisplayCodeValue[0];
|
||||
value = org.talend.core.model.utils.TalendTextUtils.addQuotes(valueTemp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(value==null || "null".equals(value.trim())) {
|
||||
value = "(Object)null";
|
||||
}
|
||||
%>
|
||||
component_parameters.put("<%=key%>", String.valueOf(<%=value%>));
|
||||
<%
|
||||
} // else do not put value in configuration
|
||||
}
|
||||
%>
|
||||
@@ -68,14 +68,6 @@
|
||||
id="org.talend.designer.components.model.UserComponentsProvider">
|
||||
</ComponentsProvider>
|
||||
</extension>
|
||||
<extension
|
||||
point="org.talend.core.components_provider">
|
||||
<ComponentsProvider
|
||||
class="org.talend.designer.codegen.components.model.SharedStudioUserComponentProvider"
|
||||
folderName="user"
|
||||
id="org.talend.designer.codegen.components.model.SharedStudioUserComponentProvider">
|
||||
</ComponentsProvider>
|
||||
</extension>
|
||||
<extension
|
||||
point="org.eclipse.core.runtime.preferences">
|
||||
<initializer
|
||||
|
||||
@@ -10,7 +10,6 @@ CodeGenerator.getGraphicalNode2=------process.getGeneratingNodes()------
|
||||
CodeGenerator.JET.TimeOut=JET initialisation Time Out
|
||||
CodeGenerator.newLine=\n\n\n\n
|
||||
CodeGenerator.Node.NotFound=Node not found in current process
|
||||
CodeGenerator.Components.NotFound={0}: Component is missing: {1}; use -D{2}=false in your studio or commandline to skip this check, and a warning message will be logged.
|
||||
JavaRoutineSynchronizer.UnsupportedOperation.Exception1=method not implemented: org.talend.designer.codegen.JavaRoutineSynchronizer line:49
|
||||
JavaRoutineSynchronizer.UnsupportedOperation.Exception2=method not implemented: org.talend.designer.codegen.JavaRoutineSynchronizer line:58
|
||||
JetSkeletonManager.unableLoad=unable to load skeleton update cache file
|
||||
|
||||
@@ -66,7 +66,6 @@ import org.talend.designer.codegen.model.CodeGeneratorEmittersPoolFactory;
|
||||
import org.talend.designer.codegen.model.CodeGeneratorInternalTemplatesFactoryProvider;
|
||||
import org.talend.designer.codegen.proxy.JetProxy;
|
||||
import org.talend.designer.core.generic.model.Component;
|
||||
import org.talend.designer.core.model.components.DummyComponent;
|
||||
import org.talend.designer.runprocess.ProcessorUtilities;
|
||||
|
||||
/**
|
||||
@@ -846,25 +845,6 @@ public class CodeGenerator implements ICodeGenerator {
|
||||
IComponentFileNaming componentFileNaming = ComponentsFactoryProvider.getFileNamingInstance();
|
||||
|
||||
IComponent component = node.getComponent();
|
||||
if (component instanceof DummyComponent) {
|
||||
if (((DummyComponent) component).isMissingComponent()) {
|
||||
String processName = "";
|
||||
try {
|
||||
IProcess proc = node.getProcess();
|
||||
processName = proc.getName() + " " + proc.getVersion();
|
||||
} catch (Exception e) {
|
||||
ExceptionHandler.process(e);
|
||||
}
|
||||
if (IProcess.ERR_ON_COMPONENT_MISSING) {
|
||||
throw new CodeGeneratorException(Messages.getString("CodeGenerator.Components.NotFound", processName,
|
||||
component.getName(), IProcess.PROP_ERR_ON_COMPONENT_MISSING));
|
||||
}
|
||||
if (ECodePart.BEGIN.equals(part)) {
|
||||
log.warn(Messages.getString("CodeGenerator.Components.NotFound", processName, component.getName(),
|
||||
IProcess.PROP_ERR_ON_COMPONENT_MISSING));
|
||||
}
|
||||
}
|
||||
}
|
||||
// some code unification to handle all component types the same way.
|
||||
String templateURI = component.getTemplateFolder() + TemplateUtil.DIR_SEP
|
||||
+ componentFileNaming.getJetFileName(component.getTemplateNamePrefix(), language.getExtension(), part);
|
||||
|
||||
@@ -69,15 +69,6 @@ public class JavaRoutineSynchronizer extends AbstractRoutineSynchronizer {
|
||||
syncRoutineItems(getRoutines(true), true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void syncAllInnerCodes() throws SystemException {
|
||||
syncInnerCodeItems(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void syncAllInnerCodesForLogOn() throws SystemException {
|
||||
syncInnerCodeItems(true);
|
||||
}
|
||||
|
||||
private void syncRoutineItems(Collection<RoutineItem> routineObjects, boolean forceUpdate) throws SystemException {
|
||||
for (RoutineItem routineItem : routineObjects) {
|
||||
|
||||
@@ -26,8 +26,10 @@ import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
@@ -73,7 +75,6 @@ import org.talend.core.model.components.IComponentsFactory;
|
||||
import org.talend.core.model.components.IComponentsHandler;
|
||||
import org.talend.core.model.components.filters.ComponentsFactoryProviderManager;
|
||||
import org.talend.core.model.components.filters.IComponentFactoryFilter;
|
||||
import org.talend.core.runtime.util.ComponentsLocationProvider;
|
||||
import org.talend.core.ui.IJobletProviderService;
|
||||
import org.talend.core.ui.ISparkJobletProviderService;
|
||||
import org.talend.core.ui.ISparkStreamingJobletProviderService;
|
||||
@@ -82,6 +83,8 @@ import org.talend.core.ui.images.CoreImageProvider;
|
||||
import org.talend.core.utils.TalendCacheUtils;
|
||||
import org.talend.designer.codegen.CodeGeneratorActivator;
|
||||
import org.talend.designer.codegen.i18n.Messages;
|
||||
import org.talend.designer.core.ITisLocalProviderService;
|
||||
import org.talend.designer.core.ITisLocalProviderService.ResClassLoader;
|
||||
import org.talend.designer.core.model.components.ComponentBundleToPath;
|
||||
import org.talend.designer.core.model.components.ComponentFilesNaming;
|
||||
import org.talend.designer.core.model.components.EmfComponent;
|
||||
@@ -161,11 +164,7 @@ public class ComponentsFactory implements IComponentsFactory {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
isInitialising.set(true);
|
||||
try {
|
||||
removeOldComponentsUserFolder();
|
||||
} catch (IOException ex) {
|
||||
ExceptionHandler.process(ex);
|
||||
} // not used anymore
|
||||
removeOldComponentsUserFolder(); // not used anymore
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
// TimeMeasure.display = true;
|
||||
@@ -388,12 +387,10 @@ public class ComponentsFactory implements IComponentsFactory {
|
||||
ComponentManager.saveResource();
|
||||
}
|
||||
|
||||
private void removeOldComponentsUserFolder() throws IOException {
|
||||
private void removeOldComponentsUserFolder() {
|
||||
String userPath = IComponentsFactory.COMPONENTS_INNER_FOLDER + File.separatorChar
|
||||
+ ComponentUtilities.getExtFolder(OLD_COMPONENTS_USER_INNER_FOLDER);
|
||||
ComponentsProviderManager componentsProviderManager = ComponentsProviderManager.getInstance();
|
||||
AbstractComponentsProvider componentsProvider = componentsProviderManager.loadUserComponentsProvidersFromExtension();
|
||||
File componentsLocation = getComponentsLocation(componentsProvider, userPath);
|
||||
File componentsLocation = getComponentsLocation(userPath);
|
||||
if (componentsLocation != null && componentsLocation.exists()) {
|
||||
FilesUtils.removeFolder(componentsLocation, true);
|
||||
}
|
||||
@@ -674,38 +671,114 @@ public class ComponentsFactory implements IComponentsFactory {
|
||||
*
|
||||
* @param currentFolder
|
||||
* @return
|
||||
* @throws IOException
|
||||
* @throws BusinessException
|
||||
*/
|
||||
|
||||
private File getComponentsLocation(AbstractComponentsProvider componentsProvider, String folder) throws IOException {
|
||||
|
||||
if (componentsProvider instanceof ComponentsLocationProvider) {
|
||||
return componentsProvider.getInstallationFolder();
|
||||
} else {
|
||||
String componentsPath = IComponentsFactory.COMPONENTS_LOCATION;
|
||||
IBrandingService breaningService = (IBrandingService) GlobalServiceRegister.getDefault()
|
||||
.getService(IBrandingService.class);
|
||||
if (breaningService.isPoweredOnlyCamel()) {
|
||||
componentsPath = IComponentsFactory.CAMEL_COMPONENTS_LOCATION;
|
||||
}
|
||||
Bundle b = Platform.getBundle(componentsPath);
|
||||
private File getComponentsLocation(String folder) {
|
||||
String componentsPath = IComponentsFactory.COMPONENTS_LOCATION;
|
||||
IBrandingService breaningService = (IBrandingService) GlobalServiceRegister.getDefault()
|
||||
.getService(IBrandingService.class);
|
||||
if (breaningService.isPoweredOnlyCamel()) {
|
||||
componentsPath = IComponentsFactory.CAMEL_COMPONENTS_LOCATION;
|
||||
}
|
||||
Bundle b = Platform.getBundle(componentsPath);
|
||||
|
||||
File file = null;
|
||||
try {
|
||||
File file = null;
|
||||
try {
|
||||
URL url = FileLocator.find(b, new Path(folder), null);
|
||||
if (url == null) {
|
||||
return null;
|
||||
}
|
||||
URL fileUrl = FileLocator.toFileURL(url);
|
||||
file = new File(fileUrl.getPath());
|
||||
} catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
ExceptionHandler.process(e);
|
||||
}
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
private File getComponentsLocation(String folder, AbstractComponentsProvider provider) {
|
||||
File file = null;
|
||||
try {
|
||||
if (provider != null) {
|
||||
file = provider.getInstallationFolder();
|
||||
} else {
|
||||
String componentsPath = IComponentsFactory.COMPONENTS_LOCATION;
|
||||
Bundle b = Platform.getBundle(componentsPath);
|
||||
IBrandingService breaningService = (IBrandingService) GlobalServiceRegister.getDefault()
|
||||
.getService(IBrandingService.class);
|
||||
if (breaningService.isPoweredOnlyCamel()) {
|
||||
componentsPath = IComponentsFactory.CAMEL_COMPONENTS_LOCATION;
|
||||
}
|
||||
URL url = FileLocator.find(b, new Path(folder), null);
|
||||
if (url == null) {
|
||||
return null;
|
||||
}
|
||||
URL fileUrl = FileLocator.toFileURL(url);
|
||||
file = new File(fileUrl.getPath());
|
||||
} catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
ExceptionHandler.process(e);
|
||||
}
|
||||
|
||||
return file;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
ExceptionHandler.process(e);
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
private ResourceBundle getComponentResourceBundle(IComponent currentComp, String source, String cachedPathSource,
|
||||
AbstractComponentsProvider provider) {
|
||||
try {
|
||||
AbstractComponentsProvider currentProvider = provider;
|
||||
if (currentProvider == null) {
|
||||
ComponentsProviderManager componentsProviderManager = ComponentsProviderManager.getInstance();
|
||||
Collection<AbstractComponentsProvider> providers = componentsProviderManager.getProviders();
|
||||
for (AbstractComponentsProvider curProvider : providers) {
|
||||
String path = new Path(curProvider.getInstallationFolder().toString()).toPortableString();
|
||||
if (source.startsWith(path)) {
|
||||
// fix for TDI-19889 and TDI-20507 to get the correct component provider
|
||||
if (cachedPathSource != null) {
|
||||
if (path.contains(cachedPathSource)) {
|
||||
currentProvider = curProvider;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
currentProvider = curProvider;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
String installPath = currentProvider.getInstallationFolder().toString();
|
||||
String label = ComponentFilesNaming.getInstance().getBundleName(currentComp.getName(),
|
||||
installPath.substring(installPath.lastIndexOf(IComponentsFactory.COMPONENTS_INNER_FOLDER)));
|
||||
|
||||
if (currentProvider.isUseLocalProvider()) {
|
||||
// if the component use local provider as storage (for user / ecosystem components)
|
||||
// then get the bundle resource from the current main component provider.
|
||||
|
||||
// note: code here to review later, service like this shouldn't be used...
|
||||
ResourceBundle bundle = null;
|
||||
IBrandingService brandingService = (IBrandingService) GlobalServiceRegister.getDefault()
|
||||
.getService(IBrandingService.class);
|
||||
if (brandingService.isPoweredOnlyCamel()) {
|
||||
bundle = currentProvider.getResourceBundle(label);
|
||||
} else {
|
||||
ITisLocalProviderService service = (ITisLocalProviderService) GlobalServiceRegister.getDefault()
|
||||
.getService(ITisLocalProviderService.class);
|
||||
bundle = service.getResourceBundle(label);
|
||||
}
|
||||
return bundle;
|
||||
} else {
|
||||
ResourceBundle bundle = ResourceBundle.getBundle(label, Locale.getDefault(),
|
||||
new ResClassLoader(currentProvider.getClass().getClassLoader()));
|
||||
return bundle;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
ExceptionHandler.process(e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private String getCodeLanguageSuffix() {
|
||||
@@ -1009,13 +1082,5 @@ public class ComponentsFactory implements IComponentsFactory {
|
||||
public void setComponentsHandler(IComponentsHandler componentsHandler) {
|
||||
this.componentsHandler = componentsHandler;
|
||||
}
|
||||
|
||||
public String getCustomComponentBundlePath() {
|
||||
ComponentsProviderManager componentsProviderManager = ComponentsProviderManager.getInstance();
|
||||
AbstractComponentsProvider componentsProvider = componentsProviderManager.loadUserComponentsProvidersFromExtension();
|
||||
String bundle = componentsProvider.getComponentsBundle();
|
||||
return ComponentBundleToPath.getPathFromBundle(bundle);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@ import org.eclipse.core.runtime.IExtensionRegistry;
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
import org.talend.core.GlobalServiceRegister;
|
||||
import org.talend.core.model.components.AbstractComponentsProvider;
|
||||
import org.talend.core.runtime.util.SharedStudioInfoProvider;
|
||||
import org.talend.core.ui.branding.IBrandingService;
|
||||
import org.talend.designer.codegen.i18n.Messages;
|
||||
|
||||
@@ -70,9 +69,6 @@ public final class ComponentsProviderManager {
|
||||
try {
|
||||
AbstractComponentsProvider componentsProvider = (AbstractComponentsProvider) configurationElement
|
||||
.createExecutableExtension("class"); //$NON-NLS-1$
|
||||
if (componentsProvider instanceof SharedStudioInfoProvider && !((SharedStudioInfoProvider)componentsProvider).isSupportCurrentMode()) {
|
||||
continue;
|
||||
}
|
||||
componentsProvider.setId(id);
|
||||
componentsProvider.setFolderName(folderName);
|
||||
componentsProvider.setContributer(contributerName);
|
||||
@@ -85,15 +81,15 @@ public final class ComponentsProviderManager {
|
||||
}
|
||||
}
|
||||
|
||||
public AbstractComponentsProvider loadUserComponentsProvidersFromExtension() {
|
||||
if (providers == null) {
|
||||
loadComponentsProvidersFromExtension();
|
||||
}
|
||||
for (AbstractComponentsProvider provider : providers) {
|
||||
if (provider instanceof UserComponentsProvider) {
|
||||
return provider;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public AbstractComponentsProvider loadUserComponentsProvidersFromExtension() {
|
||||
if (providers == null) {
|
||||
loadComponentsProvidersFromExtension();
|
||||
}
|
||||
for (AbstractComponentsProvider provider : providers) {
|
||||
if ("org.talend.designer.components.model.UserComponentsProvider".equals(provider.getId())) {
|
||||
return provider;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
package org.talend.designer.codegen.components.model;
|
||||
//============================================================================
|
||||
//
|
||||
//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
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
import org.talend.core.model.components.ComponentUtilities;
|
||||
import org.talend.core.model.components.IComponentsFactory;
|
||||
import org.talend.core.runtime.util.ComponentsLocationProvider;
|
||||
import org.talend.core.runtime.util.SharedStudioUtils;
|
||||
import org.talend.designer.core.model.components.ComponentBundleToPath;
|
||||
|
||||
public class SharedStudioUserComponentProvider extends UserComponentsProvider implements ComponentsLocationProvider{
|
||||
@Override
|
||||
public File getInstallationFolder() throws IOException {
|
||||
File componentFolder = SharedStudioUtils.getSharedStudioComponentsParentFolder();
|
||||
IPath path = new Path(IComponentsFactory.COMPONENTS_INNER_FOLDER);
|
||||
path = path.append(IComponentsFactory.EXTERNAL_COMPONENTS_INNER_FOLDER).append(ComponentUtilities.getExtFolder(getFolderName()));
|
||||
File installationFolder = new File (componentFolder, path.toOSString());
|
||||
return installationFolder;
|
||||
}
|
||||
|
||||
|
||||
public String getComponentsBundle() {
|
||||
return ComponentBundleToPath.SHARED_STUDIO_CUSTOM_COMPONENT_BUNDLE;
|
||||
}
|
||||
|
||||
public boolean isSupportCurrentMode() {
|
||||
if (SharedStudioUtils.isSharedStudioMode()) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceBundle getResourceBundle(String label) {
|
||||
URL configFolderUrl = Platform.getConfigurationLocation().getURL();
|
||||
URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{configFolderUrl});
|
||||
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle( label ,
|
||||
java.util.Locale.getDefault(), urlLoader );
|
||||
return bundle;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -34,15 +34,13 @@ import org.talend.core.model.components.ComponentUtilities;
|
||||
import org.talend.core.model.components.IComponentsFactory;
|
||||
import org.talend.core.model.general.Project;
|
||||
import org.talend.core.model.repository.ERepositoryObjectType;
|
||||
import org.talend.core.runtime.util.SharedStudioInfoProvider;
|
||||
import org.talend.core.runtime.util.SharedStudioUtils;
|
||||
import org.talend.core.ui.branding.IBrandingService;
|
||||
import org.talend.designer.codegen.CodeGeneratorActivator;
|
||||
import org.talend.designer.codegen.components.ui.IComponentPreferenceConstant;
|
||||
import org.talend.repository.ProjectManager;
|
||||
|
||||
/***/
|
||||
public class UserComponentsProvider extends AbstractCustomComponentsProvider implements SharedStudioInfoProvider{
|
||||
public class UserComponentsProvider extends AbstractCustomComponentsProvider {
|
||||
|
||||
@Override
|
||||
protected File getExternalComponentsLocation() {
|
||||
@@ -149,11 +147,5 @@ public class UserComponentsProvider extends AbstractCustomComponentsProvider imp
|
||||
public String getComponentsBundle() {
|
||||
return IComponentsFactory.COMPONENTS_LOCATION;
|
||||
}
|
||||
|
||||
public boolean isSupportCurrentMode() {
|
||||
if (SharedStudioUtils.isSharedStudioMode()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@ import java.util.Map;
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
import org.talend.commons.exception.ExceptionHandler;
|
||||
import org.talend.commons.utils.StringUtils;
|
||||
import org.talend.designer.core.model.components.ComponentBundleToPath;
|
||||
|
||||
/**
|
||||
* Jet container for a particular component.
|
||||
@@ -214,17 +213,8 @@ public class JetBean {
|
||||
if (pluginIdToBundle.containsKey(pluginId)) {
|
||||
base = pluginIdToBundle.get(pluginId);
|
||||
} else {
|
||||
if (ComponentBundleToPath.SHARED_STUDIO_CUSTOM_COMPONENT_BUNDLE.equals(pluginId)) {
|
||||
base = ComponentBundleToPath.getPathFromBundle(pluginId);
|
||||
if (!base.endsWith("/")) {
|
||||
base = base + "/";
|
||||
}
|
||||
pluginIdToBundle.put(pluginId, base);
|
||||
} else {
|
||||
base = Platform.getBundle(pluginId).getEntry("/").toString(); //$NON-NLS-1$
|
||||
pluginIdToBundle.put(pluginId, base);
|
||||
}
|
||||
|
||||
base = Platform.getBundle(pluginId).getEntry("/").toString(); //$NON-NLS-1$
|
||||
pluginIdToBundle.put(pluginId, base);
|
||||
}
|
||||
String result = base + relativeUri;
|
||||
return result;
|
||||
|
||||
@@ -136,11 +136,13 @@ public class TalendJETCompiler extends JETCompiler {
|
||||
// get the plugin name from fileURI
|
||||
String refPluginName = matcher.group(1);
|
||||
// retrieve the plugin URI by pluginName.
|
||||
String realURI = TemplateUtil.getPlatformUrlOfBundle(refPluginName);
|
||||
if (realURI != null) {
|
||||
Bundle refBundle = Platform.getBundle(refPluginName);
|
||||
if (refBundle != null) {
|
||||
String realURI = TemplateUtil.getPlatformUrlOfBundle(refPluginName);
|
||||
// replace the old fileURI to new one by pluginURI
|
||||
String newFileURI = fileURI.replaceFirst(PLUGIN_VAR_PATTERN.pattern(), realURI);
|
||||
return newFileURI;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ package org.talend.designer.codegen.config;
|
||||
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
import org.osgi.framework.Bundle;
|
||||
import org.talend.designer.core.model.components.ComponentBundleToPath;
|
||||
|
||||
/**
|
||||
* CodeGenerator Templates Ressources Utils.
|
||||
@@ -162,25 +161,10 @@ public class TemplateUtil {
|
||||
* @return
|
||||
*/
|
||||
public static String getPlatformUrlOfBundle(String bundleName) {
|
||||
if (ComponentBundleToPath.SHARED_STUDIO_CUSTOM_COMPONENT_BUNDLE.equals(bundleName)) {
|
||||
String basePath = ComponentBundleToPath.getPathFromBundle(bundleName);
|
||||
if (!basePath.endsWith("/")) {
|
||||
basePath = basePath + "/";
|
||||
}
|
||||
return basePath;
|
||||
} else {
|
||||
Bundle bundle = Platform.getBundle(bundleName);
|
||||
if (bundle == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("platform:/plugin/");
|
||||
sb.append(bundle.getSymbolicName());
|
||||
sb.append("_");
|
||||
sb.append(bundle.getVersion().toString());
|
||||
sb.append("/");
|
||||
return sb.toString();
|
||||
}
|
||||
Bundle bundle = Platform.getBundle(bundleName);
|
||||
if (bundle == null) {
|
||||
return null;
|
||||
}
|
||||
return "platform:/plugin/" + bundle.getSymbolicName() + "_" + bundle.getVersion().toString() + "/";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,6 @@ import org.talend.core.ui.component.ComponentsFactoryProvider;
|
||||
import org.talend.designer.codegen.CodeGeneratorActivator;
|
||||
import org.talend.designer.codegen.config.TemplateUtil;
|
||||
import org.talend.designer.codegen.i18n.Messages;
|
||||
import org.talend.designer.core.model.components.ComponentBundleToPath;
|
||||
|
||||
/**
|
||||
* DOC xtan
|
||||
@@ -257,9 +256,10 @@ public final class JetSkeletonManager {
|
||||
};
|
||||
|
||||
for (TemplateUtil template : CodeGeneratorInternalTemplatesFactoryProvider.getInstance().getTemplates()) {
|
||||
Bundle b = Platform.getBundle(template.getJetPluginRepository());
|
||||
URL resourcesUrl = null;
|
||||
try {
|
||||
resourcesUrl = FileLocator.toFileURL(ComponentBundleToPath.findComponentsBundleURL(template.getJetPluginRepository(), new Path(template.getTemplateRelativeUri()), null));
|
||||
resourcesUrl = FileLocator.toFileURL(FileLocator.find(b, new Path(template.getTemplateRelativeUri()), null));
|
||||
} catch (IOException e) {
|
||||
ExceptionHandler.process(e);
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ Require-Bundle: org.eclipse.core.runtime,
|
||||
org.eclipse.ui,
|
||||
org.apache.log4j,
|
||||
org.apache.commons.collections,
|
||||
org.apache.commons.discovery,
|
||||
org.apache.commons.logging,
|
||||
org.apache.commons.beanutils,
|
||||
org.apache.commons.io,
|
||||
@@ -26,6 +25,7 @@ Require-Bundle: org.eclipse.core.runtime,
|
||||
org.talend.repository,
|
||||
org.talend.core.repository,
|
||||
org.talend.updates.runtime,
|
||||
org.apache.axis,
|
||||
org.eclipse.ui.intro,
|
||||
org.eclipse.ui.forms,
|
||||
org.eclipse.jface.text
|
||||
|
||||
@@ -9,14 +9,6 @@
|
||||
id="org.talend.designer.components.exchange.ExchangeComponentsProvider">
|
||||
</ComponentsProvider>
|
||||
</extension>
|
||||
<extension
|
||||
point="org.talend.core.components_provider">
|
||||
<ComponentsProvider
|
||||
class="org.talend.designer.components.exchange.SharedStudioExchangeComponentsProvider"
|
||||
folderName="exchange"
|
||||
id="org.talend.designer.components.exchange.SharedStudioExchangeComponentsProvider">
|
||||
</ComponentsProvider>
|
||||
</extension>
|
||||
<extension
|
||||
point="org.talend.core.runtime.service">
|
||||
<Service
|
||||
|
||||
@@ -28,15 +28,13 @@ import org.talend.core.GlobalServiceRegister;
|
||||
import org.talend.core.model.components.AbstractComponentsProvider;
|
||||
import org.talend.core.model.components.ComponentUtilities;
|
||||
import org.talend.core.model.components.IComponentsFactory;
|
||||
import org.talend.core.runtime.util.SharedStudioInfoProvider;
|
||||
import org.talend.core.runtime.util.SharedStudioUtils;
|
||||
import org.talend.core.ui.branding.IBrandingService;
|
||||
import org.talend.designer.components.exchange.util.ExchangeUtils;
|
||||
|
||||
/**
|
||||
* DOC hcyi class global comment. Detailled comment
|
||||
*/
|
||||
public class ExchangeComponentsProvider extends AbstractComponentsProvider implements SharedStudioInfoProvider{
|
||||
public class ExchangeComponentsProvider extends AbstractComponentsProvider {
|
||||
|
||||
/**
|
||||
* ExchangeComponentsProvider constructor.
|
||||
@@ -186,10 +184,4 @@ public class ExchangeComponentsProvider extends AbstractComponentsProvider imple
|
||||
return IComponentsFactory.COMPONENTS_LOCATION;
|
||||
}
|
||||
|
||||
public boolean isSupportCurrentMode() {
|
||||
if (SharedStudioUtils.isSharedStudioMode()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
package org.talend.designer.components.exchange;
|
||||
//============================================================================
|
||||
//
|
||||
//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
|
||||
//
|
||||
//============================================================================
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
import org.talend.core.model.components.ComponentUtilities;
|
||||
import org.talend.core.model.components.IComponentsFactory;
|
||||
import org.talend.core.runtime.util.ComponentsLocationProvider;
|
||||
import org.talend.core.runtime.util.SharedStudioUtils;
|
||||
import org.talend.designer.core.model.components.ComponentBundleToPath;
|
||||
|
||||
public class SharedStudioExchangeComponentsProvider extends ExchangeComponentsProvider implements ComponentsLocationProvider{
|
||||
@Override
|
||||
public File getInstallationFolder() throws IOException {
|
||||
File componentFolder = SharedStudioUtils.getSharedStudioComponentsParentFolder();
|
||||
IPath path = new Path(IComponentsFactory.COMPONENTS_INNER_FOLDER);
|
||||
path = path.append(IComponentsFactory.EXTERNAL_COMPONENTS_INNER_FOLDER).append(ComponentUtilities.getExtFolder(getFolderName()));
|
||||
File installationFolder = new File (componentFolder, path.toOSString());
|
||||
return installationFolder;
|
||||
}
|
||||
|
||||
|
||||
public String getComponentsBundle() {
|
||||
return ComponentBundleToPath.SHARED_STUDIO_CUSTOM_COMPONENT_BUNDLE;
|
||||
}
|
||||
|
||||
public boolean isSupportCurrentMode() {
|
||||
if (SharedStudioUtils.isSharedStudioMode()) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceBundle getResourceBundle(String label) {
|
||||
URL configFolderUrl = Platform.getConfigurationLocation().getURL();
|
||||
URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{configFolderUrl});
|
||||
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle( label ,
|
||||
java.util.Locale.getDefault(), urlLoader );
|
||||
return bundle;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2019 Talend Inc. - www.talend.com
|
||||
//
|
||||
// This source code is available under agreement available at
|
||||
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
|
||||
//
|
||||
// You should have received a copy of the agreement
|
||||
// along with this program; if not, write to Talend SA
|
||||
// 9 rue Pages 92150 Suresnes, France
|
||||
//
|
||||
// ============================================================================
|
||||
package org.talend.designer.components.exchange.proxy;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
/**
|
||||
*
|
||||
* DOC hcyi class global comment. Detailled comment
|
||||
*/
|
||||
public class DefaultHTTPSTransportClientProperties extends DefaultHTTPTransportClientProperties {
|
||||
|
||||
/**
|
||||
* @see org.apache.axis.components.net.TransportClientProperties#getProxyHost()
|
||||
*/
|
||||
@Override
|
||||
public String getProxyHost() {
|
||||
return StringUtils.trimToEmpty(System.getProperty("https.proxyHost")); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.apache.axis.components.net.TransportClientProperties#getNonProxyHosts()
|
||||
*/
|
||||
@Override
|
||||
public String getNonProxyHosts() {
|
||||
|
||||
return StringUtils.trimToEmpty(System.getProperty("https.nonProxyHosts")); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.apache.axis.components.net.TransportClientProperties#getPort()
|
||||
*/
|
||||
@Override
|
||||
public String getProxyPort() {
|
||||
|
||||
return StringUtils.trimToEmpty(System.getProperty("https.proxyPort")); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.apache.axis.components.net.TransportClientProperties#getUser()
|
||||
*/
|
||||
@Override
|
||||
public String getProxyUser() {
|
||||
|
||||
return StringUtils.trimToEmpty(System.getProperty("https.proxyUser")); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.apache.axis.components.net.TransportClientProperties#getPassword()
|
||||
*/
|
||||
@Override
|
||||
public String getProxyPassword() {
|
||||
|
||||
return StringUtils.trimToEmpty(System.getProperty("https.proxyPassword")); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2019 Talend Inc. - www.talend.com
|
||||
//
|
||||
// This source code is available under agreement available at
|
||||
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
|
||||
//
|
||||
// You should have received a copy of the agreement
|
||||
// along with this program; if not, write to Talend SA
|
||||
// 9 rue Pages 92150 Suresnes, France
|
||||
//
|
||||
// ============================================================================
|
||||
package org.talend.designer.components.exchange.proxy;
|
||||
|
||||
import org.apache.axis.components.net.TransportClientProperties;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
/**
|
||||
*
|
||||
* DOC hcyi class global comment. Detailled comment
|
||||
*/
|
||||
public class DefaultHTTPTransportClientProperties implements TransportClientProperties {
|
||||
|
||||
/**
|
||||
* @see org.apache.axis.components.net.TransportClientProperties#getProxyHost()
|
||||
*/
|
||||
public String getProxyHost() {
|
||||
return StringUtils.trimToEmpty(System.getProperty("http.proxyHost")); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.apache.axis.components.net.TransportClientProperties#getNonProxyHosts()
|
||||
*/
|
||||
public String getNonProxyHosts() {
|
||||
return StringUtils.trimToEmpty(System.getProperty("http.nonProxyHosts")); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.apache.axis.components.net.TransportClientProperties#getPort()
|
||||
*/
|
||||
public String getProxyPort() {
|
||||
return StringUtils.trimToEmpty(System.getProperty("http.proxyPort")); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.apache.axis.components.net.TransportClientProperties#getProxyUser()
|
||||
*/
|
||||
public String getProxyUser() {
|
||||
return StringUtils.trimToEmpty(System.getProperty("http.proxyUser")); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.apache.axis.components.net.TransportClientProperties#getProxyPassword()
|
||||
*/
|
||||
public String getProxyPassword() {
|
||||
return StringUtils.trimToEmpty(System.getProperty("http.proxyPassword")); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
@@ -52,7 +52,6 @@ import org.talend.core.download.IDownloadHelper;
|
||||
import org.talend.core.model.components.ComponentManager;
|
||||
import org.talend.core.model.components.IComponent;
|
||||
import org.talend.core.model.components.IComponentsFactory;
|
||||
import org.talend.core.runtime.util.SharedStudioUtils;
|
||||
import org.talend.core.ui.component.ComponentPaletteUtilities;
|
||||
import org.talend.core.ui.component.ComponentsFactoryProvider;
|
||||
import org.talend.designer.codegen.ICodeGeneratorService;
|
||||
@@ -313,54 +312,51 @@ public class DownloadComponenentsAction extends Action implements IIntroAction {
|
||||
|
||||
protected void afterDownload(IProgressMonitor monitor, ComponentExtension extension, File localZipFile) throws Exception {
|
||||
if (UpdatesHelper.isComponentUpdateSite(localZipFile)) {
|
||||
if (!SharedStudioUtils.isSharedStudioMode()) {
|
||||
final File workFolder = org.talend.utils.files.FileUtils.createTmpFolder("downloadedComponents", ""); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
final File workFolder = org.talend.utils.files.FileUtils.createTmpFolder("downloadedComponents", ""); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
try {
|
||||
FilesUtils.copyFile(localZipFile, new File(workFolder, localZipFile.getName()));
|
||||
try {
|
||||
FilesUtils.copyFile(localZipFile, new File(workFolder, localZipFile.getName()));
|
||||
|
||||
ComponentsInstallComponent component = LocalComponentInstallHelper.getComponent();
|
||||
if (component != null) {
|
||||
try {
|
||||
component.setComponentFolder(workFolder);
|
||||
if (component.install()) {
|
||||
ComponentsInstallComponent component = LocalComponentInstallHelper.getComponent();
|
||||
if (component != null) {
|
||||
try {
|
||||
component.setComponentFolder(workFolder);
|
||||
if (component.install()) {
|
||||
|
||||
|
||||
if (component.needRelaunch()) {
|
||||
askReboot();
|
||||
} else {
|
||||
MessageDialog.openInformation(DisplayUtils.getDefaultShell(),
|
||||
Messages.getString("DownloadComponenentsAction.installComponentsTitle"),
|
||||
component.getInstalledMessages());
|
||||
}
|
||||
} else {// install failure
|
||||
MessageDialog.openWarning(DisplayUtils.getDefaultShell(),
|
||||
Messages.getString("DownloadComponenentsAction_failureTitle"), //$NON-NLS-1$
|
||||
Messages.getString("DownloadComponenentsAction_failureMessage", extension.getLabel())); //$NON-NLS-1$
|
||||
if (component.needRelaunch()) {
|
||||
askReboot();
|
||||
} else {
|
||||
MessageDialog.openInformation(DisplayUtils.getDefaultShell(),
|
||||
Messages.getString("DownloadComponenentsAction.installComponentsTitle"),
|
||||
component.getInstalledMessages());
|
||||
}
|
||||
} finally {
|
||||
// after install, clear the setting for service.
|
||||
component.setComponentFolder(null);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Popup dialog to user to waring install failed.
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
MessageDialog.openError(DisplayUtils.getDefaultShell(false),
|
||||
} else {// install failure
|
||||
MessageDialog.openWarning(DisplayUtils.getDefaultShell(),
|
||||
Messages.getString("DownloadComponenentsAction_failureTitle"), //$NON-NLS-1$
|
||||
Messages.getString("DownloadComponenentsAction_failureMessage", extension.getLabel())); //$NON-NLS-1$
|
||||
}
|
||||
});
|
||||
throw e;
|
||||
} finally {
|
||||
FilesUtils.deleteFolder(workFolder, true);
|
||||
} finally {
|
||||
// after install, clear the setting for service.
|
||||
component.setComponentFolder(null);
|
||||
}
|
||||
}
|
||||
monitor.done();
|
||||
ExchangeManager.getInstance().saveDownloadedExtensionsToFile(extension);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Popup dialog to user to waring install failed.
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
MessageDialog.openError(DisplayUtils.getDefaultShell(false),
|
||||
Messages.getString("DownloadComponenentsAction_failureTitle"), //$NON-NLS-1$
|
||||
Messages.getString("DownloadComponenentsAction_failureMessage", extension.getLabel())); //$NON-NLS-1$
|
||||
}
|
||||
});
|
||||
throw e;
|
||||
} finally {
|
||||
FilesUtils.deleteFolder(workFolder, true);
|
||||
}
|
||||
monitor.done();
|
||||
ExchangeManager.getInstance().saveDownloadedExtensionsToFile(extension);
|
||||
} else {
|
||||
File installedLocation = ComponentInstaller.unzip(localZipFile.getAbsolutePath(), getComponentsFolder()
|
||||
.getAbsolutePath());
|
||||
|
||||
@@ -37,7 +37,6 @@ import org.eclipse.swt.widgets.Shell;
|
||||
import org.eclipse.ui.PlatformUI;
|
||||
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
|
||||
import org.talend.core.download.DownloadHelper;
|
||||
import org.talend.core.runtime.util.SharedStudioUtils;
|
||||
import org.talend.designer.components.exchange.i18n.Messages;
|
||||
import org.talend.designer.components.exchange.model.Category;
|
||||
import org.talend.designer.components.exchange.model.VersionRevision;
|
||||
@@ -106,7 +105,7 @@ public class ImportExchangeDialog extends Dialog {
|
||||
|
||||
@Override
|
||||
protected void okPressed() {
|
||||
IPath tempPath = SharedStudioUtils.getTempFolderPath();
|
||||
IPath tempPath = new Path(System.getProperty("user.dir")).append("temp"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
File pathFile = tempPath.toFile();
|
||||
if (downloadproperty.getFileName() == null || downloadproperty.getFileName() == null) {
|
||||
MessageBox box = new MessageBox(Display.getCurrent().getActiveShell(), SWT.ICON_WARNING | SWT.OK);
|
||||
|
||||
@@ -25,9 +25,11 @@ import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
|
||||
import org.apache.axis.components.net.TransportClientProperties;
|
||||
import org.apache.axis.components.net.TransportClientPropertiesFactory;
|
||||
import org.apache.commons.beanutils.BeanUtils;
|
||||
import org.apache.commons.collections.map.MultiValueMap;
|
||||
import org.apache.commons.discovery.tools.ManagedProperties;
|
||||
import org.apache.commons.httpclient.HostConfiguration;
|
||||
import org.apache.commons.httpclient.HttpClient;
|
||||
import org.apache.commons.httpclient.NameValuePair;
|
||||
@@ -53,7 +55,6 @@ import org.talend.core.language.ECodeLanguage;
|
||||
import org.talend.core.language.LanguageManager;
|
||||
import org.talend.core.model.components.IComponentsFactory;
|
||||
import org.talend.core.model.general.Project;
|
||||
import org.talend.core.runtime.util.SharedStudioUtils;
|
||||
import org.talend.core.ui.component.ComponentPaletteUtilities;
|
||||
import org.talend.core.ui.component.ComponentsFactoryProvider;
|
||||
import org.talend.designer.components.exchange.ExchangePlugin;
|
||||
@@ -149,17 +150,14 @@ public class ExchangeUtils {
|
||||
public static String sendGetRequest(String urlAddress) throws Exception {
|
||||
HttpClient httpclient = new HttpClient();
|
||||
GetMethod getMethod = new GetMethod(urlAddress);
|
||||
String proxyUser = ManagedProperties.getProperty("http.proxyUser");
|
||||
String proxyPassword = ManagedProperties.getProperty("http.proxyPassword");
|
||||
String proxyHost = ManagedProperties.getProperty("http.proxyHost");
|
||||
proxyHost = proxyHost != null ? proxyHost : "";
|
||||
String proxyPort = ManagedProperties.getProperty("http.proxyPort");
|
||||
if (proxyHost.length() != 0) {
|
||||
TransportClientProperties tcp = TransportClientPropertiesFactory.create("http");
|
||||
if (tcp.getProxyHost().length() != 0) {
|
||||
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(
|
||||
proxyUser != null ? proxyUser : "", proxyPassword != null ? proxyPassword : "");
|
||||
tcp.getProxyUser() != null ? tcp.getProxyUser() : "",
|
||||
tcp.getProxyPassword() != null ? tcp.getProxyUser() : "");
|
||||
httpclient.getState().setProxyCredentials(AuthScope.ANY, creds);
|
||||
HostConfiguration hcf = new HostConfiguration();
|
||||
hcf.setProxy(proxyHost, Integer.parseInt(proxyPort));
|
||||
hcf.setProxy(tcp.getProxyHost(), Integer.parseInt(tcp.getProxyPort()));
|
||||
httpclient.executeMethod(hcf, getMethod);
|
||||
} else {
|
||||
httpclient.executeMethod(getMethod);
|
||||
@@ -207,19 +205,14 @@ public class ExchangeUtils {
|
||||
* @return
|
||||
*/
|
||||
public static File getComponentFolder(String componentfolder) {
|
||||
if (SharedStudioUtils.isSharedStudioMode()) {
|
||||
File componentFolder = SharedStudioUtils.getSharedStudioComponentsExtFolder();
|
||||
return new File (componentFolder, componentfolder);
|
||||
} else {
|
||||
URL url = FileLocator.find(ExchangePlugin.getDefault().getBundle(), new Path(componentfolder), null);
|
||||
try {
|
||||
URL fileUrl = FileLocator.toFileURL(url);
|
||||
return new File(fileUrl.getPath());
|
||||
} catch (Exception e) {
|
||||
ExceptionHandler.process(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
URL url = FileLocator.find(ExchangePlugin.getDefault().getBundle(), new Path(componentfolder), null);
|
||||
try {
|
||||
URL fileUrl = FileLocator.toFileURL(url);
|
||||
return new File(fileUrl.getPath());
|
||||
} catch (Exception e) {
|
||||
ExceptionHandler.process(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
<!-- modification 2: compile classpath -->
|
||||
<path id="compile.classpath">
|
||||
<pathelement location="../../../../../../tcommon-studio-se/main/plugins/org.talend.libraries.dom4j-jaxen/lib/dom4j-2.1.3.jar" />
|
||||
<pathelement location="../../../../../../tcommon-studio-se/main/plugins/org.talend.libraries.dom4j-jaxen/lib/dom4j-1.6.1.jar" />
|
||||
<pathelement location="../../../../../../tcommon-studio-se/main/plugins/org.talend.libraries.apache.common/lib/commons-lang-2.6.jar" />
|
||||
</path>
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
<version>2.8.9</version>
|
||||
<version>2.2.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
|
||||
@@ -42,18 +42,7 @@
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
<version>1.7.25</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.reload4j</groupId>
|
||||
<artifactId>reload4j</artifactId>
|
||||
<version>1.2.19</version>
|
||||
</dependency>
|
||||
<!-- Spring 3 dependencies -->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
<project name="org.talend.designer.components.libs" default="buildall" basedir=".">
|
||||
|
||||
<target name="buildall">
|
||||
<ant antfile="talend_file_enhanced_20070724/build.xml" target="process" inheritall="no" />
|
||||
<ant antfile="sugarCRMManagement/build.xml" target="process" inheritall="no" />
|
||||
<ant antfile="TalendSAX/build.xml" target="process" inheritall="no" />
|
||||
</target>
|
||||
|
||||
@@ -1,66 +1,69 @@
|
||||
<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>
|
||||
|
||||
<groupId>org.talend.components.lib</groupId>
|
||||
<artifactId>talend-aws</artifactId>
|
||||
<version>1.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>talend-aws</name>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
<java.source.version>1.8</java.source.version>
|
||||
</properties>
|
||||
|
||||
<distributionManagement>
|
||||
<snapshotRepository>
|
||||
<id>talend_nexus_deployment</id>
|
||||
<url>${talend.nexus.url}/nexus/content/repositories/TalendOpenSourceSnapshot/</url>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
</snapshotRepository>
|
||||
<repository>
|
||||
<id>talend_nexus_deployment</id>
|
||||
<url>${talend.nexus.url}/nexus/content/repositories/TalendOpenSourceRelease/</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
</repository>
|
||||
</distributionManagement>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.amazonaws</groupId>
|
||||
<artifactId>aws-java-sdk</artifactId>
|
||||
<version>1.11.848</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/java</directory>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.3.2</version>
|
||||
<configuration>
|
||||
<source>${java.source.version}</source>
|
||||
<target>${java.source.version}</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
<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>
|
||||
<groupId>org.talend.libraries</groupId>
|
||||
<artifactId>checkArchive-1.1-20190917</artifactId>
|
||||
<version>6.0.0</version>
|
||||
<name>checkArchive</name>
|
||||
<description>Dependence for tFileArchive and tFileUnAchive</description>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
<java.source.version>1.7</java.source.version>
|
||||
</properties>
|
||||
|
||||
<distributionManagement>
|
||||
<snapshotRepository>
|
||||
<id>talend_nexus_deployment</id>
|
||||
<url>${talend.nexus.url}/nexus/content/repositories/TalendOpenSourceSnapshot/</url>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
</snapshotRepository>
|
||||
<repository>
|
||||
<id>talend_nexus_deployment</id>
|
||||
<url>${talend.nexus.url}/nexus/content/repositories/TalendOpenSourceRelease/</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
</repository>
|
||||
</distributionManagement>
|
||||
|
||||
<dependencies>
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-compress</artifactId>
|
||||
<version>1.19</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/java</directory>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.3.2</version>
|
||||
<configuration>
|
||||
<source>${java.source.version}</source>
|
||||
<target>${java.source.version}</target>
|
||||
<showDeprecation>true</showDeprecation>
|
||||
<showWarnings>true</showWarnings>
|
||||
<compilerArgument>-XDignore.symbol.file</compilerArgument>
|
||||
<fork>true</fork>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -1,183 +1,184 @@
|
||||
package com.talend.compress.zip;
|
||||
|
||||
import org.apache.commons.compress.archivers.ArchiveEntry;
|
||||
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
|
||||
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
|
||||
import org.apache.commons.compress.archivers.zip.ZipFile;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.CipherInputStream;
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.SecretKeyFactory;
|
||||
import javax.crypto.spec.PBEKeySpec;
|
||||
import javax.crypto.spec.PBEParameterSpec;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
// import javax.crypto.Cipher;
|
||||
|
||||
public class IntegrityUtil {
|
||||
|
||||
/**
|
||||
* Is used to check if the zip file is corrupted/destroyed
|
||||
*
|
||||
* @param file
|
||||
* @return
|
||||
*/
|
||||
public static boolean isZipValid(final File file) {
|
||||
ZipFile zipFile = null;
|
||||
|
||||
try {
|
||||
zipFile = new ZipFile(file);
|
||||
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
} finally {
|
||||
try {
|
||||
if (zipFile != null) {
|
||||
zipFile.close();
|
||||
zipFile = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void validate(final File file) {
|
||||
ZipFile zipFile = null;
|
||||
|
||||
try {
|
||||
zipFile = new ZipFile(file);
|
||||
|
||||
} catch (IOException e) {
|
||||
} finally {
|
||||
try {
|
||||
if (zipFile != null) {
|
||||
zipFile.close();
|
||||
zipFile = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* To check if the encrpted zip file is corrupted or not
|
||||
*
|
||||
* @param file
|
||||
* @param password
|
||||
* @return
|
||||
*/
|
||||
public static boolean isEncryptedZipValid(final File file, String password) {
|
||||
ZipArchiveInputStream input = null;
|
||||
InputStream target = null;
|
||||
try {
|
||||
target = new FileInputStream(file);
|
||||
target = new CipherInputStream(target, createCipher(Cipher.DECRYPT_MODE, password));
|
||||
input = new ZipArchiveInputStream(target);
|
||||
ArchiveEntry entry = input.getNextEntry();
|
||||
return true;
|
||||
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
} finally {
|
||||
try {
|
||||
if (input != null) {
|
||||
input.close();
|
||||
input = null;
|
||||
}
|
||||
if (target != null) {
|
||||
target.close();
|
||||
target = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to check tar.gz/.tgz/.gz file is corrupted/destroyed
|
||||
*
|
||||
* @param fileName
|
||||
* @return
|
||||
*/
|
||||
public static boolean isGZIPValid(final String fileName) {
|
||||
GZIPInputStream inputStream = null;
|
||||
InputStream is = null;
|
||||
try {
|
||||
is = new FileInputStream(new File(fileName));
|
||||
inputStream = new GZIPInputStream(is);
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}finally {
|
||||
try {
|
||||
if (inputStream != null) {
|
||||
inputStream.close();
|
||||
inputStream = null;
|
||||
} else if(is != null) {
|
||||
is.close();
|
||||
is = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to check tar.tar file is corrupted/destroyed
|
||||
*
|
||||
* @param fileName
|
||||
* @return
|
||||
*/
|
||||
public static boolean isTarValid(final String fileName) {
|
||||
TarArchiveInputStream inputStream = null;
|
||||
InputStream is = null;
|
||||
try {
|
||||
is = new FileInputStream(new File(fileName));
|
||||
inputStream = new TarArchiveInputStream(is);
|
||||
return inputStream.canReadEntryData(inputStream.getNextEntry());
|
||||
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}finally {
|
||||
try {
|
||||
if (inputStream != null) {
|
||||
inputStream.close();
|
||||
inputStream = null;
|
||||
} else if(is != null) {
|
||||
is.close();
|
||||
is = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param mode
|
||||
* @param password
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public static Cipher createCipher(int mode, String password) throws Exception {
|
||||
String alg = "PBEWithSHA1AndDESede"; // BouncyCastle has better algorithms
|
||||
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
|
||||
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(alg);
|
||||
SecretKey secretKey = keyFactory.generateSecret(keySpec);
|
||||
|
||||
Cipher cipher = Cipher.getInstance("PBEWithSHA1AndDESede");
|
||||
cipher.init(mode, secretKey, new PBEParameterSpec("saltsalt".getBytes(), 2000));
|
||||
|
||||
return cipher;
|
||||
}
|
||||
}
|
||||
package org.talend.archive;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.CipherInputStream;
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.SecretKeyFactory;
|
||||
import javax.crypto.spec.PBEKeySpec;
|
||||
import javax.crypto.spec.PBEParameterSpec;
|
||||
|
||||
import org.apache.commons.compress.archivers.ArchiveEntry;
|
||||
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
|
||||
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
|
||||
import org.apache.commons.compress.archivers.zip.ZipFile;
|
||||
|
||||
// import javax.crypto.Cipher;
|
||||
|
||||
public class IntegrityUtil {
|
||||
|
||||
/**
|
||||
* Is used to check if the zip file is corrupted/destroyed
|
||||
*
|
||||
* @param file
|
||||
* @return
|
||||
*/
|
||||
public static boolean isZipValid(final File file) {
|
||||
ZipFile zipFile = null;
|
||||
|
||||
try {
|
||||
zipFile = new ZipFile(file);
|
||||
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
} finally {
|
||||
try {
|
||||
if (zipFile != null) {
|
||||
zipFile.close();
|
||||
zipFile = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void validate(final File file) {
|
||||
ZipFile zipFile = null;
|
||||
|
||||
try {
|
||||
zipFile = new ZipFile(file);
|
||||
|
||||
} catch (IOException e) {
|
||||
} finally {
|
||||
try {
|
||||
if (zipFile != null) {
|
||||
zipFile.close();
|
||||
zipFile = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* To check if the encrpted zip file is corrupted or not
|
||||
*
|
||||
* @param file
|
||||
* @param password
|
||||
* @return
|
||||
*/
|
||||
public static boolean isEncryptedZipValid(final File file, String password) {
|
||||
ZipArchiveInputStream input = null;
|
||||
InputStream target = null;
|
||||
try {
|
||||
target = new FileInputStream(file);
|
||||
target = new CipherInputStream(target, createCipher(Cipher.DECRYPT_MODE, password));
|
||||
input = new ZipArchiveInputStream(target);
|
||||
ArchiveEntry entry = input.getNextEntry();
|
||||
return true;
|
||||
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
} finally {
|
||||
try {
|
||||
if (input != null) {
|
||||
input.close();
|
||||
input = null;
|
||||
}
|
||||
if (target != null) {
|
||||
target.close();
|
||||
target = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to check tar.gz/.tgz/.gz file is corrupted/destroyed
|
||||
*
|
||||
* @param fileName
|
||||
* @return
|
||||
*/
|
||||
public static boolean isGZIPValid(final String fileName) {
|
||||
GZIPInputStream inputStream = null;
|
||||
InputStream is = null;
|
||||
try {
|
||||
is = new FileInputStream(new File(fileName));
|
||||
inputStream = new GZIPInputStream(is);
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}finally {
|
||||
try {
|
||||
if (inputStream != null) {
|
||||
inputStream.close();
|
||||
inputStream = null;
|
||||
} else if(is != null) {
|
||||
is.close();
|
||||
is = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to check tar.tar file is corrupted/destroyed
|
||||
*
|
||||
* @param fileName
|
||||
* @return
|
||||
*/
|
||||
public static boolean isTarValid(final String fileName) {
|
||||
TarArchiveInputStream inputStream = null;
|
||||
InputStream is = null;
|
||||
try {
|
||||
is = new FileInputStream(new File(fileName));
|
||||
inputStream = new TarArchiveInputStream(is);
|
||||
return inputStream.canReadEntryData(inputStream.getNextEntry());
|
||||
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}finally {
|
||||
try {
|
||||
if (inputStream != null) {
|
||||
inputStream.close();
|
||||
inputStream = null;
|
||||
} else if(is != null) {
|
||||
is.close();
|
||||
is = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param mode
|
||||
* @param password
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public static Cipher createCipher(int mode, String password) throws Exception {
|
||||
String alg = "PBEWithSHA1AndDESede"; // BouncyCastle has better algorithms
|
||||
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
|
||||
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(alg);
|
||||
SecretKey secretKey = keyFactory.generateSecret(keySpec);
|
||||
|
||||
Cipher cipher = Cipher.getInstance("PBEWithSHA1AndDESede");
|
||||
cipher.init(mode, secretKey, new PBEParameterSpec("saltsalt".getBytes(), 2000));
|
||||
|
||||
return cipher;
|
||||
}
|
||||
}
|
||||
@@ -3,32 +3,11 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.talend.components.lib</groupId>
|
||||
<artifactId>commons-net-ftps-proxy</artifactId>
|
||||
<version>3.6.1-talend-20200902</version>
|
||||
<version>3.6.1-talend-20190819</version>
|
||||
|
||||
<name>commons-net-talend</name>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
<slf4.version>1.7.25</slf4.version>
|
||||
<lombok.version>1.18.12</lombok.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>${slf4.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>commons-net</groupId>
|
||||
<artifactId>commons-net</artifactId>
|
||||
@@ -36,6 +15,10 @@
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
</properties>
|
||||
|
||||
<distributionManagement>
|
||||
<snapshotRepository>
|
||||
<id>talend_nexus_deployment</id>
|
||||
|
||||
@@ -11,10 +11,8 @@ import javax.net.ssl.SSLSession;
|
||||
import javax.net.ssl.SSLSessionContext;
|
||||
import javax.net.ssl.SSLSocket;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.net.ftp.FTPSClient;
|
||||
|
||||
@Slf4j
|
||||
public class SSLSessionReuseFTPSClient extends FTPSClient {
|
||||
|
||||
public SSLSessionReuseFTPSClient(boolean isImplicit, SSLContext context) {
|
||||
@@ -26,12 +24,6 @@ public class SSLSessionReuseFTPSClient extends FTPSClient {
|
||||
if (socket instanceof SSLSocket) {
|
||||
final SSLSession session = ((SSLSocket) _socket_).getSession();
|
||||
final SSLSessionContext context = session.getSessionContext();
|
||||
if (context == null) {
|
||||
// TDI-44654 (may be reproduced with Syncplify server)
|
||||
log.info("SSL Session Context is null. SSL Session was re-initialized.");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
final Field sessionHostPortCache = context.getClass().getDeclaredField("sessionHostPortCache");
|
||||
sessionHostPortCache.setAccessible(true);
|
||||
@@ -40,10 +32,10 @@ public class SSLSessionReuseFTPSClient extends FTPSClient {
|
||||
putMethod.setAccessible(true);
|
||||
InetAddress address = socket.getInetAddress();
|
||||
int port = socket.getPort();
|
||||
|
||||
|
||||
String key = String.format("%s:%s", address.getHostName(), String.valueOf(port)).toLowerCase(Locale.ROOT);
|
||||
putMethod.invoke(cache, key, session);
|
||||
|
||||
|
||||
key = String.format("%s:%s", address.getHostAddress(), String.valueOf(port)).toLowerCase(Locale.ROOT);
|
||||
putMethod.invoke(cache, key, session);
|
||||
} catch (Exception e) {
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
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>
|
||||
<groupId>org.talend.components</groupId>
|
||||
<groupId>org.talend.libraries</groupId>
|
||||
<artifactId>filecopy</artifactId>
|
||||
<version>2.0.3</version>
|
||||
<version>2.0.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>talend-copy</name>
|
||||
@@ -14,7 +14,6 @@
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
<java.source.version>1.8</java.source.version>
|
||||
<junit5.version>5.4.2</junit5.version>
|
||||
<slf4j.version>1.7.28</slf4j.version>
|
||||
</properties>
|
||||
|
||||
<distributionManagement>
|
||||
@@ -53,12 +52,7 @@
|
||||
<version>${junit5.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>${slf4j.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
|
||||
@@ -15,21 +15,13 @@ package org.talend;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.nio.file.attribute.FileTime;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* DOC Administrator class global comment. Detailled comment
|
||||
*/
|
||||
public class FileCopy {
|
||||
|
||||
static Logger logger = LoggerFactory.getLogger(Object.class);
|
||||
|
||||
/** Private constructor, only static methods */
|
||||
private FileCopy() {
|
||||
}
|
||||
@@ -42,57 +34,16 @@ public class FileCopy {
|
||||
* @param delSrc : true if delete source.
|
||||
* @throws IOException : if IO pb.
|
||||
*/
|
||||
public static void copyFile(String srcFileName, String desFileName, boolean delSrc, boolean keepModified)
|
||||
throws IOException {
|
||||
final Path source = Paths.get(srcFileName);
|
||||
final Path destination = Paths.get(desFileName);
|
||||
FileTime lastModifiedTime = null;
|
||||
try {
|
||||
lastModifiedTime = Files.getLastModifiedTime(source);
|
||||
} catch (IOException e) {
|
||||
logger.warn(e.getLocalizedMessage());
|
||||
}
|
||||
public static void copyFile(String srcFileName, String desFileName, boolean delSrc) throws IOException {
|
||||
final File source = new File(srcFileName);
|
||||
final File destination = new File(desFileName);
|
||||
|
||||
if (delSrc) {
|
||||
// move : more efficient if in same FS and mustr delete existing file.
|
||||
Files.move(source, destination, StandardCopyOption.REPLACE_EXISTING);
|
||||
Files.move(source.toPath(), destination.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
} else {
|
||||
Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
|
||||
Files.copy(source.toPath(), destination.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
if(keepModified){
|
||||
try {
|
||||
Files.setLastModifiedTime(destination,lastModifiedTime);
|
||||
} catch (IOException e) {
|
||||
logger.warn(e.getLocalizedMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void copyFile(String srcFileName, String desFileName, boolean delSrc ) throws IOException {
|
||||
copyFile(srcFileName,desFileName,delSrc,true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Force Copy and Delete files.
|
||||
*
|
||||
* @param srcFileName : file name for source file.
|
||||
* @param desFileName : file name for destination file.
|
||||
* @throws IOException : if IO pb.
|
||||
*/
|
||||
public static void forceCopyAndDelete(String srcFileName, String desFileName, boolean keepModified) throws IOException {
|
||||
final Path source = Paths.get(srcFileName);
|
||||
final Path destination = Paths.get(desFileName);
|
||||
final long lastModifiedTime = new File(srcFileName).lastModified();
|
||||
|
||||
Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
|
||||
Files.delete(source);
|
||||
if(keepModified){
|
||||
destination.toFile().setLastModified(lastModifiedTime);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void forceCopyAndDelete(String srcFileName, String desFileName) throws IOException {
|
||||
forceCopyAndDelete(srcFileName,desFileName,true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -100,44 +100,6 @@ class FileCopyTest {
|
||||
Assertions.assertEquals(referenceSize, copy.length(), "Size error");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testForceCopyWithDelete() throws Exception {
|
||||
final URL repCopy = Thread.currentThread().getContextClassLoader().getResource("copy");
|
||||
|
||||
File file = this.buildFile("fileToDelete.txt", 10L * 1024L);
|
||||
file.deleteOnExit();
|
||||
File copy = new File(repCopy.getPath(), "fileToDelete.txt");
|
||||
long referenceSize = file.length();
|
||||
if (!copy.exists()) {
|
||||
copy.createNewFile();
|
||||
}
|
||||
copy.deleteOnExit();
|
||||
|
||||
FileCopy.forceCopyAndDelete(file.getPath(), copy.getPath());
|
||||
|
||||
Assertions.assertFalse(file.exists(), "file not delete");
|
||||
Assertions.assertTrue(copy.exists(), "small file : original file deleted");
|
||||
Assertions.assertEquals(referenceSize, copy.length(), "Size error");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testLastModifiedTime() throws Exception {
|
||||
final URL repCopy = Thread.currentThread().getContextClassLoader().getResource("copy");
|
||||
|
||||
File file = this.buildFile("fileLMT.txt", 10L * 1024L);
|
||||
file.deleteOnExit();
|
||||
long referencceTime = 324723894L;
|
||||
file.setLastModified(referencceTime);
|
||||
|
||||
File copy = new File(repCopy.getPath(), "fileLMTDestination.txt");
|
||||
if (copy.exists()) {
|
||||
copy.delete();
|
||||
}
|
||||
copy.deleteOnExit();
|
||||
FileCopy.copyFile(file.getPath(), copy.getPath(), true);
|
||||
Assertions.assertEquals(referencceTime, copy.lastModified(), "modified time is not idential");
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a new file for testing.
|
||||
*
|
||||
@@ -163,22 +125,4 @@ class FileCopyTest {
|
||||
|
||||
return generatedFile;
|
||||
}
|
||||
|
||||
@Test
|
||||
void testKeepLastModifiedTime() throws Exception {
|
||||
final URL repCopy = Thread.currentThread().getContextClassLoader().getResource("copy");
|
||||
|
||||
File file = this.buildFile("fileLMT.txt", 10L * 1024L);
|
||||
file.deleteOnExit();
|
||||
long referencceTime = 324723894L;
|
||||
file.setLastModified(referencceTime);
|
||||
|
||||
File copy = new File(repCopy.getPath(), "fileLMTDestination.txt");
|
||||
if (copy.exists()) {
|
||||
copy.delete();
|
||||
}
|
||||
copy.deleteOnExit();
|
||||
FileCopy.copyFile(file.getPath(), copy.getPath(), true,true);
|
||||
Assertions.assertEquals(referencceTime, copy.lastModified(), "modified time is not idential");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -230,9 +230,9 @@
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.reload4j</groupId>
|
||||
<artifactId>reload4j</artifactId>
|
||||
<version>1.2.19</version>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.14</version>
|
||||
<scope>runtime</scope>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<cxf.version>3.4.7</cxf.version>
|
||||
<cxf.version>3.1.2</cxf.version>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
@@ -77,8 +77,8 @@
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.5.1</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
<source>1.7</source>
|
||||
<target>1.7</target>
|
||||
<encoding>UTF-8</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -22,7 +22,6 @@ import javax.xml.bind.annotation.XmlType;
|
||||
* <element name="description" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
|
||||
* <element name="name" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
|
||||
* <element name="processSteps" type="{http://www.talend.com/mdm}WSTransformerProcessStep" maxOccurs="unbounded" minOccurs="0"/>
|
||||
* <element name="withAdminPermissions" type="{http://www.w3.org/2001/XMLSchema}boolean" minOccurs="0"/>
|
||||
* </sequence>
|
||||
* </restriction>
|
||||
* </complexContent>
|
||||
@@ -35,8 +34,7 @@ import javax.xml.bind.annotation.XmlType;
|
||||
@XmlType(name = "WSTransformerV2", propOrder = {
|
||||
"description",
|
||||
"name",
|
||||
"processSteps",
|
||||
"withAdminPermissions"
|
||||
"processSteps"
|
||||
})
|
||||
public class WSTransformerV2 {
|
||||
|
||||
@@ -44,7 +42,6 @@ public class WSTransformerV2 {
|
||||
protected String name;
|
||||
@XmlElement(nillable = true)
|
||||
protected List<WSTransformerProcessStep> processSteps;
|
||||
protected Boolean withAdminPermissions;
|
||||
|
||||
/**
|
||||
* Default no-arg constructor
|
||||
@@ -58,11 +55,10 @@ public class WSTransformerV2 {
|
||||
* Fully-initialising value constructor
|
||||
*
|
||||
*/
|
||||
public WSTransformerV2(final String description, final String name, final List<WSTransformerProcessStep> processSteps, final Boolean withAdminPermissions) {
|
||||
public WSTransformerV2(final String description, final String name, final List<WSTransformerProcessStep> processSteps) {
|
||||
this.description = description;
|
||||
this.name = name;
|
||||
this.processSteps = processSteps;
|
||||
this.withAdminPermissions = withAdminPermissions;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -142,28 +138,4 @@ public class WSTransformerV2 {
|
||||
return this.processSteps;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value of the withAdminPermissions property.
|
||||
*
|
||||
* @return
|
||||
* possible object is
|
||||
* {@link Boolean }
|
||||
*
|
||||
*/
|
||||
public Boolean isWithAdminPermissions() {
|
||||
return withAdminPermissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of the withAdminPermissions property.
|
||||
*
|
||||
* @param value
|
||||
* allowed object is
|
||||
* {@link Boolean }
|
||||
*
|
||||
*/
|
||||
public void setWithAdminPermissions(Boolean value) {
|
||||
this.withAdminPermissions = value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.dom4j</groupId>
|
||||
<groupId>dom4j</groupId>
|
||||
<artifactId>dom4j</artifactId>
|
||||
<version>2.1.3</version>
|
||||
<version>1.6.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-lang</groupId>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.talend</groupId>
|
||||
<artifactId>talendMQRFH2</artifactId>
|
||||
<version>1.1.0-20220307</version>
|
||||
<version>1.0.1-20190206</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
@@ -36,10 +36,20 @@
|
||||
</distributionManagement>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.ibm.mq</groupId>
|
||||
<artifactId>com.ibm.mq</artifactId>
|
||||
<version>8.0.0.9</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.ibm.mq</groupId>
|
||||
<artifactId>com.ibm.mqjms</artifactId>
|
||||
<version>8.0.0.9</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.ibm.mq</groupId>
|
||||
<artifactId>com.ibm.mq.allclient</artifactId>
|
||||
<version>9.2.4.0</version>
|
||||
<version>8.0.0.9</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.talend.libraries</groupId>
|
||||
@@ -57,9 +67,9 @@
|
||||
<version>6.0.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.reload4j</groupId>
|
||||
<artifactId>reload4j</artifactId>
|
||||
<version>1.2.19</version>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.17</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<!-- #################################################### -->
|
||||
|
||||
<!-- modification 1: config -->
|
||||
<property name="jar.name" value="MsmqTalend-1.0.5.jar" />
|
||||
<property name="jar.name" value="MsmqTalend-1.0.0.jar" />
|
||||
<property name="component.name" value="tMicrosoftMQInput" />
|
||||
<property name="author.name" value="ytao" />
|
||||
|
||||
|
||||
@@ -113,9 +113,9 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.reload4j</groupId>
|
||||
<artifactId>reload4j</artifactId>
|
||||
<version>1.2.19</version>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.17</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- JUnit -->
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
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>
|
||||
|
||||
<groupId>org.talend.components</groupId>
|
||||
<artifactId>simpleexcel</artifactId>
|
||||
<version>2.4-20200923</version>
|
||||
<groupId>org.talend.libraries</groupId>
|
||||
<artifactId>simpleexcel-2.2-20190722</artifactId>
|
||||
<version>6.0.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>simpleexcel</name>
|
||||
@@ -13,7 +13,7 @@
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
<java.source.version>1.8</java.source.version>
|
||||
<java.source.version>1.6</java.source.version>
|
||||
</properties>
|
||||
|
||||
<distributionManagement>
|
||||
@@ -43,29 +43,47 @@
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi</artifactId>
|
||||
<version>4.1.2</version>
|
||||
<version>4.1.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-scratchpad</artifactId>
|
||||
<version>4.1.2</version>
|
||||
<version>4.1.0</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-ooxml</artifactId>
|
||||
<version>4.1.2</version>
|
||||
<version>4.1.0</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-ooxml-schemas</artifactId>
|
||||
<version>4.1.2</version>
|
||||
<version>4.1.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.reload4j</groupId>
|
||||
<artifactId>reload4j</artifactId>
|
||||
<version>1.2.19</version>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.17</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.geronimo.specs/geronimo-stax-api_1.0_spec -->
|
||||
<dependency>
|
||||
<groupId>org.apache.geronimo.specs</groupId>
|
||||
<artifactId>geronimo-stax-api_1.0_spec</artifactId>
|
||||
<version>1.0</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
|
||||
<dependency>
|
||||
<groupId>dom4j</groupId>
|
||||
<artifactId>dom4j</artifactId>
|
||||
<version>1.6.1</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans -->
|
||||
<dependency>
|
||||
<groupId>org.apache.xmlbeans</groupId>
|
||||
<artifactId>xmlbeans</artifactId>
|
||||
<version>3.1.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
@@ -90,4 +108,4 @@
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
</project>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2020 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2020 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
@@ -108,4 +108,4 @@ public class DefaultTalendSheetContentsHandler implements TalendXSSFSheetXMLHand
|
||||
}
|
||||
return columnIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2020 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2020 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2020 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
<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>
|
||||
<groupId>org.talend.components</groupId>
|
||||
<artifactId>components-soap</artifactId>
|
||||
<version>2.3-20200918</version>
|
||||
<groupId>org.talend.libraries</groupId>
|
||||
<artifactId>talend-soap</artifactId>
|
||||
<version>2.1-20190716</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>talend-soap</name>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<cxf.version>3.1.1</cxf.version>
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
</properties>
|
||||
|
||||
@@ -45,24 +46,29 @@
|
||||
<systemPath>${java.home}/lib/rt.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.dom4j</groupId>
|
||||
<artifactId>dom4j</artifactId>
|
||||
<version>2.1.3</version>
|
||||
<groupId>jdom</groupId>
|
||||
<artifactId>jdom</artifactId>
|
||||
<version>1.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.sun.xml.messaging.saaj</groupId>
|
||||
<artifactId>saaj-impl</artifactId>
|
||||
<version>1.5.2</version>
|
||||
<groupId>com.sun.xml.messaging.saaj</groupId>
|
||||
<artifactId>saaj-impl</artifactId>
|
||||
<version>1.3.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.activation</groupId>
|
||||
<artifactId>activation</artifactId>
|
||||
<version>1.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>xerces</groupId>
|
||||
<artifactId>xercesImpl</artifactId>
|
||||
<version>2.12.0</version>
|
||||
<version>2.6.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-codec</groupId>
|
||||
<artifactId>commons-codec</artifactId>
|
||||
<version>1.14</version>
|
||||
<version>1.9</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
@@ -102,4 +108,4 @@
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
</project>
|
||||
@@ -32,7 +32,8 @@ import javax.xml.transform.stream.StreamResult;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.dom4j.io.DOMReader;
|
||||
import org.jdom.input.DOMBuilder;
|
||||
import org.jdom.output.XMLOutputter;
|
||||
import org.talend.soap.sun.SunNtlmAuthenticationUpdater;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
@@ -44,6 +45,8 @@ public class SOAPUtil {
|
||||
|
||||
private static final String vmVendor = System.getProperty("java.vendor.url");
|
||||
|
||||
private static final String ibmVmVendor = "http://www.ibm.com/";
|
||||
|
||||
private static final String sunVmVendor = "http://java.sun.com/";
|
||||
|
||||
private static final String oracleVmVendor = "http://java.oracle.com/";
|
||||
@@ -137,7 +140,12 @@ public class SOAPUtil {
|
||||
StreamSource preppedMsgSrc = new StreamSource(stream);
|
||||
soapPart.setContent(preppedMsgSrc);
|
||||
|
||||
// InputStream stream = new FileInputStream(new File("d://soap.txt"));
|
||||
// StreamSource preppedMsgSrc = new StreamSource(stream);
|
||||
// soapPart.setContent(preppedMsgSrc);
|
||||
|
||||
message.saveChanges();
|
||||
// Send the message
|
||||
|
||||
SOAPMessage reply = connection.call(message, destination);
|
||||
|
||||
@@ -218,7 +226,7 @@ public class SOAPUtil {
|
||||
Node content;
|
||||
Element headerRootElem = document.createElement("Header");
|
||||
|
||||
Iterator<javax.xml.soap.Node> childElements = header.getChildElements();
|
||||
Iterator childElements = header.getChildElements();
|
||||
org.w3c.dom.Node domNode = null;
|
||||
while (childElements.hasNext()) {
|
||||
domNode = (org.w3c.dom.Node) childElements.next();
|
||||
@@ -237,11 +245,12 @@ public class SOAPUtil {
|
||||
return reHeaderMessage;
|
||||
}
|
||||
|
||||
private String Doc2StringWithoutDeclare(Document doc) {
|
||||
DOMReader reader = new DOMReader();
|
||||
org.dom4j.Document document = reader.read(doc);
|
||||
return document.getRootElement().asXML();
|
||||
}
|
||||
private String Doc2StringWithoutDeclare(Document doc) {
|
||||
DOMBuilder builder = new DOMBuilder();
|
||||
org.jdom.Document jdomDoc = builder.build(doc);
|
||||
XMLOutputter outputter = new XMLOutputter();
|
||||
return outputter.outputString(jdomDoc.getRootElement());
|
||||
}
|
||||
|
||||
/**
|
||||
* invoke soap and return the response document
|
||||
@@ -354,4 +363,4 @@ public class SOAPUtil {
|
||||
headers.setHeader("Authorization", "Basic " + encodeUserInfo);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,277 +0,0 @@
|
||||
package org.talend.aws;
|
||||
|
||||
import static com.amazonaws.event.SDKProgressPublisher.publishProgress;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedList;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import com.amazonaws.AmazonClientException;
|
||||
import com.amazonaws.AmazonServiceException;
|
||||
import com.amazonaws.event.ProgressEventType;
|
||||
import com.amazonaws.event.ProgressListener;
|
||||
import com.amazonaws.event.ProgressListenerChain;
|
||||
import com.amazonaws.services.s3.model.LegacyS3ProgressListener;
|
||||
import com.amazonaws.services.s3.transfer.Transfer;
|
||||
import com.amazonaws.services.s3.transfer.TransferProgress;
|
||||
import com.amazonaws.services.s3.transfer.internal.TransferMonitor;
|
||||
import com.amazonaws.services.s3.transfer.internal.TransferStateChangeListener;
|
||||
|
||||
|
||||
/**
|
||||
* Abstract transfer implementation.
|
||||
*/
|
||||
public abstract class AbstractTransfer implements Transfer {
|
||||
|
||||
/** The current state of this transfer. */
|
||||
protected volatile TransferState state = TransferState.Waiting;
|
||||
|
||||
protected TransferMonitor monitor;
|
||||
|
||||
/** The progress of this transfer. */
|
||||
private final TransferProgress transferProgress;
|
||||
|
||||
private final String description;
|
||||
|
||||
/** Hook for adding/removing more progress listeners. */
|
||||
protected final ProgressListenerChain listenerChain;
|
||||
|
||||
/** Collection of listeners to be notified for changes to the state of this transfer via setState() */
|
||||
protected final Collection<TransferStateChangeListener> stateChangeListeners = new LinkedList<TransferStateChangeListener>();
|
||||
|
||||
AbstractTransfer(String description, TransferProgress transferProgress, ProgressListenerChain progressListenerChain) {
|
||||
this(description, transferProgress, progressListenerChain, null);
|
||||
}
|
||||
|
||||
AbstractTransfer(String description, TransferProgress transferProgress,
|
||||
ProgressListenerChain progressListenerChain, TransferStateChangeListener stateChangeListener) {
|
||||
this.description = description;
|
||||
this.listenerChain = progressListenerChain;
|
||||
this.transferProgress = transferProgress;
|
||||
addStateChangeListener(stateChangeListener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether or not the transfer is finished (i.e. completed successfully,
|
||||
* failed, or was canceled). This method should never block.
|
||||
*
|
||||
* @return Returns <code>true</code> if this transfer is finished (i.e. completed successfully,
|
||||
* failed, or was canceled). Returns <code>false</code> if otherwise.
|
||||
*/
|
||||
public final synchronized boolean isDone() {
|
||||
return (state == TransferState.Failed ||
|
||||
state == TransferState.Completed ||
|
||||
state == TransferState.Canceled);
|
||||
}
|
||||
|
||||
/**
|
||||
* Waits for this transfer to complete. This is a blocking call; the current
|
||||
* thread is suspended until this transfer completes.
|
||||
*
|
||||
* @throws AmazonClientException
|
||||
* If any errors were encountered in the client while making the
|
||||
* request or handling the response.
|
||||
* @throws AmazonServiceException
|
||||
* If any errors occurred in Amazon S3 while processing the
|
||||
* request.
|
||||
* @throws InterruptedException
|
||||
* If this thread is interrupted while waiting for the transfer
|
||||
* to complete.
|
||||
*/
|
||||
public void waitForCompletion()
|
||||
throws AmazonClientException, AmazonServiceException, InterruptedException {
|
||||
try {
|
||||
Object result = null;
|
||||
while (!monitor.isDone() || result == null) {
|
||||
Future<?> f = monitor.getFuture();
|
||||
result = f.get();
|
||||
}
|
||||
} catch (ExecutionException e) {
|
||||
rethrowExecutionException(e);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Waits for this transfer to finish and returns any error that occurred, or
|
||||
* returns <code>null</code> if no errors occurred.
|
||||
* This is a blocking call; the current thread
|
||||
* will be suspended until this transfer either fails or completes
|
||||
* successfully.
|
||||
*
|
||||
* @return Any error that occurred while processing this transfer.
|
||||
* Otherwise returns <code>null</code> if no errors occurred.
|
||||
*
|
||||
* @throws InterruptedException
|
||||
* If this thread is interrupted while waiting for the transfer
|
||||
* to complete.
|
||||
*/
|
||||
public AmazonClientException waitForException() throws InterruptedException {
|
||||
try {
|
||||
|
||||
/**
|
||||
* Do not remove the while loop. We need this as the future returned by
|
||||
* monitor.getFuture() is set two times during the upload and copy operations.
|
||||
*/
|
||||
while (!monitor.isDone()) {
|
||||
monitor.getFuture().get();
|
||||
}
|
||||
monitor.getFuture().get();
|
||||
return null;
|
||||
} catch (ExecutionException e) {
|
||||
return unwrapExecutionException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a human-readable description of this transfer.
|
||||
*
|
||||
* @return A human-readable description of this transfer.
|
||||
*/
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current state of this transfer.
|
||||
*
|
||||
* @return The current state of this transfer.
|
||||
*/
|
||||
public synchronized TransferState getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current state of this transfer.
|
||||
*/
|
||||
public void setState(TransferState state) {
|
||||
synchronized (this) {
|
||||
this.state = state;
|
||||
}
|
||||
for ( TransferStateChangeListener listener : stateChangeListeners ) {
|
||||
listener.transferStateChanged(this, state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies all the registered state change listeners of the state update.
|
||||
*/
|
||||
public void notifyStateChangeListeners(TransferState state) {
|
||||
for ( TransferStateChangeListener listener : stateChangeListeners ) {
|
||||
listener.transferStateChanged(this, state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the specified progress listener to the list of listeners
|
||||
* receiving updates about this transfer's progress.
|
||||
*
|
||||
* @param listener
|
||||
* The progress listener to add.
|
||||
*/
|
||||
public synchronized void addProgressListener(ProgressListener listener) {
|
||||
listenerChain.addProgressListener(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the specified progress listener from the list of progress
|
||||
* listeners receiving updates about this transfer's progress.
|
||||
*
|
||||
* @param listener
|
||||
* The progress listener to remove.
|
||||
*/
|
||||
public synchronized void removeProgressListener(ProgressListener listener) {
|
||||
listenerChain.removeProgressListener(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Replaced by {@link #addProgressListener(ProgressListener)}
|
||||
*/
|
||||
@Deprecated
|
||||
public synchronized void addProgressListener(com.amazonaws.services.s3.model.ProgressListener listener) {
|
||||
listenerChain.addProgressListener(new LegacyS3ProgressListener(listener));
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Replaced by {@link #removeProgressListener(ProgressListener)}
|
||||
*/
|
||||
@Deprecated
|
||||
public synchronized void removeProgressListener(com.amazonaws.services.s3.model.ProgressListener listener) {
|
||||
listenerChain.removeProgressListener(new LegacyS3ProgressListener(listener));
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the given state change listener to the collection of listeners.
|
||||
*/
|
||||
public synchronized void addStateChangeListener(TransferStateChangeListener listener) {
|
||||
if ( listener != null )
|
||||
stateChangeListeners.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the given state change listener from the collection of listeners.
|
||||
*/
|
||||
public synchronized void removeStateChangeListener(TransferStateChangeListener listener) {
|
||||
if ( listener != null )
|
||||
stateChangeListeners.remove(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns progress information about this transfer.
|
||||
*
|
||||
* @return The progress information about this transfer.
|
||||
*/
|
||||
public TransferProgress getProgress() {
|
||||
return transferProgress;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the monitor used to poll for transfer completion.
|
||||
*/
|
||||
public void setMonitor(TransferMonitor monitor) {
|
||||
this.monitor = monitor;
|
||||
}
|
||||
|
||||
public TransferMonitor getMonitor() {
|
||||
return monitor;
|
||||
}
|
||||
|
||||
protected void fireProgressEvent(final ProgressEventType eventType) {
|
||||
publishProgress(listenerChain, eventType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Examines the cause of the specified ExecutionException and either
|
||||
* rethrows it directly (if it's a type of AmazonClientException) or wraps
|
||||
* it in an AmazonClientException and rethrows it.
|
||||
*
|
||||
* @param e
|
||||
* The execution exception to examine.
|
||||
*/
|
||||
protected void rethrowExecutionException(ExecutionException e) {
|
||||
throw unwrapExecutionException(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unwraps the root exception that caused the specified ExecutionException
|
||||
* and returns it. If it was not an instance of AmazonClientException, it is
|
||||
* wrapped as an AmazonClientException.
|
||||
*
|
||||
* @param e
|
||||
* The ExecutionException to unwrap.
|
||||
*
|
||||
* @return The root exception that caused the specified ExecutionException.
|
||||
*/
|
||||
protected AmazonClientException unwrapExecutionException(ExecutionException e) {
|
||||
Throwable t = e;
|
||||
while (t.getCause() != null && t instanceof ExecutionException) {
|
||||
t = t.getCause();
|
||||
}
|
||||
if (t instanceof AmazonClientException) {
|
||||
return (AmazonClientException) t;
|
||||
}
|
||||
return new AmazonClientException("Unable to complete transfer: " + t.getMessage(), t);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
package org.talend.aws;
|
||||
|
||||
import com.amazonaws.annotation.SdkInternalApi;
|
||||
import com.amazonaws.services.s3.internal.ServiceUtils;
|
||||
import com.amazonaws.services.s3.transfer.Transfer;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
/**
|
||||
* Helper class to merge all the individual part files into a destinationFile.
|
||||
*/
|
||||
@SdkInternalApi
|
||||
public class CompleteMultipartDownload implements Callable<File> {
|
||||
private final List<Future<File>> partFiles;
|
||||
private final File destinationFile;
|
||||
private final DownloadImpl download;
|
||||
private Integer currentPartNumber;
|
||||
|
||||
public CompleteMultipartDownload(List<Future<File>> files, File destinationFile, DownloadImpl download, Integer currentPartNumber) {
|
||||
this.partFiles = files;
|
||||
this.destinationFile = destinationFile;
|
||||
this.download = download;
|
||||
this.currentPartNumber = currentPartNumber;
|
||||
}
|
||||
|
||||
@Override
|
||||
public File call() throws Exception {
|
||||
for (Future<File> file : partFiles) {
|
||||
ServiceUtils.appendFile(file.get(), destinationFile);
|
||||
download.updatePersistableTransfer(currentPartNumber++);
|
||||
}
|
||||
|
||||
download.setState(Transfer.TransferState.Completed);
|
||||
return destinationFile;
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
package org.talend.aws;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import com.amazonaws.services.s3.model.CryptoMode;
|
||||
import com.amazonaws.services.s3.model.ObjectMetadata;
|
||||
import com.amazonaws.services.s3.transfer.Transfer;
|
||||
import com.amazonaws.services.s3.transfer.exception.PauseException;
|
||||
|
||||
/**
|
||||
* Represents an asynchronous download from Amazon S3.
|
||||
*/
|
||||
public interface Download extends Transfer {
|
||||
|
||||
/**
|
||||
* Returns the ObjectMetadata for the object being downloaded.
|
||||
*
|
||||
* @return The ObjectMetadata for the object being downloaded.
|
||||
*/
|
||||
public ObjectMetadata getObjectMetadata();
|
||||
|
||||
/**
|
||||
* The name of the bucket where the object is being downloaded from.
|
||||
*
|
||||
* @return The name of the bucket where the object is being downloaded from.
|
||||
*/
|
||||
public String getBucketName();
|
||||
|
||||
/**
|
||||
* The key under which this object was stored in Amazon S3.
|
||||
*
|
||||
* @return The key under which this object was stored in Amazon S3.
|
||||
*/
|
||||
public String getKey();
|
||||
|
||||
/**
|
||||
* Cancels this download.
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
public void abort() throws IOException;
|
||||
|
||||
/**
|
||||
* Pause the current download operation and returns the information that can
|
||||
* be used to resume the download at a later time.
|
||||
*
|
||||
* Resuming a download would not perform ETag check as range get is
|
||||
* performed for downloading the object's remaining contents.
|
||||
*
|
||||
* Resuming a download for an object encrypted using
|
||||
* {@link CryptoMode#StrictAuthenticatedEncryption} would result in
|
||||
* AmazonClientException as authenticity cannot be guaranteed for a range
|
||||
* get operation.
|
||||
*
|
||||
* @throws PauseException
|
||||
* If any errors were encountered while trying to pause the
|
||||
* download.
|
||||
*/
|
||||
public PersistableDownload pause() throws PauseException;
|
||||
}
|
||||
@@ -1,312 +0,0 @@
|
||||
package org.talend.aws;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.net.SocketException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import javax.net.ssl.SSLProtocolException;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import com.amazonaws.AmazonClientException;
|
||||
import com.amazonaws.SdkClientException;
|
||||
import com.amazonaws.annotation.SdkInternalApi;
|
||||
import com.amazonaws.services.s3.AmazonS3;
|
||||
import com.amazonaws.services.s3.internal.FileLocks;
|
||||
import com.amazonaws.services.s3.internal.ServiceUtils;
|
||||
import com.amazonaws.services.s3.internal.ServiceUtils.RetryableS3DownloadTask;
|
||||
import com.amazonaws.services.s3.model.GetObjectRequest;
|
||||
import com.amazonaws.services.s3.model.S3Object;
|
||||
import com.amazonaws.services.s3.transfer.Transfer.TransferState;
|
||||
import com.amazonaws.services.s3.transfer.exception.FileLockException;
|
||||
import com.amazonaws.util.IOUtils;
|
||||
|
||||
@SdkInternalApi
|
||||
final class DownloadCallable implements Callable<File> {
|
||||
private static final Log LOG = LogFactory.getLog(DownloadCallable.class);
|
||||
|
||||
private final AmazonS3 s3;
|
||||
private final CountDownLatch latch;
|
||||
private final GetObjectRequest req;
|
||||
private final boolean resumeExistingDownload;
|
||||
private final DownloadImpl download;
|
||||
private final File dstfile;
|
||||
private final long origStartingByte;
|
||||
private final long timeout;
|
||||
private final ScheduledExecutorService timedExecutor;
|
||||
/** The thread pool in which parts are downloaded downloaded. */
|
||||
private final ExecutorService executor;
|
||||
private final List<Future<File>> futureFiles;
|
||||
private final boolean isDownloadParallel;
|
||||
private Integer lastFullyMergedPartNumber;
|
||||
private final boolean resumeOnRetry;
|
||||
|
||||
private long expectedFileLength;
|
||||
|
||||
DownloadCallable(AmazonS3 s3, CountDownLatch latch,
|
||||
GetObjectRequest req, boolean resumeExistingDownload,
|
||||
DownloadImpl download, File dstfile, long origStartingByte,
|
||||
long expectedFileLength, long timeout,
|
||||
ScheduledExecutorService timedExecutor,
|
||||
ExecutorService executor,
|
||||
Integer lastFullyDownloadedPartNumber, boolean isDownloadParallel, boolean resumeOnRetry)
|
||||
{
|
||||
if (s3 == null || latch == null || req == null || dstfile == null || download == null)
|
||||
throw new IllegalArgumentException();
|
||||
this.s3 = s3;
|
||||
this.latch = latch;
|
||||
this.req = req;
|
||||
this.resumeExistingDownload = resumeExistingDownload;
|
||||
this.download = download;
|
||||
this.dstfile = dstfile;
|
||||
this.origStartingByte = origStartingByte;
|
||||
this.expectedFileLength = expectedFileLength;
|
||||
this.timeout = timeout;
|
||||
this.timedExecutor = timedExecutor;
|
||||
this.executor = executor;
|
||||
this.futureFiles = new ArrayList<Future<File>>();
|
||||
this.lastFullyMergedPartNumber = lastFullyDownloadedPartNumber;
|
||||
this.isDownloadParallel = isDownloadParallel;
|
||||
this.resumeOnRetry = resumeOnRetry;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method must return a non-null object, or else the existing
|
||||
* implementation in {@link AbstractTransfer#waitForCompletion()}
|
||||
* would block forever.
|
||||
*
|
||||
* @return the downloaded file
|
||||
*/
|
||||
@Override
|
||||
public File call() throws Exception {
|
||||
try {
|
||||
latch.await();
|
||||
|
||||
if (isTimeoutEnabled()) {
|
||||
timedExecutor.schedule(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
if (download.getState() != TransferState.Completed) {
|
||||
download.abort();
|
||||
}
|
||||
} catch(Exception e) {
|
||||
throw new SdkClientException(
|
||||
"Unable to abort download after timeout", e);
|
||||
}
|
||||
}
|
||||
}, timeout, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
download.setState(TransferState.InProgress);
|
||||
ServiceUtils.createParentDirectoryIfNecessary(dstfile);
|
||||
|
||||
if (isDownloadParallel) {
|
||||
downloadInParallel(ServiceUtils.getPartCount(req, s3));
|
||||
} else {
|
||||
S3Object s3Object = retryableDownloadS3ObjectToFile(dstfile,
|
||||
new DownloadTaskImpl(s3, download, req));
|
||||
updateDownloadStatus(s3Object);
|
||||
}
|
||||
return dstfile;
|
||||
} catch (Throwable t) {
|
||||
// Cancel all the futures
|
||||
for (Future<File> f : futureFiles) {
|
||||
f.cancel(true);
|
||||
}
|
||||
// Downloads aren't allowed to move from canceled to failed
|
||||
if (download.getState() != TransferState.Canceled) {
|
||||
download.setState(TransferState.Failed);
|
||||
}
|
||||
if (t instanceof Exception)
|
||||
throw (Exception) t;
|
||||
else
|
||||
throw (Error) t;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes the result from serial download,
|
||||
* updates the transfer state and monitor in downloadImpl object
|
||||
* based on the result.
|
||||
*/
|
||||
private void updateDownloadStatus(S3Object result) {
|
||||
if (result == null) {
|
||||
download.setState(TransferState.Canceled);
|
||||
download.setMonitor(new DownloadMonitor(download, null));
|
||||
} else {
|
||||
download.setState(TransferState.Completed);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Downloads each part of the object into a separate file synchronously and
|
||||
* combines all the files into a single file.
|
||||
*/
|
||||
private void downloadInParallel(int partCount) throws Exception {
|
||||
if (lastFullyMergedPartNumber == null) {
|
||||
lastFullyMergedPartNumber = 0;
|
||||
}
|
||||
|
||||
for (int i = lastFullyMergedPartNumber + 1; i <= partCount; i++) {
|
||||
GetObjectRequest getPartRequest = new GetObjectRequest(req.getBucketName(), req.getKey(),
|
||||
req.getVersionId()).withUnmodifiedSinceConstraint(req.getUnmodifiedSinceConstraint())
|
||||
.withModifiedSinceConstraint(req.getModifiedSinceConstraint())
|
||||
.withResponseHeaders(req.getResponseHeaders()).withSSECustomerKey(req.getSSECustomerKey())
|
||||
.withGeneralProgressListener(req.getGeneralProgressListener());
|
||||
|
||||
getPartRequest.setMatchingETagConstraints(req.getMatchingETagConstraints());
|
||||
getPartRequest.setNonmatchingETagConstraints(req.getNonmatchingETagConstraints());
|
||||
getPartRequest.setRequesterPays(req.isRequesterPays());
|
||||
|
||||
futureFiles.add(
|
||||
executor.submit(new DownloadPartCallable(s3, getPartRequest.withPartNumber(i), dstfile)));
|
||||
}
|
||||
|
||||
truncateDestinationFileIfNecessary();
|
||||
Future<File> future = executor.submit(new CompleteMultipartDownload(futureFiles, dstfile, download, ++lastFullyMergedPartNumber));
|
||||
((DownloadMonitor) download.getMonitor()).setFuture(future);
|
||||
}
|
||||
|
||||
/**
|
||||
* If only partial part object is merged into the dstFile(due to pause
|
||||
* operation), adjust the file length so that the part starts writing from
|
||||
* the correct position.
|
||||
*/
|
||||
private void truncateDestinationFileIfNecessary() {
|
||||
RandomAccessFile raf = null;
|
||||
if (!FileLocks.lock(dstfile)) {
|
||||
throw new FileLockException("Fail to lock " + dstfile);
|
||||
}
|
||||
|
||||
try {
|
||||
raf = new RandomAccessFile(dstfile, "rw");
|
||||
if (lastFullyMergedPartNumber == 0) {
|
||||
raf.setLength(0);
|
||||
} else {
|
||||
long lastByte = ServiceUtils.getLastByteInPart(s3, req, lastFullyMergedPartNumber);
|
||||
if (dstfile.length() < lastByte) {
|
||||
throw new SdkClientException(
|
||||
"File " + dstfile.getAbsolutePath() + " has been modified since last pause.");
|
||||
}
|
||||
raf.setLength(lastByte + 1);
|
||||
download.getProgress().updateProgress(lastByte + 1);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new SdkClientException("Unable to append part file to dstfile " + e.getMessage(), e);
|
||||
} finally {
|
||||
IOUtils.closeQuietly(raf, LOG);
|
||||
FileLocks.unlock(dstfile);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called only if it is a resumed download.
|
||||
*
|
||||
* Adjust the range of the get request, and the expected (ie current) file
|
||||
* length of the destination file to append to.
|
||||
*/
|
||||
private void adjustRequest(GetObjectRequest req) {
|
||||
long[] range = req.getRange();
|
||||
long lastByte = range[1];
|
||||
long totalBytesToDownload = lastByte - this.origStartingByte + 1;
|
||||
|
||||
if (dstfile.exists()) {
|
||||
if (!FileLocks.lock(dstfile)) {
|
||||
throw new FileLockException("Fail to lock " + dstfile
|
||||
+ " for range adjustment");
|
||||
}
|
||||
try {
|
||||
expectedFileLength = dstfile.length();
|
||||
long startingByte = this.origStartingByte + expectedFileLength;
|
||||
LOG.info("Adjusting request range from " + Arrays.toString(range)
|
||||
+ " to "
|
||||
+ Arrays.toString(new long[] { startingByte, lastByte })
|
||||
+ " for file " + dstfile);
|
||||
req.setRange(startingByte, lastByte);
|
||||
totalBytesToDownload = lastByte - startingByte + 1;
|
||||
} finally {
|
||||
FileLocks.unlock(dstfile);
|
||||
}
|
||||
}
|
||||
|
||||
if (totalBytesToDownload < 0) {
|
||||
throw new IllegalArgumentException(
|
||||
"Unable to determine the range for download operation. lastByte="
|
||||
+ lastByte + ", origStartingByte=" + origStartingByte
|
||||
+ ", expectedFileLength=" + expectedFileLength
|
||||
+ ", totalBytesToDownload=" + totalBytesToDownload);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private S3Object retryableDownloadS3ObjectToFile(File file,
|
||||
RetryableS3DownloadTask retryableS3DownloadTask) {
|
||||
boolean hasRetried = false;
|
||||
S3Object s3Object;
|
||||
for (;;) {
|
||||
final boolean appendData = resumeExistingDownload || (resumeOnRetry && hasRetried);
|
||||
if (appendData && hasRetried) {
|
||||
// Need to adjust the get range or else we risk corrupting the downloaded file
|
||||
adjustRequest(req);
|
||||
}
|
||||
s3Object = retryableS3DownloadTask.getS3ObjectStream();
|
||||
if (s3Object == null)
|
||||
return null;
|
||||
try {
|
||||
if (testing && resumeExistingDownload && !hasRetried) {
|
||||
throw new SdkClientException("testing");
|
||||
}
|
||||
ServiceUtils.downloadToFile(s3Object, file,
|
||||
retryableS3DownloadTask.needIntegrityCheck(),
|
||||
appendData, expectedFileLength);
|
||||
return s3Object;
|
||||
} catch (AmazonClientException ace) {
|
||||
if (!ace.isRetryable())
|
||||
throw ace;
|
||||
// Determine whether an immediate retry is needed according to the captured SdkClientException.
|
||||
// (There are three cases when downloadObjectToFile() throws SdkClientException:
|
||||
// 1) SocketException or SSLProtocolException when writing to disk (e.g. when user aborts the download)
|
||||
// 2) Other IOException when writing to disk
|
||||
// 3) MD5 hashes don't match
|
||||
// For 1) If SocketException is the result of the client side resetting the connection, this is retried
|
||||
// Cases 2) and 3) will always be retried
|
||||
final Throwable cause = ace.getCause();
|
||||
if ((cause instanceof SocketException && !cause.getMessage().equals("Connection reset"))
|
||||
|| (cause instanceof SSLProtocolException)) {
|
||||
throw ace;
|
||||
} else {
|
||||
if (hasRetried)
|
||||
throw ace;
|
||||
else {
|
||||
LOG.info("Retry the download of object " + s3Object.getKey() + " (bucket " + s3Object.getBucketName() + ")", ace);
|
||||
hasRetried = true;
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
s3Object.getObjectContent().abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isTimeoutEnabled() {
|
||||
return timeout > 0;
|
||||
}
|
||||
|
||||
private static boolean testing;
|
||||
/**
|
||||
* Used for testing purpose only.
|
||||
*/
|
||||
static void setTesting(boolean b) {
|
||||
testing = b;
|
||||
}
|
||||
}
|
||||
@@ -1,202 +0,0 @@
|
||||
package org.talend.aws;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
import com.amazonaws.annotation.SdkInternalApi;
|
||||
import com.amazonaws.event.ProgressEventType;
|
||||
import com.amazonaws.event.ProgressListenerChain;
|
||||
import com.amazonaws.services.s3.model.GetObjectRequest;
|
||||
import com.amazonaws.services.s3.model.ObjectMetadata;
|
||||
import com.amazonaws.services.s3.model.S3Object;
|
||||
import com.amazonaws.services.s3.transfer.TransferProgress;
|
||||
import com.amazonaws.services.s3.transfer.exception.PauseException;
|
||||
import com.amazonaws.services.s3.transfer.internal.S3ProgressPublisher;
|
||||
import com.amazonaws.services.s3.transfer.internal.TransferManagerUtils;
|
||||
import com.amazonaws.services.s3.transfer.internal.TransferStateChangeListener;
|
||||
|
||||
public class DownloadImpl extends AbstractTransfer implements Download {
|
||||
private S3Object s3Object;
|
||||
|
||||
/**
|
||||
* Information to resume if the download is paused.
|
||||
*/
|
||||
private PersistableDownload persistableDownload;
|
||||
|
||||
/**
|
||||
* The last part that has been successfully written into the downloaded file.
|
||||
*/
|
||||
private Integer lastFullyDownloadedPartNumber;
|
||||
|
||||
private final GetObjectRequest getObjectRequest;
|
||||
private final File file;
|
||||
private final ObjectMetadata objectMetadata;
|
||||
private final ProgressListenerChain progressListenerChain;
|
||||
|
||||
@Deprecated
|
||||
public DownloadImpl(String description, TransferProgress transferProgress,
|
||||
ProgressListenerChain progressListenerChain, S3Object s3Object, TransferStateChangeListener listener,
|
||||
GetObjectRequest getObjectRequest, File file) {
|
||||
this(description, transferProgress, progressListenerChain, s3Object, listener,
|
||||
getObjectRequest, file, null, false);
|
||||
}
|
||||
|
||||
public DownloadImpl(String description, TransferProgress transferProgress,
|
||||
ProgressListenerChain progressListenerChain, S3Object s3Object, TransferStateChangeListener listener,
|
||||
GetObjectRequest getObjectRequest, File file,
|
||||
ObjectMetadata objectMetadata, boolean isDownloadParallel) {
|
||||
super(description, transferProgress, progressListenerChain, listener);
|
||||
this.s3Object = s3Object;
|
||||
this.objectMetadata = objectMetadata;
|
||||
this.getObjectRequest = getObjectRequest;
|
||||
this.file = file;
|
||||
this.progressListenerChain = progressListenerChain;
|
||||
this.persistableDownload = captureDownloadState(getObjectRequest, file);
|
||||
S3ProgressPublisher.publishTransferPersistable(progressListenerChain, persistableDownload);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ObjectMetadata for the object being downloaded.
|
||||
*
|
||||
* @return The ObjectMetadata for the object being downloaded.
|
||||
*/
|
||||
public synchronized ObjectMetadata getObjectMetadata() {
|
||||
if (s3Object != null) {
|
||||
return s3Object.getObjectMetadata();
|
||||
}
|
||||
return objectMetadata;
|
||||
}
|
||||
|
||||
/**
|
||||
* The name of the bucket where the object is being downloaded from.
|
||||
*
|
||||
* @return The name of the bucket where the object is being downloaded from.
|
||||
*/
|
||||
public String getBucketName() {
|
||||
return getObjectRequest.getBucketName();
|
||||
}
|
||||
|
||||
/**
|
||||
* The key under which this object was stored in Amazon S3.
|
||||
*
|
||||
* @return The key under which this object was stored in Amazon S3.
|
||||
*/
|
||||
public String getKey() {
|
||||
return getObjectRequest.getKey();
|
||||
}
|
||||
|
||||
/**
|
||||
* Only for internal use.
|
||||
* For parallel downloads, Updates the persistableTransfer each time a
|
||||
* part is successfully merged into download file.
|
||||
* Then notify the listeners that new persistableTransfer is available.
|
||||
*/
|
||||
@SdkInternalApi
|
||||
public void updatePersistableTransfer(Integer lastFullyDownloadedPartNumber) {
|
||||
synchronized (this) {
|
||||
this.lastFullyDownloadedPartNumber = lastFullyDownloadedPartNumber;
|
||||
}
|
||||
|
||||
persistableDownload = captureDownloadState(getObjectRequest, file);
|
||||
S3ProgressPublisher.publishTransferPersistable(progressListenerChain, persistableDownload);
|
||||
}
|
||||
|
||||
/**
|
||||
* For parallel downloads, returns the last part number that was
|
||||
* successfully written into the download file.
|
||||
* Returns null for serial downloads.
|
||||
*/
|
||||
public synchronized Integer getLastFullyDownloadedPartNumber() {
|
||||
return lastFullyDownloadedPartNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels this download.
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
public synchronized void abort() throws IOException {
|
||||
|
||||
this.monitor.getFuture().cancel(true);
|
||||
|
||||
if ( s3Object != null ) {
|
||||
s3Object.getObjectContent().abort();
|
||||
}
|
||||
setState(TransferState.Canceled);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels this download, but skip notifying the state change listeners.
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
public synchronized void abortWithoutNotifyingStateChangeListener() throws IOException {
|
||||
this.monitor.getFuture().cancel(true);
|
||||
this.state = TransferState.Canceled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the S3 object to download.
|
||||
*/
|
||||
public synchronized void setS3Object(S3Object s3Object) {
|
||||
this.s3Object = s3Object;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is also responsible for firing COMPLETED signal to the
|
||||
* listeners.
|
||||
*/
|
||||
@Override
|
||||
public void setState(TransferState state) {
|
||||
super.setState(state);
|
||||
|
||||
switch (state) {
|
||||
case Completed :
|
||||
fireProgressEvent(ProgressEventType.TRANSFER_COMPLETED_EVENT);
|
||||
break;
|
||||
case Canceled:
|
||||
fireProgressEvent(ProgressEventType.TRANSFER_CANCELED_EVENT);
|
||||
break;
|
||||
case Failed:
|
||||
fireProgressEvent(ProgressEventType.TRANSFER_FAILED_EVENT);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the captured state of the download; or null if it should not be
|
||||
* captured (for security reason).
|
||||
*/
|
||||
private PersistableDownload captureDownloadState(
|
||||
final GetObjectRequest getObjectRequest, final File file) {
|
||||
if (getObjectRequest.getSSECustomerKey() == null) {
|
||||
return new PersistableDownload(
|
||||
getObjectRequest.getBucketName(), getObjectRequest.getKey(),
|
||||
getObjectRequest.getVersionId(), getObjectRequest.getRange(),
|
||||
getObjectRequest.getResponseHeaders(), getObjectRequest.isRequesterPays(),
|
||||
file.getAbsolutePath(), getLastFullyDownloadedPartNumber(),
|
||||
getObjectMetadata().getLastModified().getTime());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see com.amazonaws.services.s3.transfer.Download#pause()
|
||||
*/
|
||||
@Override
|
||||
public PersistableDownload pause() throws PauseException {
|
||||
boolean forceCancel = true;
|
||||
TransferState currentState = getState();
|
||||
this.monitor.getFuture().cancel(true);
|
||||
|
||||
if (persistableDownload == null) {
|
||||
throw new PauseException(TransferManagerUtils.determinePauseStatus(
|
||||
currentState, forceCancel));
|
||||
}
|
||||
return persistableDownload;
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package org.talend.aws;
|
||||
|
||||
import com.amazonaws.services.s3.transfer.internal.TransferMonitor;
|
||||
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
public class DownloadMonitor implements TransferMonitor {
|
||||
|
||||
private Future<?> future;
|
||||
private final DownloadImpl download;
|
||||
|
||||
public DownloadMonitor(DownloadImpl download, Future<?> future) {
|
||||
this.download = download;
|
||||
this.future = future;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized Future<?> getFuture() {
|
||||
return future;
|
||||
}
|
||||
|
||||
public synchronized void setFuture(Future<?> future) {
|
||||
this.future = future;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDone() {
|
||||
return download.isDone();
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
package org.talend.aws;
|
||||
|
||||
import com.amazonaws.util.StringUtils;
|
||||
import java.io.File;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
import com.amazonaws.SdkClientException;
|
||||
import com.amazonaws.services.s3.AmazonS3;
|
||||
import com.amazonaws.services.s3.model.GetObjectRequest;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* Helper class to get a part from s3,
|
||||
* write the part data to a temporary file and
|
||||
* return the temporary file.
|
||||
*/
|
||||
public class DownloadPartCallable implements Callable<File> {
|
||||
private static final Log LOG = LogFactory.getLog(DownloadPartCallable.class);
|
||||
private static final String TEMP_FILE_MIDDLE_NAME = ".part.";
|
||||
|
||||
private final AmazonS3 s3;
|
||||
private final GetObjectRequest getPartRequest;
|
||||
private final File destinationFile;
|
||||
private final String destinationFilePath;
|
||||
|
||||
public DownloadPartCallable(AmazonS3 s3, GetObjectRequest getPartRequest, File destinationFile) {
|
||||
this.s3 = s3;
|
||||
this.getPartRequest = getPartRequest;
|
||||
this.destinationFile = destinationFile;
|
||||
this.destinationFilePath = destinationFile.getAbsolutePath();
|
||||
}
|
||||
|
||||
public File call() throws Exception {
|
||||
final File partFile = File.createTempFile(
|
||||
UUID.nameUUIDFromBytes(destinationFile.getName().getBytes(StringUtils.UTF8)).toString(),
|
||||
TEMP_FILE_MIDDLE_NAME + getPartRequest.getPartNumber().toString(),
|
||||
new File(destinationFilePath.substring(0, destinationFilePath.lastIndexOf(File.separator))));
|
||||
try {
|
||||
partFile.deleteOnExit();
|
||||
} catch (SecurityException exception) {
|
||||
LOG.warn("SecurityException denied delete access to file " + partFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
if (s3.getObject(getPartRequest, partFile) == null) {
|
||||
throw new SdkClientException(
|
||||
"There is no object in S3 satisfying this request. The getObject method returned null");
|
||||
}
|
||||
return partFile;
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
package org.talend.aws;
|
||||
|
||||
import com.amazonaws.services.s3.AmazonS3;
|
||||
import com.amazonaws.services.s3.AmazonS3Encryption;
|
||||
import com.amazonaws.services.s3.internal.ServiceUtils;
|
||||
import com.amazonaws.services.s3.internal.SkipMd5CheckStrategy;
|
||||
import com.amazonaws.services.s3.model.GetObjectRequest;
|
||||
import com.amazonaws.services.s3.model.S3Object;
|
||||
|
||||
final class DownloadTaskImpl implements
|
||||
ServiceUtils.RetryableS3DownloadTask
|
||||
{
|
||||
private final AmazonS3 s3;
|
||||
private final DownloadImpl download;
|
||||
private final GetObjectRequest getObjectRequest;
|
||||
private final SkipMd5CheckStrategy skipMd5CheckStrategy = SkipMd5CheckStrategy.INSTANCE;
|
||||
|
||||
DownloadTaskImpl(AmazonS3 s3, DownloadImpl download,
|
||||
GetObjectRequest getObjectRequest) {
|
||||
this.s3 = s3;
|
||||
this.download = download;
|
||||
this.getObjectRequest = getObjectRequest;
|
||||
}
|
||||
|
||||
@Override
|
||||
public S3Object getS3ObjectStream() {
|
||||
S3Object s3Object = s3.getObject(getObjectRequest);
|
||||
download.setS3Object(s3Object);
|
||||
return s3Object;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needIntegrityCheck() {
|
||||
// Don't perform the integrity check if the checksum won't matchup.
|
||||
return !(s3 instanceof AmazonS3Encryption) && !skipMd5CheckStrategy.skipClientSideValidationPerRequest(getObjectRequest);
|
||||
}
|
||||
}
|
||||
@@ -1,159 +0,0 @@
|
||||
package org.talend.aws;
|
||||
|
||||
import com.amazonaws.services.s3.model.ResponseHeaderOverrides;
|
||||
import com.amazonaws.services.s3.transfer.PersistableTransfer;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
/**
|
||||
* An opaque token that holds some private state and can be used to resume a
|
||||
* paused download operation.
|
||||
*/
|
||||
public final class PersistableDownload extends PersistableTransfer {
|
||||
|
||||
static final String TYPE = "download";
|
||||
|
||||
@JsonProperty
|
||||
private final String pauseType = TYPE;
|
||||
|
||||
/** The bucket name in Amazon S3 from where the object has to be downloaded. */
|
||||
@JsonProperty
|
||||
private final String bucketName;
|
||||
|
||||
/** The name of the object in Amazon S3 that has to be downloaded. */
|
||||
@JsonProperty
|
||||
private final String key;
|
||||
|
||||
/** The version id of the object in Amazon S3 to download. */
|
||||
@JsonProperty
|
||||
private final String versionId;
|
||||
|
||||
/** Optional member indicating the byte range of data to retrieve */
|
||||
@JsonProperty
|
||||
private final long[] range;
|
||||
|
||||
/**
|
||||
* Optional field that overrides headers on the response.
|
||||
*/
|
||||
@JsonProperty
|
||||
private final ResponseHeaderOverrides responseHeaders;
|
||||
|
||||
/**
|
||||
* If enabled, the requester is charged for downloading the data from
|
||||
* Requester Pays Buckets.
|
||||
*/
|
||||
@JsonProperty
|
||||
private final boolean isRequesterPays;
|
||||
|
||||
/**
|
||||
* File where the downloaded data is written.
|
||||
*/
|
||||
@JsonProperty
|
||||
private final String file;
|
||||
|
||||
/**
|
||||
* The last part that has been successfully written into the downloaded file.
|
||||
*/
|
||||
@JsonProperty
|
||||
private final Integer lastFullyDownloadedPartNumber;
|
||||
|
||||
/**
|
||||
* Last Modified/created time on Amazon S3 for this object.
|
||||
*/
|
||||
@JsonProperty
|
||||
private final long lastModifiedTime;
|
||||
|
||||
|
||||
public PersistableDownload() {
|
||||
this(null, null, null, null, null, false, null, null, 0L);
|
||||
}
|
||||
|
||||
public PersistableDownload(
|
||||
@JsonProperty(value = "bucketName") String bucketName,
|
||||
@JsonProperty(value = "key") String key,
|
||||
@JsonProperty(value = "versionId") String versionId,
|
||||
@JsonProperty(value = "range") long[] range,
|
||||
@JsonProperty(value = "responseHeaders") ResponseHeaderOverrides responseHeaders,
|
||||
@JsonProperty(value = "isRequesterPays") boolean isRequesterPays,
|
||||
@JsonProperty(value = "file") String file,
|
||||
@JsonProperty(value = "lastFullyDownloadedPartNumber") Integer lastFullyDownloadedPartNumber,
|
||||
@JsonProperty(value = "lastModifiedTime") long lastModifiedTime) {
|
||||
this.bucketName = bucketName;
|
||||
this.key = key;
|
||||
this.versionId = versionId;
|
||||
this.range = range == null ? null : range.clone();
|
||||
this.responseHeaders = responseHeaders;
|
||||
this.isRequesterPays = isRequesterPays;
|
||||
this.file = file;
|
||||
this.lastFullyDownloadedPartNumber = lastFullyDownloadedPartNumber;
|
||||
this.lastModifiedTime = lastModifiedTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the bucket.
|
||||
*/
|
||||
String getBucketName() {
|
||||
return bucketName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the object.
|
||||
*/
|
||||
String getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the version id of the object.
|
||||
*/
|
||||
String getVersionId() {
|
||||
return versionId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the byte range of the object to download.
|
||||
*/
|
||||
long[] getRange() {
|
||||
return range == null ? null : range.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the optional response headers.
|
||||
*/
|
||||
ResponseHeaderOverrides getResponseHeaders() {
|
||||
return responseHeaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if RequesterPays is enabled on the Amazon S3 bucket else
|
||||
* false.
|
||||
*/
|
||||
boolean isRequesterPays() {
|
||||
return isRequesterPays;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the file where the object is to be downloaded.
|
||||
*/
|
||||
String getFile() {
|
||||
return file;
|
||||
}
|
||||
|
||||
String getPauseType() {
|
||||
return pauseType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last part number that was successfully written into the downloaded file.
|
||||
*/
|
||||
Integer getLastFullyDownloadedPartNumber() {
|
||||
return lastFullyDownloadedPartNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last modified/created time of the object represented by
|
||||
* the bucketName and key.
|
||||
*/
|
||||
Long getlastModifiedTime() {
|
||||
return lastModifiedTime;
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package org.talend.aws;
|
||||
|
||||
import com.amazonaws.event.ProgressEvent;
|
||||
import com.amazonaws.event.ProgressEventFilter;
|
||||
import com.amazonaws.event.ProgressEventType;
|
||||
|
||||
final class TransferCompletionFilter implements ProgressEventFilter {
|
||||
@Override
|
||||
public ProgressEvent filter(ProgressEvent progressEvent) {
|
||||
// Block COMPLETE events from the low-level GetObject operation,
|
||||
// but we still want to keep the BytesTransferred
|
||||
return progressEvent.getEventType() == ProgressEventType.TRANSFER_COMPLETED_EVENT
|
||||
? null // discard this event
|
||||
: progressEvent
|
||||
;
|
||||
}
|
||||
}
|
||||
@@ -1,233 +0,0 @@
|
||||
package org.talend.aws;
|
||||
|
||||
import com.amazonaws.AmazonClientException;
|
||||
import com.amazonaws.AmazonWebServiceRequest;
|
||||
import com.amazonaws.event.ProgressListenerChain;
|
||||
import com.amazonaws.services.s3.AmazonS3;
|
||||
import com.amazonaws.services.s3.internal.FileLocks;
|
||||
import com.amazonaws.services.s3.internal.RequestCopyUtils;
|
||||
import com.amazonaws.services.s3.internal.ServiceUtils;
|
||||
import com.amazonaws.services.s3.model.GetObjectMetadataRequest;
|
||||
import com.amazonaws.services.s3.model.GetObjectRequest;
|
||||
import com.amazonaws.services.s3.model.ObjectMetadata;
|
||||
import com.amazonaws.services.s3.transfer.TransferManagerConfiguration;
|
||||
import com.amazonaws.services.s3.transfer.TransferProgress;
|
||||
import com.amazonaws.services.s3.transfer.exception.FileLockException;
|
||||
import com.amazonaws.services.s3.transfer.internal.S3ProgressListener;
|
||||
import com.amazonaws.services.s3.transfer.internal.S3ProgressListenerChain;
|
||||
import com.amazonaws.services.s3.transfer.internal.TransferManagerUtils;
|
||||
import com.amazonaws.services.s3.transfer.internal.TransferStateChangeListener;
|
||||
import com.amazonaws.services.s3.transfer.internal.TransferProgressUpdatingListener;
|
||||
import com.amazonaws.util.VersionInfoUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Date;
|
||||
import java.util.concurrent.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class TransferManager {
|
||||
|
||||
private static final Log log = LogFactory.getLog(TransferManager.class);
|
||||
|
||||
private final AmazonS3 s3;
|
||||
private final ExecutorService executorService;
|
||||
private final TransferManagerConfiguration configuration;
|
||||
private final boolean shutDownThreadPools;
|
||||
|
||||
public TransferManager(AmazonS3 s3) {
|
||||
this.s3 = s3;
|
||||
this.executorService = TransferManagerUtils.createDefaultExecutorService();
|
||||
this.configuration = resolveConfiguration();
|
||||
this.shutDownThreadPools = true;
|
||||
}
|
||||
|
||||
private TransferManagerConfiguration resolveConfiguration() {
|
||||
TransferManagerConfiguration configuration = new TransferManagerConfiguration();
|
||||
configuration.setDisableParallelDownloads(false);
|
||||
return configuration;
|
||||
}
|
||||
|
||||
public Download download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener,
|
||||
long timeoutMillis, boolean resumeOnRetry) {
|
||||
return doDownload(getObjectRequest, file, null, progressListener, ServiceUtils.OVERWRITE_MODE, timeoutMillis, null, 0L,
|
||||
resumeOnRetry);
|
||||
}
|
||||
|
||||
private Download doDownload(final GetObjectRequest getObjectRequest,
|
||||
final File file, final TransferStateChangeListener stateListener,
|
||||
final S3ProgressListener s3progressListener,
|
||||
final boolean resumeExistingDownload,
|
||||
final long timeoutMillis,
|
||||
final Integer lastFullyDownloadedPart,
|
||||
final long lastModifiedTimeRecordedDuringPause,
|
||||
final boolean resumeOnRetry)
|
||||
{
|
||||
assertParameterNotNull(getObjectRequest,
|
||||
"A valid GetObjectRequest must be provided to initiate download");
|
||||
assertParameterNotNull(file,
|
||||
"A valid file must be provided to download into");
|
||||
|
||||
appendSingleObjectUserAgent(getObjectRequest);
|
||||
String description = "Downloading from " + getObjectRequest.getBucketName() + "/" + getObjectRequest.getKey();
|
||||
|
||||
TransferProgress transferProgress = new TransferProgress();
|
||||
// S3 progress listener to capture the persistable transfer when available
|
||||
S3ProgressListenerChain listenerChain = new S3ProgressListenerChain(
|
||||
// The listener for updating transfer progress
|
||||
new TransferProgressUpdatingListener(transferProgress),
|
||||
getObjectRequest.getGeneralProgressListener(),
|
||||
s3progressListener); // Listeners included in the original request
|
||||
// The listener chain used by the low-level GetObject request.
|
||||
// This listener chain ignores any COMPLETE event, so that we could
|
||||
// delay firing the signal until the high-level download fully finishes.
|
||||
getObjectRequest
|
||||
.setGeneralProgressListener(new ProgressListenerChain(new TransferCompletionFilter(), listenerChain));
|
||||
|
||||
GetObjectMetadataRequest getObjectMetadataRequest = RequestCopyUtils.createGetObjectMetadataRequestFrom(getObjectRequest);
|
||||
final ObjectMetadata objectMetadata = s3.getObjectMetadata(getObjectMetadataRequest);
|
||||
|
||||
// Used to check if the object is modified between pause and resume
|
||||
long lastModifiedTime = objectMetadata.getLastModified().getTime();
|
||||
|
||||
long startingByte = 0;
|
||||
long lastByte;
|
||||
|
||||
long[] range = getObjectRequest.getRange();
|
||||
if (range != null && range.length == 2) {
|
||||
startingByte = range[0];
|
||||
lastByte = range[1];
|
||||
} else {
|
||||
lastByte = objectMetadata.getContentLength() - 1;
|
||||
}
|
||||
|
||||
final long origStartingByte = startingByte;
|
||||
final boolean isDownloadParallel = !configuration.isDisableParallelDownloads()
|
||||
&& TransferManagerUtils.isDownloadParallelizable(s3, getObjectRequest, ServiceUtils.getPartCount(getObjectRequest, s3));
|
||||
|
||||
// We still pass the unfiltered listener chain into DownloadImpl
|
||||
final DownloadImpl download = new DownloadImpl(description, transferProgress, listenerChain, null,
|
||||
stateListener, getObjectRequest, file, objectMetadata, isDownloadParallel);
|
||||
|
||||
long totalBytesToDownload = lastByte - startingByte + 1;
|
||||
transferProgress.setTotalBytesToTransfer(totalBytesToDownload);
|
||||
|
||||
// Range information is needed for auto retry of downloads so a retry
|
||||
// request can start at the last downloaded location in the range.
|
||||
//
|
||||
// For obvious reasons, setting a Range header only makes sense if the
|
||||
// object actually has content because it's inclusive, otherwise S3
|
||||
// responds with 4xx
|
||||
//
|
||||
// In addition, we only set the range if the download was *NOT*
|
||||
// determined to be parallelizable above. One of the conditions for
|
||||
// parallel downloads is that getRange() returns null so preserve that.
|
||||
if (totalBytesToDownload > 0 && !isDownloadParallel) {
|
||||
getObjectRequest.withRange(startingByte, lastByte);
|
||||
}
|
||||
|
||||
long fileLength = -1;
|
||||
|
||||
if (resumeExistingDownload) {
|
||||
if (isS3ObjectModifiedSincePause(lastModifiedTime, lastModifiedTimeRecordedDuringPause)) {
|
||||
throw new AmazonClientException("The requested object in bucket " + getObjectRequest.getBucketName()
|
||||
+ " with key " + getObjectRequest.getKey() + " is modified on Amazon S3 since the last pause.");
|
||||
}
|
||||
// There's still a chance the object is modified while the request
|
||||
// is in flight. Set this header so S3 fails the request if this happens.
|
||||
getObjectRequest.setUnmodifiedSinceConstraint(new Date(lastModifiedTime));
|
||||
|
||||
if (!isDownloadParallel) {
|
||||
if (!FileLocks.lock(file)) {
|
||||
throw new FileLockException("Fail to lock " + file + " for resume download");
|
||||
}
|
||||
try {
|
||||
if (file.exists()) {
|
||||
fileLength = file.length();
|
||||
startingByte = startingByte + fileLength;
|
||||
getObjectRequest.setRange(startingByte, lastByte);
|
||||
transferProgress.updateProgress(Math.min(fileLength, totalBytesToDownload));
|
||||
totalBytesToDownload = lastByte - startingByte + 1;
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Resume download: totalBytesToDownload=" + totalBytesToDownload
|
||||
+ ", origStartingByte=" + origStartingByte + ", startingByte=" + startingByte
|
||||
+ ", lastByte=" + lastByte + ", numberOfBytesRead=" + fileLength + ", file: "
|
||||
+ file);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
FileLocks.unlock(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (totalBytesToDownload < 0) {
|
||||
throw new IllegalArgumentException(
|
||||
"Unable to determine the range for download operation.");
|
||||
}
|
||||
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
Future<?> future = executorService.submit(
|
||||
new DownloadCallable(s3, latch,
|
||||
getObjectRequest, resumeExistingDownload,
|
||||
download, file, origStartingByte, fileLength, timeoutMillis, timedThreadPool,
|
||||
executorService, lastFullyDownloadedPart, isDownloadParallel, resumeOnRetry));
|
||||
download.setMonitor(new DownloadMonitor(download, future));
|
||||
latch.countDown();
|
||||
return download;
|
||||
}
|
||||
|
||||
public void shutdownNow(boolean shutDownS3Client) {
|
||||
if (shutDownThreadPools) {
|
||||
executorService.shutdownNow();
|
||||
timedThreadPool.shutdownNow();
|
||||
}
|
||||
|
||||
if (shutDownS3Client) {
|
||||
s3.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
private void assertParameterNotNull(Object parameterValue, String errorMessage) {
|
||||
if (parameterValue == null) throw new IllegalArgumentException(errorMessage);
|
||||
}
|
||||
|
||||
public static <X extends AmazonWebServiceRequest> X appendSingleObjectUserAgent(X request) {
|
||||
request.getRequestClientOptions().appendUserAgent(USER_AGENT);
|
||||
return request;
|
||||
}
|
||||
|
||||
private static final String USER_AGENT = TransferManager.class.getName() + "/" + VersionInfoUtils.getVersion();
|
||||
|
||||
private boolean isS3ObjectModifiedSincePause(final long lastModifiedTimeRecordedDuringResume,
|
||||
long lastModifiedTimeRecordedDuringPause) {
|
||||
return lastModifiedTimeRecordedDuringResume != lastModifiedTimeRecordedDuringPause;
|
||||
}
|
||||
|
||||
private final ScheduledExecutorService timedThreadPool = new ScheduledThreadPoolExecutor(1, daemonThreadFactory);
|
||||
|
||||
private static final ThreadFactory daemonThreadFactory = new ThreadFactory() {
|
||||
final AtomicInteger threadCount = new AtomicInteger( 0 );
|
||||
public Thread newThread(Runnable r) {
|
||||
int threadNumber = threadCount.incrementAndGet();
|
||||
Thread thread = new Thread(r);
|
||||
thread.setDaemon(true);
|
||||
thread.setName("S3TransferManagerTimedThread-" + threadNumber);
|
||||
return thread;
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
protected void finalize() throws Throwable {
|
||||
shutdownThreadPools();
|
||||
}
|
||||
|
||||
private void shutdownThreadPools() {
|
||||
if (shutDownThreadPools) {
|
||||
executorService.shutdown();
|
||||
timedThreadPool.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -7,21 +7,21 @@
|
||||
<groupId>org.talend.libraries</groupId>
|
||||
<artifactId>talend-codegen-utils</artifactId>
|
||||
<!-- release for revert version of library -->
|
||||
<version>0.31.0</version>
|
||||
<version>0.28.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
<avro.version>1.8.0</avro.version>
|
||||
<components.version>0.30.0</components.version>
|
||||
<daikon.version>0.31.11</daikon.version>
|
||||
<components.version>0.25.0-SNAPSHOT</components.version>
|
||||
<daikon.version>0.26.0-SNAPSHOT</daikon.version>
|
||||
<hamcrest.version>1.3</hamcrest.version>
|
||||
<junit.version>4.12</junit.version>
|
||||
<java-formatter.plugin.version>0.1.0</java-formatter.plugin.version>
|
||||
<formatter.plugin.version>1.6.0-SNAPSHOT</formatter.plugin.version>
|
||||
<mockito.version>2.2.15</mockito.version>
|
||||
<jacoco.plugin.version>0.7.8</jacoco.plugin.version>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
<maven.compiler.source>1.7</maven.compiler.source>
|
||||
<maven.compiler.target>1.7</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
</properties>
|
||||
|
||||
@@ -24,10 +24,8 @@ import java.time.temporal.ChronoUnit;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import org.apache.avro.Schema;
|
||||
@@ -35,11 +33,9 @@ import org.apache.avro.Schema.Field;
|
||||
import org.apache.avro.SchemaBuilder;
|
||||
import org.apache.avro.generic.GenericData;
|
||||
import org.apache.avro.generic.IndexedRecord;
|
||||
import org.apache.avro.SchemaParseException;
|
||||
import org.talend.codegen.DiSchemaConstants;
|
||||
import org.talend.daikon.avro.AvroUtils;
|
||||
import org.talend.daikon.avro.LogicalTypeUtils;
|
||||
import org.talend.daikon.avro.NameUtil;
|
||||
import org.talend.daikon.avro.SchemaConstants;
|
||||
|
||||
/**
|
||||
@@ -137,7 +133,6 @@ public class IncomingSchemaEnforcer {
|
||||
}
|
||||
}
|
||||
|
||||
//TODO remove this method as no place use it now in javajet
|
||||
/**
|
||||
* Take all of the parameters from the dynamic metadata and adapt it to a field for the runtime Schema.
|
||||
*
|
||||
@@ -149,12 +144,6 @@ public class IncomingSchemaEnforcer {
|
||||
addDynamicField(name, type, null, format, description, isNullable);
|
||||
}
|
||||
|
||||
private Set<String> existNames;
|
||||
|
||||
private Map<String, String> unvalidName2ValidName;
|
||||
|
||||
private int index = 0;
|
||||
|
||||
/**
|
||||
* Recreates dynamic field from parameters retrieved from DI dynamic metadata
|
||||
*
|
||||
@@ -164,10 +153,9 @@ public class IncomingSchemaEnforcer {
|
||||
* @param fieldPattern dynamic field date format
|
||||
* @param description dynamic field description
|
||||
* @param isNullable defines whether dynamic field may contain <code>null</code> value
|
||||
* @param isKey defines whether dynamic field is key field
|
||||
*/
|
||||
public void addDynamicField(String name, String diType, String logicalType, String fieldPattern, String description,
|
||||
boolean isNullable, boolean isKey) {
|
||||
boolean isNullable) {
|
||||
if (!needsInitDynamicColumns())
|
||||
return;
|
||||
Schema fieldSchema = diToAvro(diType, logicalType);
|
||||
@@ -175,52 +163,14 @@ public class IncomingSchemaEnforcer {
|
||||
if (isNullable) {
|
||||
fieldSchema = SchemaBuilder.nullable().type(fieldSchema);
|
||||
}
|
||||
|
||||
Schema.Field field;
|
||||
try {
|
||||
field = new Schema.Field(name, fieldSchema, description, (Object) null);
|
||||
} catch (SchemaParseException e) {
|
||||
//if the name contains special char which can't pass avro name check like $ and #,
|
||||
//but uniode like Japanese which can pass too though that is not expected
|
||||
if (existNames == null) {
|
||||
existNames = new HashSet<>();
|
||||
unvalidName2ValidName = new HashMap<>();
|
||||
}
|
||||
|
||||
String validName = NameUtil.correct(name, index++, existNames);
|
||||
existNames.add(validName);
|
||||
unvalidName2ValidName.put(name, validName);
|
||||
|
||||
field = new Schema.Field(validName, fieldSchema, description, (Object) null);
|
||||
field.addProp(SchemaConstants.TALEND_COLUMN_DB_COLUMN_NAME, name);
|
||||
}
|
||||
|
||||
Schema.Field field = new Schema.Field(name, fieldSchema, description, (Object) null);
|
||||
// Set pattern for date type
|
||||
if ("id_Date".equals(diType) && fieldPattern != null) {
|
||||
field.addProp(SchemaConstants.TALEND_COLUMN_PATTERN, fieldPattern);
|
||||
}
|
||||
if (isKey) {
|
||||
field.addProp(SchemaConstants.TALEND_COLUMN_IS_KEY, "true");
|
||||
}
|
||||
dynamicFields.add(field);
|
||||
}
|
||||
|
||||
/**
|
||||
* Recreates dynamic field from parameters retrieved from DI dynamic metadata
|
||||
*
|
||||
* @param name dynamic field name
|
||||
* @param diType di column type
|
||||
* @param logicalType dynamic field logical type; could be null
|
||||
* @param fieldPattern dynamic field date format
|
||||
* @param description dynamic field description
|
||||
* @param isNullable defines whether dynamic field may contain <code>null</code> value
|
||||
*/
|
||||
@Deprecated
|
||||
public void addDynamicField(String name, String diType, String logicalType, String fieldPattern, String description,
|
||||
boolean isNullable) {
|
||||
addDynamicField(name, diType, logicalType, fieldPattern, description, isNullable, false);
|
||||
}
|
||||
|
||||
public void addIncomingNodeField(String name, String className) {
|
||||
String diType = "id_String";
|
||||
switch (className) {
|
||||
@@ -300,8 +250,6 @@ public class IncomingSchemaEnforcer {
|
||||
fieldSchema = AvroUtils._decimal();
|
||||
} else if ("id_Date".equals(diType)) {
|
||||
fieldSchema = AvroUtils._date();
|
||||
} else if ("id_byte[]".equals(diType)) {
|
||||
fieldSchema = AvroUtils._bytes();
|
||||
} else {
|
||||
throw new UnsupportedOperationException("Unrecognized type " + diType);
|
||||
}
|
||||
@@ -421,9 +369,6 @@ public class IncomingSchemaEnforcer {
|
||||
return designSchema;
|
||||
}
|
||||
|
||||
//here we do special process for dynamic input name, but in fact,
|
||||
//we have issue which support Japanese char or special char as label for basic talend column too,
|
||||
//so not only dynamic columns may have special name, but also basic may have, but here, we don't consider that, that's TODO
|
||||
/**
|
||||
* Converts DI data value to Avro format and put it into record by field name
|
||||
*
|
||||
@@ -431,16 +376,9 @@ public class IncomingSchemaEnforcer {
|
||||
* @param diValue data value
|
||||
*/
|
||||
public void put(String name, Object diValue) {
|
||||
if (unvalidName2ValidName != null) {
|
||||
String validName = unvalidName2ValidName.get(name);
|
||||
if (validName != null) {
|
||||
name = validName;
|
||||
}
|
||||
}
|
||||
put(columnToFieldIndex.get(name), diValue);
|
||||
}
|
||||
|
||||
//TODO make it private, no place to call it except current class?
|
||||
/**
|
||||
* Converts DI data value to Avro format and put it into record by field index
|
||||
*
|
||||
|
||||
@@ -52,8 +52,6 @@ public class IncomingSchemaEnforcerTest {
|
||||
*/
|
||||
private IndexedRecord componentRecord;
|
||||
|
||||
private IndexedRecord componentRecordWithSpecialName;
|
||||
|
||||
@Rule
|
||||
public ExpectedException thrown = ExpectedException.none();
|
||||
|
||||
@@ -74,29 +72,9 @@ public class IncomingSchemaEnforcerTest {
|
||||
componentRecord.put(3, true);
|
||||
componentRecord.put(4, "Main Street");
|
||||
componentRecord.put(5, "This is a record with six columns.");
|
||||
|
||||
Schema componentSchemaWithSpecialName = SchemaBuilder.builder().record("Record").fields() //
|
||||
.name("id").type().intType().noDefault() //
|
||||
.name("name").type().stringType().noDefault() //
|
||||
.name("age").type().intType().noDefault() //
|
||||
.name("性别").type().booleanType().noDefault() //why this don't store the origin name, as it can pass the avro name check, it's a avro bug
|
||||
.name("address_").prop(SchemaConstants.TALEND_COLUMN_DB_COLUMN_NAME, "address#").type().stringType().noDefault() //
|
||||
.name("comment_").prop(SchemaConstants.TALEND_COLUMN_DB_COLUMN_NAME, "comment$").type().stringType().noDefault() //
|
||||
.endRecord();
|
||||
componentRecordWithSpecialName = new GenericData.Record(componentSchemaWithSpecialName);
|
||||
componentRecordWithSpecialName.put(0, 1);
|
||||
componentRecordWithSpecialName.put(1, "User");
|
||||
componentRecordWithSpecialName.put(2, 100);
|
||||
componentRecordWithSpecialName.put(3, true);
|
||||
componentRecordWithSpecialName.put(4, "Main Street");
|
||||
componentRecordWithSpecialName.put(5, "This is a record with six columns.");
|
||||
}
|
||||
|
||||
private void checkEnforcerWithComponentRecordData(IncomingSchemaEnforcer enforcer) {
|
||||
checkEnforcerWithComponentRecordData(enforcer, false);
|
||||
}
|
||||
|
||||
private void checkEnforcerWithComponentRecordData(IncomingSchemaEnforcer enforcer, boolean specialName) {
|
||||
// The enforcer must be ready to receive values.
|
||||
assertThat(enforcer.needsInitDynamicColumns(), is(false));
|
||||
|
||||
@@ -110,25 +88,15 @@ public class IncomingSchemaEnforcerTest {
|
||||
IndexedRecord adapted = enforcer.createIndexedRecord();
|
||||
|
||||
// Ensure that the result is the same as the expected component record.
|
||||
if (specialName) {
|
||||
assertThat(adapted, is(componentRecordWithSpecialName));
|
||||
} else {
|
||||
assertThat(adapted, is(componentRecord));
|
||||
}
|
||||
assertThat(adapted, is(componentRecord));
|
||||
|
||||
// Ensure that we create a new instance when we give it another value.
|
||||
enforcer.put("id", 2);
|
||||
enforcer.put("name", "User2");
|
||||
enforcer.put("age", 200);
|
||||
if (specialName) {
|
||||
enforcer.put("性别", false);
|
||||
enforcer.put("address#", "2 Main Street");
|
||||
enforcer.put("comment$", "2 This is a record with six columns.");
|
||||
} else {
|
||||
enforcer.put("valid", false);
|
||||
enforcer.put("address", "2 Main Street");
|
||||
enforcer.put("comment", "2 This is a record with six columns.");
|
||||
}
|
||||
enforcer.put("valid", false);
|
||||
enforcer.put("address", "2 Main Street");
|
||||
enforcer.put("comment", "2 This is a record with six columns.");
|
||||
IndexedRecord adapted2 = enforcer.createIndexedRecord();
|
||||
|
||||
// It should have the same schema, but not be the same instance.
|
||||
@@ -424,39 +392,6 @@ public class IncomingSchemaEnforcerTest {
|
||||
checkEnforcerWithComponentRecordData(enforcer);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDynamicColumnWithSpecialName() {
|
||||
Schema designSchema = SchemaBuilder.builder().record("Record") //
|
||||
.prop(DiSchemaConstants.TALEND6_DYNAMIC_COLUMN_POSITION, "3") //
|
||||
.prop(SchemaConstants.INCLUDE_ALL_FIELDS, "true") //
|
||||
.fields() //
|
||||
.name("id").type().intType().noDefault() //
|
||||
.name("name").type().stringType().noDefault() //
|
||||
.name("age").type().intType().noDefault() //
|
||||
.endRecord();
|
||||
|
||||
IncomingSchemaEnforcer enforcer = new IncomingSchemaEnforcer(designSchema);
|
||||
|
||||
// The enforcer isn't usable yet.
|
||||
assertThat(enforcer.getDesignSchema(), is(designSchema));
|
||||
assertFalse(enforcer.areDynamicFieldsInitialized());
|
||||
assertThat(enforcer.getRuntimeSchema(), nullValue());
|
||||
|
||||
enforcer.addDynamicField("性别", "id_Boolean", null, null, null, false, false);
|
||||
enforcer.addDynamicField("address#", "id_String", null, null, null, false, false);
|
||||
enforcer.addDynamicField("comment$", "id_String", null, null, null, false, false);
|
||||
assertFalse(enforcer.areDynamicFieldsInitialized());
|
||||
enforcer.createRuntimeSchema();
|
||||
assertTrue(enforcer.areDynamicFieldsInitialized());
|
||||
|
||||
// Check the run-time schema was created.
|
||||
assertThat(enforcer.getDesignSchema(), is(designSchema));
|
||||
assertThat(enforcer.getRuntimeSchema(), not(nullValue()));
|
||||
|
||||
// Put values into the enforcer and get them as an IndexedRecord.
|
||||
checkEnforcerWithComponentRecordData(enforcer, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTypeConversion_toDate() {
|
||||
// The expected schema after enforcement.
|
||||
@@ -764,28 +699,6 @@ public class IncomingSchemaEnforcerTest {
|
||||
assertThat(record.get(1), is((Object) new Date(1234567891011L)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks key field setting
|
||||
*/
|
||||
@Test
|
||||
public void testAddDynamicFieldKey() {
|
||||
Schema expectedRuntimeSchema = SchemaBuilder.builder().record("Record").fields().name("id")
|
||||
.prop(SchemaConstants.TALEND_COLUMN_IS_KEY, "true").type().intType().noDefault().endRecord();
|
||||
|
||||
Schema designSchema = SchemaBuilder.builder().record("Record").prop(SchemaConstants.INCLUDE_ALL_FIELDS, "true")
|
||||
.prop(DiSchemaConstants.TALEND6_DYNAMIC_COLUMN_POSITION, "0").fields().endRecord();
|
||||
|
||||
IncomingSchemaEnforcer enforcer = new IncomingSchemaEnforcer(designSchema);
|
||||
|
||||
enforcer.addDynamicField("id", "id_Integer", null, null, null, false, true);
|
||||
|
||||
enforcer.createRuntimeSchema();
|
||||
assertTrue(enforcer.areDynamicFieldsInitialized());
|
||||
|
||||
Schema actualRuntimeSchema = enforcer.getRuntimeSchema();
|
||||
assertEquals(expectedRuntimeSchema, actualRuntimeSchema);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks {@link IncomingSchemaEnforcer#put()} converts string value to date according pattern specified in dynamic field
|
||||
* TODO (iv.gonchar): this is incorrect behavior, because avro record should not contain java.util.Date value. It should store
|
||||
|
||||
@@ -45,9 +45,9 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.reload4j</groupId>
|
||||
<artifactId>reload4j</artifactId>
|
||||
<version>1.2.19</version>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.17</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<groupId>org.talend</groupId>
|
||||
<artifactId>talend-httputil</artifactId>
|
||||
<name>talend-httputil</name>
|
||||
<version>1.0.6</version>
|
||||
<version>1.0.5</version>
|
||||
|
||||
<properties>
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
@@ -20,7 +20,7 @@
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>2.11.4</version>
|
||||
<version>2.10.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
|
||||
<groupId>org.talend.components.lib</groupId>
|
||||
<artifactId>job-audit</artifactId>
|
||||
<version>1.4</version>
|
||||
<version>1.2</version>
|
||||
|
||||
<properties>
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
<daikon.audit.version>1.16.1</daikon.audit.version>
|
||||
<daikon.audit.version>1.16.0</daikon.audit.version>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
@@ -69,13 +69,13 @@
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-api</artifactId>
|
||||
<version>2.17.1</version>
|
||||
<version>2.12.1</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-core</artifactId>
|
||||
<version>2.17.1</version>
|
||||
<version>2.12.1</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
@@ -97,4 +97,4 @@
|
||||
</pluginManagement>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
</project>
|
||||
@@ -24,11 +24,5 @@ public interface JobAuditLogger extends EventAuditLogger {
|
||||
|
||||
@AuditEvent(category = "flowexecution", message = "connection : {connection_name}, row : {rows}, cost : {duration}", level = LogLevel.INFO)
|
||||
void flowExecution(Context context);
|
||||
|
||||
@AuditEvent(category = "componentparameters", message = "Component {connector_id} parameters", level = LogLevel.INFO)
|
||||
void componentParameters(Context context);
|
||||
|
||||
@AuditEvent(category = "schema", message = "{connection_name} : {schema} from {source_id} to {target_id}", level = LogLevel.INFO)
|
||||
void schema(Context context);
|
||||
|
||||
}
|
||||
|
||||
@@ -15,11 +15,6 @@ public class JobContextBuilder {
|
||||
return new JobContextBuilder(ContextBuilder.create());
|
||||
}
|
||||
|
||||
public JobContextBuilder custom(String key, String value) {
|
||||
builder.with(key, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public JobContextBuilder jobName(String job_name) {
|
||||
builder.with("job_name", job_name);
|
||||
return this;
|
||||
@@ -166,14 +161,4 @@ public class JobContextBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
public JobContextBuilder connectorParameters(String connector_parameters) {
|
||||
builder.with("connector_parameters", connector_parameters);
|
||||
return this;
|
||||
}
|
||||
|
||||
public JobContextBuilder schema(String schema) {
|
||||
builder.with("schema", schema);
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,110 +1,72 @@
|
||||
<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>
|
||||
<groupId>org.talend.components</groupId>
|
||||
<artifactId>talend-mscrm</artifactId>
|
||||
<version>3.10.2-20220831</version>
|
||||
<packaging>jar</packaging>
|
||||
<description>A forked Talend-MSCRM library, developed to use in Studio 7.3.1 only. It's main intention is to contain CVE fixes.</description>
|
||||
|
||||
<name>talend-mscrm</name>
|
||||
|
||||
<licenses>
|
||||
<license>
|
||||
<name>Apache License, Version 2.0</name>
|
||||
<url>https://www.talendforge.org/modules/licenses/APACHE_v2.txt</url>
|
||||
<distribution>may be downloaded from the Maven repository</distribution>
|
||||
</license>
|
||||
</licenses>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
|
||||
<odata.version>4.7.1</odata.version>
|
||||
<slf4j.version>1.7.28</slf4j.version>
|
||||
<axis2.version>1.7.9</axis2.version>
|
||||
<httpclient.version>4.5.13</httpclient.version>
|
||||
<httpcore.version>4.4.13</httpcore.version>
|
||||
<junit.version>4.13.2</junit.version>
|
||||
<adal4j.version>1.6.5-20220701</adal4j.version>
|
||||
<jackson.version>2.13.2</jackson.version>
|
||||
<jackson-databind.version>2.13.2.2</jackson-databind.version>
|
||||
|
||||
<!-- plugin's versions -->
|
||||
<maven-jar-plugin.version>3.2.0</maven-jar-plugin.version>
|
||||
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>talend_nexus_deployment</id>
|
||||
<url>${talend.nexus.url}/nexus/content/repositories/TalendOpenSourceRelease/</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
</repository>
|
||||
</repositories>
|
||||
<distributionManagement>
|
||||
<snapshotRepository>
|
||||
<id>talend_nexus_deployment</id>
|
||||
<url>${talend.nexus.url}/nexus/content/repositories/TalendOpenSourceSnapshot/</url>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
</snapshotRepository>
|
||||
<repository>
|
||||
<id>talend_nexus_deployment</id>
|
||||
<url>${talend.nexus.url}/nexus/content/repositories/TalendOpenSourceRelease/</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
</repository>
|
||||
</distributionManagement>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.axis2</groupId>
|
||||
<artifactId>axis2-xmlbeans</artifactId>
|
||||
<version>${axis2.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.reload4j</groupId>
|
||||
<artifactId>reload4j</artifactId>
|
||||
<version>1.2.19</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
<version>${httpclient.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpcore</artifactId>
|
||||
<version>${httpcore.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.axis2</groupId>
|
||||
<artifactId>axis2-transport-http</artifactId>
|
||||
<version>${axis2.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>commons-httpclient</groupId>
|
||||
<artifactId>commons-httpclient</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
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>
|
||||
<groupId>org.talend.libraries</groupId>
|
||||
<artifactId>talend-mscrm</artifactId>
|
||||
<version>3.4-20191012</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>talend-mscrm</name>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<cxf.version>3.1.1</cxf.version>
|
||||
<odata.version>4.3.0</odata.version>
|
||||
<slf4j.version>1.7.12</slf4j.version>
|
||||
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
|
||||
</properties>
|
||||
|
||||
<distributionManagement>
|
||||
<snapshotRepository>
|
||||
<id>talend_nexus_deployment</id>
|
||||
<url>${talend.nexus.url}/nexus/content/repositories/TalendOpenSourceSnapshot/</url>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
</snapshotRepository>
|
||||
<repository>
|
||||
<id>talend_nexus_deployment</id>
|
||||
<url>${talend.nexus.url}/nexus/content/repositories/TalendOpenSourceRelease/</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
</repository>
|
||||
</distributionManagement>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.axis2</groupId>
|
||||
<artifactId>axis2-xmlbeans</artifactId>
|
||||
<version>1.7.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
<version>4.5.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpcore</artifactId>
|
||||
<version>4.4.9</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.axis2</groupId>
|
||||
<artifactId>axis2-transport-http</artifactId>
|
||||
<version>1.7.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.olingo</groupId>
|
||||
<artifactId>odata-client-core</artifactId>
|
||||
<version>${odata.version}</version>
|
||||
@@ -136,55 +98,53 @@
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>${slf4j.version}</version>
|
||||
<version>1.7.11</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>${junit.version}</version>
|
||||
<scope>test</scope>
|
||||
<version>4.12</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.microsoft.azure</groupId>
|
||||
<groupId>com.microsoft.azure</groupId>
|
||||
<artifactId>adal4j</artifactId>
|
||||
<version>${adal4j.version}</version>
|
||||
<version>1.1.1-20191012</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-core</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>${jackson-databind.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-annotations</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/java</directory>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
</dependencies>
|
||||
<build>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/java</directory>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>default-jar</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<outputDirectory>../../../org.talend.libraries.crm/lib</outputDirectory>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>${maven-compiler-plugin.version}</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</build>
|
||||
</project>
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
package org.talend.ms.crm;
|
||||
|
||||
import java.rmi.RemoteException;
|
||||
import java.util.Iterator;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.naming.AuthenticationException;
|
||||
import javax.naming.ServiceUnavailableException;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
|
||||
import org.apache.axiom.om.OMAbstractFactory;
|
||||
@@ -22,37 +19,33 @@ import org.apache.axis2.client.ServiceClient;
|
||||
import org.apache.axis2.context.ConfigurationContext;
|
||||
import org.apache.axis2.context.ConfigurationContextFactory;
|
||||
import org.apache.axis2.transport.http.HTTPConstants;
|
||||
import org.apache.axis2.transport.http.HTTPTransportConstants;
|
||||
import org.apache.axis2.transport.http.HttpTransportProperties;
|
||||
import org.apache.axis2.transport.http.HttpTransportProperties.ProxyProperties;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpStatus;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.apache.olingo.client.api.http.HttpClientException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.talend.ms.crm.odata.ClientConfiguration;
|
||||
import org.talend.ms.crm.odata.authentication.AuthStrategyFactory;
|
||||
import org.talend.ms.crm.odata.authentication.IAuthStrategy;
|
||||
import org.talend.ms.crm.sdk.Instance;
|
||||
import org.datacontract.schemas._2004._07.system_collections_generic.KeyValuePairOfEndpointTypestringztYlk6OT;
|
||||
import org.talend.ms.crm.sdk.OnlineAuthenticationPolicy;
|
||||
import org.talend.ms.crm.sdk.OrganizationServiceStubWrapper;
|
||||
import org.talend.ms.crm.sdk.RequestDateTimeData;
|
||||
import org.talend.ms.crm.sdk.SecurityData;
|
||||
import org.talend.ms.crm.sdk.WsdlTokenManager;
|
||||
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.MapperFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.microsoft.schemas.xrm._2011.contracts.DiscoveryServiceStub;
|
||||
import com.microsoft.schemas.xrm._2011.contracts.IDiscoveryService_Execute_DiscoveryServiceFaultFault_FaultMessage;
|
||||
import com.microsoft.schemas.xrm._2011.contracts.OrganizationServiceStub;
|
||||
import com.microsoft.schemas.xrm._2011.contracts.discovery.EndpointType;
|
||||
import com.microsoft.schemas.xrm._2011.contracts.discovery.ExecuteDocument;
|
||||
import com.microsoft.schemas.xrm._2011.contracts.discovery.ExecuteDocument.Execute;
|
||||
import com.microsoft.schemas.xrm._2011.contracts.discovery.ExecuteResponseDocument;
|
||||
import com.microsoft.schemas.xrm._2011.contracts.discovery.ExecuteResponseDocument.ExecuteResponse;
|
||||
import com.microsoft.schemas.xrm._2011.contracts.discovery.OrganizationDetail;
|
||||
import com.microsoft.schemas.xrm._2011.contracts.discovery.RetrieveOrganizationRequest;
|
||||
import com.microsoft.schemas.xrm._2011.contracts.discovery.RetrieveOrganizationResponse;
|
||||
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
@@ -72,14 +65,20 @@ public class MSCRMClient {
|
||||
static Logger logger = LoggerFactory.getLogger(MSCRMClient.class.getName());
|
||||
|
||||
/**
|
||||
* Unique Name of the organization
|
||||
* Microsoft account (e.g. youremail@live.com) or Microsoft Office 365 (Org ID e.g.
|
||||
* youremail@yourorg.onmicrosoft.com) User Name.
|
||||
*/
|
||||
private String orgName;
|
||||
|
||||
private String username;
|
||||
|
||||
/**
|
||||
* Microsoft account or Microsoft Office 365 (Org ID) Password.
|
||||
*/
|
||||
private String password;
|
||||
|
||||
/**
|
||||
* Unique Name of the organization
|
||||
*/
|
||||
private ClientConfiguration clientConfiguration;
|
||||
private String orgName;
|
||||
|
||||
/**
|
||||
* Suffix for the Flat WSDL
|
||||
@@ -88,84 +87,88 @@ public class MSCRMClient {
|
||||
|
||||
private OrganizationServiceStub serviceStub;
|
||||
|
||||
private String discoveryServiceURL = "https://globaldisco.crm.dynamics.com/api/discovery/v2.0/Instances";
|
||||
|
||||
/**
|
||||
* This sample application registration values are available for all online instances
|
||||
* This is suggested to use for development and prototyping purposes.For production use, you should create an AppId or ClientId that is specific
|
||||
* to your tenant in the Azure Management portal.
|
||||
*
|
||||
*/
|
||||
private static final String DEFAULT_CLIENT_ID = "51f81489-12ee-4a9e-aaae-a2591f45987d";
|
||||
|
||||
private IAuthStrategy authStrategy;
|
||||
private Integer timeout;
|
||||
|
||||
public MSCRMClient(ClientConfiguration clientConfiguration, String orgName, String discoveryServiceURL) throws AuthenticationException {
|
||||
this.clientConfiguration = clientConfiguration;
|
||||
this.orgName = orgName;
|
||||
this.discoveryServiceURL = discoveryServiceURL;
|
||||
init();
|
||||
private Boolean reuseHttpClient;
|
||||
|
||||
}
|
||||
|
||||
private void init() throws AuthenticationException {
|
||||
if (clientConfiguration != null && discoveryServiceURL != null && discoveryServiceURL.indexOf("/api/discovery/") > 0) {
|
||||
clientConfiguration.setResource(discoveryServiceURL.substring(0, discoveryServiceURL.indexOf("/api/discovery/")));
|
||||
}
|
||||
|
||||
if(clientConfiguration != null) {
|
||||
if (discoveryServiceURL != null && discoveryServiceURL.indexOf("/api/discovery/") > 0) {
|
||||
clientConfiguration.setResource(discoveryServiceURL.substring(0, discoveryServiceURL.indexOf("/api/discovery/")));
|
||||
}
|
||||
if (clientConfiguration.getClientId()==null || clientConfiguration.getClientId().isEmpty()) {
|
||||
clientConfiguration.setClientId(DEFAULT_CLIENT_ID);
|
||||
}
|
||||
}
|
||||
private int maxConnectionRetries = 5;
|
||||
|
||||
authStrategy = AuthStrategyFactory.createAuthStrategy(this.clientConfiguration);
|
||||
authStrategy.init();
|
||||
private int attemptsInterval = 1000;
|
||||
|
||||
public MSCRMClient(String username, String password, String orgName) {
|
||||
this.username = username;
|
||||
this.password = password;
|
||||
this.orgName = orgName;
|
||||
|
||||
}
|
||||
|
||||
public void setTimeout(Integer timeout) {
|
||||
this.timeout = timeout;
|
||||
}
|
||||
|
||||
public OrganizationServiceStub getOnlineConnection() throws Exception {
|
||||
return new OrganizationServiceStubWrapper(doGetOnlineConnection(), this, discoveryServiceURL,
|
||||
clientConfiguration.getMaxRetryTimes(), clientConfiguration.getIntervalTime());
|
||||
public void setReuseHttpClient(Boolean reuseHttpClient) {
|
||||
this.reuseHttpClient = reuseHttpClient;
|
||||
}
|
||||
|
||||
public void setMaxConnectionRetries(int maxConnectionRetries) {
|
||||
this.maxConnectionRetries = maxConnectionRetries;
|
||||
}
|
||||
|
||||
public void setAttemptsInterval(int attemptsInterval) {
|
||||
this.attemptsInterval = attemptsInterval;
|
||||
}
|
||||
|
||||
public OrganizationServiceStub getOnlineConnection(String discoveryServiceURL) throws Exception {
|
||||
return new OrganizationServiceStubWrapper(doGetOnlineConnection(discoveryServiceURL), this, discoveryServiceURL,
|
||||
maxConnectionRetries, attemptsInterval);
|
||||
}
|
||||
|
||||
/**
|
||||
* Organization information is stored in the Instance table of the Discovery Service. To see the kind of information contained in that table,
|
||||
* send an HTTP GET request to the service for one of your instances.
|
||||
* URL for the Discovery Service For North America Microsoft account, discovery service url is
|
||||
* https://dev.crm.dynamics.com/XRMServices/2011/Discovery.svc Microsoft office 365, discovery service url is
|
||||
* https://disco.crm.dynamics.com/XRMServices/2011/Discovery.svc To use appropriate discovery service url for other
|
||||
* environments refer http://technet.microsoft.com/en-us/library/gg309401.aspx
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
public OrganizationServiceStub doGetOnlineConnection() throws Exception {
|
||||
public OrganizationServiceStub doGetOnlineConnection(String discoveryServiceURL) throws Exception {
|
||||
|
||||
String serviceURL = discoveryServiceURL;
|
||||
if(!discoveryServiceURL.contains("(")) {
|
||||
serviceURL = discoveryServiceURL+"(UniqueName='"+orgName+"')";
|
||||
}
|
||||
|
||||
String orgUrl = getOrgURL( serviceURL);
|
||||
// The discovery service stub cannot be reused against the organization service
|
||||
// as the Issuer and AppliesTo may differ between the discovery and organization services.
|
||||
// Retrieve the authentication policy for the organization service.
|
||||
OnlineAuthenticationPolicy organizationPolicy = new OnlineAuthenticationPolicy(orgUrl + FlatWSDLSuffix);
|
||||
WsdlTokenManager orgTokenManager = new WsdlTokenManager();
|
||||
// Authenticate the user using the organization authentication policy.
|
||||
SecurityData securityData = orgTokenManager.authenticate(orgUrl, clientConfiguration.getUserName(), clientConfiguration.getPassword(),
|
||||
organizationPolicy.getAppliesTo(), organizationPolicy.getPolicy(), organizationPolicy.getIssuerUri());
|
||||
try {
|
||||
// Retrieve the authentication policy for the discovery service.
|
||||
OnlineAuthenticationPolicy discoveryPolicy = new OnlineAuthenticationPolicy(discoveryServiceURL + FlatWSDLSuffix);
|
||||
WsdlTokenManager discoeryTokenManager = new WsdlTokenManager();
|
||||
// Authenticate the user using the discovery authentication policy.
|
||||
SecurityData discoverySecurityData = discoeryTokenManager.authenticate(discoveryServiceURL, username, password,
|
||||
discoveryPolicy.getAppliesTo(), discoveryPolicy.getPolicy(), discoveryPolicy.getIssuerUri());
|
||||
// Retrieve discovery stub using organization URL with the security data.
|
||||
DiscoveryServiceStub discoveryServiceStub = createDiscoveryServiceStub(discoveryServiceURL, discoverySecurityData);
|
||||
// Retrieve organization service url using discovery stub.
|
||||
String orgUrl = discoverOrganizationUrl(discoveryServiceStub, orgName);
|
||||
// The discovery service stub cannot be reused against the organization service
|
||||
// as the Issuer and AppliesTo may differ between the discovery and organization services.
|
||||
// Retrieve the authentication policy for the organization service.
|
||||
OnlineAuthenticationPolicy organizationPolicy = new OnlineAuthenticationPolicy(orgUrl + FlatWSDLSuffix);
|
||||
WsdlTokenManager orgTokenManager = new WsdlTokenManager();
|
||||
// Authenticate the user using the organization authentication policy.
|
||||
SecurityData securityData = orgTokenManager.authenticate(orgUrl, username, password,
|
||||
organizationPolicy.getAppliesTo(), organizationPolicy.getPolicy(), organizationPolicy.getIssuerUri());
|
||||
|
||||
// Retrieve organization stub using organization URL with the security data.
|
||||
serviceStub = createOrganizationServiceStub(orgUrl, securityData);
|
||||
// Retrieve organization stub using organization URL with the security data.
|
||||
serviceStub = createOrganizationServiceStub(orgUrl, securityData);
|
||||
|
||||
Options options = serviceStub._getServiceClient().getOptions();
|
||||
|
||||
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.REUSE_HTTP_CLIENT, clientConfiguration.isReuseHttpClient());
|
||||
options.setTimeOutInMilliSeconds(Long.valueOf(clientConfiguration.getTimeout()));
|
||||
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.SO_TIMEOUT, clientConfiguration.getTimeout());
|
||||
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.CONNECTION_TIMEOUT, clientConfiguration.getTimeout());
|
||||
Options options = serviceStub._getServiceClient().getOptions();
|
||||
if (reuseHttpClient != null) {
|
||||
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.REUSE_HTTP_CLIENT, reuseHttpClient);
|
||||
}
|
||||
if (timeout != null) {
|
||||
options.setTimeOutInMilliSeconds(Long.valueOf(timeout));
|
||||
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.SO_TIMEOUT, timeout);
|
||||
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.CONNECTION_TIMEOUT, timeout);
|
||||
}
|
||||
|
||||
} catch (IDiscoveryService_Execute_DiscoveryServiceFaultFault_FaultMessage e) {
|
||||
throw new Exception(e.getFaultMessage().getDiscoveryServiceFault().getMessage());
|
||||
}
|
||||
return serviceStub;
|
||||
|
||||
}
|
||||
@@ -182,6 +185,18 @@ public class MSCRMClient {
|
||||
}
|
||||
}
|
||||
|
||||
private static DiscoveryServiceStub createDiscoveryServiceStub(String discoveryServiceURL, SecurityData securityData)
|
||||
throws RemoteException, XMLStreamException {
|
||||
try {
|
||||
DiscoveryServiceStub stub = new DiscoveryServiceStub(getConfigurationContext(), discoveryServiceURL);
|
||||
setServiceClientOptions(stub._getServiceClient(), securityData);
|
||||
return stub;
|
||||
} catch (RemoteException e) {
|
||||
logger.error(e.getMessage());
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private static void setServiceClientOptions(ServiceClient sc, SecurityData securityData) throws AxisFault, XMLStreamException {
|
||||
Options options = sc.getOptions();
|
||||
|
||||
@@ -291,6 +306,45 @@ public class MSCRMClient {
|
||||
return ctx;
|
||||
}
|
||||
|
||||
private static String discoverOrganizationUrl(DiscoveryServiceStub serviceStub, String organizationUniqueName)
|
||||
throws RemoteException, IDiscoveryService_Execute_DiscoveryServiceFaultFault_FaultMessage {
|
||||
try {
|
||||
RetrieveOrganizationRequest request = RetrieveOrganizationRequest.Factory.newInstance();
|
||||
|
||||
request.setUniqueName(organizationUniqueName);
|
||||
|
||||
Execute exe = Execute.Factory.newInstance();
|
||||
exe.setRequest(request);
|
||||
|
||||
ExecuteDocument exeDoc = ExecuteDocument.Factory.newInstance();
|
||||
exeDoc.setExecute(exe);
|
||||
|
||||
ExecuteResponseDocument executeRespDoc = serviceStub.execute(exeDoc);
|
||||
ExecuteResponse executeResp = executeRespDoc.getExecuteResponse();
|
||||
|
||||
RetrieveOrganizationResponse result = (RetrieveOrganizationResponse) executeResp.getExecuteResult();
|
||||
|
||||
OrganizationDetail orgDetail = result.getDetail();
|
||||
|
||||
KeyValuePairOfEndpointTypestringztYlk6OT[] keyValuePairs = orgDetail.getEndpoints()
|
||||
.getKeyValuePairOfEndpointTypestringztYlk6OTArray();
|
||||
|
||||
for (KeyValuePairOfEndpointTypestringztYlk6OT keyValuePair : keyValuePairs) {
|
||||
|
||||
if (keyValuePair.getKey() == EndpointType.ORGANIZATION_SERVICE) {
|
||||
return keyValuePair.getValue();
|
||||
}
|
||||
}
|
||||
} catch (RemoteException e) {
|
||||
logger.error(e.getMessage());
|
||||
throw e;
|
||||
} catch (IDiscoveryService_Execute_DiscoveryServiceFaultFault_FaultMessage e) {
|
||||
logger.error(e.getMessage());
|
||||
throw e;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static HttpTransportProperties.ProxyProperties getProxyProperties() {
|
||||
String proxyHost = null;
|
||||
String proxyPort = null;
|
||||
@@ -316,55 +370,5 @@ public class MSCRMClient {
|
||||
}
|
||||
return proxyProps;
|
||||
}
|
||||
|
||||
private String getOrgURL(String discoveryServiceURL) throws ServiceUnavailableException {
|
||||
try {
|
||||
HttpGet request = new HttpGet(discoveryServiceURL);
|
||||
|
||||
// https://docs.microsoft.com/en-us/powerapps/developer/data-platform/webapi/discover-url-organization-web-api#authentication
|
||||
authStrategy.configureRequest(request);
|
||||
|
||||
try (CloseableHttpClient httpClient = HttpClients.createDefault();
|
||||
CloseableHttpResponse response = httpClient.execute(request)) {
|
||||
|
||||
int statusCode = response.getStatusLine().getStatusCode();
|
||||
if(statusCode != HttpStatus.SC_NO_CONTENT && statusCode != HttpStatus.SC_CREATED && statusCode != HttpStatus.SC_OK) {
|
||||
String message = null;
|
||||
if (statusCode == HttpStatus.SC_NOT_FOUND ) {
|
||||
message = "The organization '"+orgName+"' does not exist.";
|
||||
} else {
|
||||
message = response.getStatusLine().getReasonPhrase();
|
||||
}
|
||||
throw new HttpClientException(message);
|
||||
}
|
||||
|
||||
HttpEntity entity = response.getEntity();
|
||||
String orgUrl = null;
|
||||
if (entity != null) {
|
||||
String result = EntityUtils.toString(entity);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
|
||||
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
JsonNode tree = mapper.readTree(result);
|
||||
Iterator<JsonNode> iter = tree.path("value").elements();
|
||||
while (iter.hasNext()){
|
||||
JsonNode node = iter.next();
|
||||
Instance instance = mapper.readValue(node.toString(), Instance.class);
|
||||
// Should only return one instance.
|
||||
if(orgName.equals(instance.getUniqueName())) {
|
||||
orgUrl = instance.getApiUrl() + "/XRMServices/2011/Organization.svc";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(orgUrl == null) {
|
||||
throw new HttpClientException("No organization available.");
|
||||
}
|
||||
return orgUrl;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new ServiceUnavailableException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
@@ -12,14 +12,12 @@
|
||||
// ============================================================================
|
||||
package org.talend.ms.crm.odata;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public final class ClientConfiguration {
|
||||
|
||||
/*
|
||||
* Implemented authentication strategies for OData/MS CRM.
|
||||
*/
|
||||
public static enum AuthStrategyEnum {NTLM, OAUTH, OAUTH_PREMISE};
|
||||
public static enum AuthStrategyEnum {NTLM, OAUTH};
|
||||
|
||||
/*
|
||||
* Kind of registered app on azure
|
||||
@@ -71,16 +69,6 @@ public final class ClientConfiguration {
|
||||
*/
|
||||
private String authoryEndpoint;
|
||||
|
||||
/*
|
||||
* The redirect URL
|
||||
*/
|
||||
private String redirectURL;
|
||||
|
||||
/*
|
||||
* The service API to retrieve the resource we ask for with oauth on-premise
|
||||
*/
|
||||
private String serviceAPI;
|
||||
|
||||
private int maxRetryTimes = 5;
|
||||
|
||||
/*
|
||||
@@ -99,14 +87,6 @@ public final class ClientConfiguration {
|
||||
private AppRegisteredType appRegisteredType = AppRegisteredType.NATIVE_APP;
|
||||
private WebAppPermission webAppPermission = WebAppPermission.DELEGATED;
|
||||
|
||||
/**
|
||||
* The oauth resource is deduced from the "Service root URL" if this value is null.
|
||||
*/
|
||||
private String forceResource;
|
||||
|
||||
private Map<String, String> headers;
|
||||
private boolean returnRepresentation = false;
|
||||
|
||||
|
||||
ClientConfiguration(AuthStrategyEnum authStrategy) {
|
||||
this.authStrategy = authStrategy;
|
||||
@@ -237,44 +217,4 @@ public final class ClientConfiguration {
|
||||
this.domain = domain;
|
||||
}
|
||||
|
||||
public String getRedirectURL() {
|
||||
return redirectURL;
|
||||
}
|
||||
|
||||
public void setRedirectURL(String redirectURL) {
|
||||
this.redirectURL = redirectURL;
|
||||
}
|
||||
|
||||
public String getServiceAPI() {
|
||||
return serviceAPI;
|
||||
}
|
||||
|
||||
public void setServiceAPI(String serviceAPI) {
|
||||
this.serviceAPI = serviceAPI;
|
||||
}
|
||||
|
||||
public String getForceResource() {
|
||||
return forceResource;
|
||||
}
|
||||
|
||||
public void setForceResource(String forceResource) {
|
||||
this.forceResource = forceResource;
|
||||
}
|
||||
|
||||
public void setCustomHeaders(Map<String, String> headers){
|
||||
this.headers = headers;
|
||||
}
|
||||
|
||||
public Map<String, String> getCustomHeaders(){
|
||||
return this.headers;
|
||||
}
|
||||
|
||||
public boolean isReturnRepresentation() {
|
||||
return returnRepresentation;
|
||||
}
|
||||
|
||||
public void setReturnRepresentation(boolean returnRepresentation) {
|
||||
this.returnRepresentation = returnRepresentation;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
@@ -16,13 +16,13 @@ import org.talend.ms.crm.odata.ClientConfiguration.AuthStrategyEnum;
|
||||
|
||||
/**
|
||||
* Generate the ClientConfiguration according to wanted authentication.
|
||||
* <p>
|
||||
*
|
||||
* Different authentications need different information.
|
||||
*/
|
||||
public class ClientConfigurationFactory {
|
||||
|
||||
public final static ClientConfiguration buildOAuthNativeClientConfiguration(String clientId, String userName, String password,
|
||||
String authoryEndpoint) {
|
||||
String authoryEndpoint) {
|
||||
ClientConfiguration clientConfiguration = new ClientConfiguration(AuthStrategyEnum.OAUTH);
|
||||
clientConfiguration.setAppRegisteredType(ClientConfiguration.AppRegisteredType.NATIVE_APP);
|
||||
clientConfiguration.setClientId(clientId);
|
||||
@@ -34,7 +34,7 @@ public class ClientConfigurationFactory {
|
||||
}
|
||||
|
||||
public final static ClientConfiguration buildOAuthWebClientConfiguration(String clientId, String clientSecret, String userName, String password,
|
||||
String authoryEndpoint, ClientConfiguration.WebAppPermission permission) {
|
||||
String authoryEndpoint, ClientConfiguration.WebAppPermission permission) {
|
||||
ClientConfiguration clientConfiguration = new ClientConfiguration(AuthStrategyEnum.OAUTH);
|
||||
clientConfiguration.setAppRegisteredType(ClientConfiguration.AppRegisteredType.WEB_APP);
|
||||
clientConfiguration.setWebAppPermission(permission);
|
||||
@@ -49,7 +49,7 @@ public class ClientConfigurationFactory {
|
||||
}
|
||||
|
||||
public final static ClientConfiguration buildNtlmClientConfiguration(String userName, String password, String workstation,
|
||||
String domain) {
|
||||
String domain) {
|
||||
ClientConfiguration clientConfiguration = new ClientConfiguration(AuthStrategyEnum.NTLM);
|
||||
clientConfiguration.setUserName(userName);
|
||||
clientConfiguration.setPassword(password);
|
||||
@@ -59,19 +59,4 @@ public class ClientConfigurationFactory {
|
||||
return clientConfiguration;
|
||||
}
|
||||
|
||||
public final static ClientConfiguration buildOAuthPremiseClientConfiguration(String userName, String password, String authoryEndpoint,
|
||||
String serviceAPI, String clientId, String clientSecret, String redirectUrl, String forcedResource) {
|
||||
ClientConfiguration clientConfiguration = new ClientConfiguration(AuthStrategyEnum.OAUTH_PREMISE);
|
||||
clientConfiguration.setUserName(userName);
|
||||
clientConfiguration.setPassword(password);
|
||||
clientConfiguration.setAuthoryEndpoint(authoryEndpoint);
|
||||
clientConfiguration.setClientId(clientId);
|
||||
clientConfiguration.setClientSecret(clientSecret);
|
||||
clientConfiguration.setRedirectURL(redirectUrl);
|
||||
clientConfiguration.setServiceAPI(serviceAPI);
|
||||
clientConfiguration.setForceResource(forcedResource);
|
||||
|
||||
return clientConfiguration;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
@@ -12,9 +12,21 @@
|
||||
// ============================================================================
|
||||
package org.talend.ms.crm.odata;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Proxy;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.naming.AuthenticationException;
|
||||
import javax.naming.ServiceUnavailableException;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.http.Header;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpHost;
|
||||
import org.apache.http.HttpResponse;
|
||||
@@ -32,7 +44,6 @@ import org.apache.http.params.HttpConnectionParams;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.apache.olingo.client.api.ODataClient;
|
||||
import org.apache.olingo.client.api.communication.ODataClientErrorException;
|
||||
import org.apache.olingo.client.api.communication.request.retrieve.EdmMetadataRequest;
|
||||
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntitySetIteratorRequest;
|
||||
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntitySetRequest;
|
||||
import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
|
||||
@@ -58,33 +69,16 @@ import org.talend.ms.crm.odata.httpclientfactory.DefaultHttpClientState;
|
||||
import org.talend.ms.crm.odata.httpclientfactory.IHttpClientFactoryObserver;
|
||||
import org.talend.ms.crm.odata.httpclientfactory.IHttpclientFactoryObservable;
|
||||
|
||||
import javax.naming.AuthenticationException;
|
||||
import javax.naming.ServiceUnavailableException;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Proxy;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Client for accessing Dynamics CRM Online using the Web API
|
||||
*
|
||||
*/
|
||||
public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
|
||||
private static final String NAMESPAVE = "Microsoft.Dynamics.CRM";
|
||||
private static final String LOOKUP_NAME_PREFIX = "_";
|
||||
private static final String LOOKUP_NAME_SUFFIX = "_value";
|
||||
private static final int LOOKUP_NAME_MINSIZE = LOOKUP_NAME_PREFIX.length() + LOOKUP_NAME_SUFFIX.length();
|
||||
private static final String LOOKUP_NAME_PREFIX = "_";
|
||||
private static final String LOOKUP_NAME_SUFFIX = "_value";
|
||||
private static final int LOOKUP_NAME_MINSIZE = LOOKUP_NAME_PREFIX.length()+LOOKUP_NAME_SUFFIX.length();
|
||||
|
||||
private ClientConfiguration clientConfiguration;
|
||||
|
||||
@@ -107,7 +101,7 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
|
||||
/**
|
||||
* A list which contains all navigation links to set to null.
|
||||
* <p>
|
||||
*
|
||||
* A distinct delete command must be sent to set a navigation property to null. It can't be done in the same
|
||||
* time that the entity update.
|
||||
*/
|
||||
@@ -158,26 +152,10 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
return odataClient;
|
||||
}
|
||||
|
||||
private void addCustomHeaders(ODataEntitySetRequest<ClientEntitySet> request) {
|
||||
if (this.clientConfiguration.getCustomHeaders() == null) {
|
||||
return;
|
||||
}
|
||||
this.clientConfiguration.getCustomHeaders().entrySet().stream().forEach(e -> request.addCustomHeader(e.getKey(), e.getValue()));
|
||||
}
|
||||
|
||||
private void addCustomHeader(HttpRequestBase request) {
|
||||
if (this.clientConfiguration.getCustomHeaders() != null) {
|
||||
this.clientConfiguration.getCustomHeaders().entrySet().stream().forEach(e -> request.addHeader(e.getKey(), e.getValue()));
|
||||
}
|
||||
|
||||
if (this.clientConfiguration.isReturnRepresentation()) {
|
||||
request.addHeader("Prefer", "return=representation");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create EntitySet Iterator request
|
||||
*
|
||||
* @param entirySet entirySet the EntitySet name which you want to retrieve records
|
||||
* @param queryOption
|
||||
* @return EntitySet iterator request
|
||||
*/
|
||||
@@ -186,7 +164,6 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
if (queryOption.getReturnEntityProperties() != null) {
|
||||
uriBuilder.select(queryOption.getReturnEntityProperties());
|
||||
}
|
||||
|
||||
if (queryOption.getTop() > 0) {
|
||||
uriBuilder.top(queryOption.getTop());
|
||||
}
|
||||
@@ -196,68 +173,21 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
if (!StringUtils.isEmpty(queryOption.getFilter())) {
|
||||
uriBuilder.filter(queryOption.getFilter());
|
||||
}
|
||||
final List<String> expands = queryOption.getExpands();
|
||||
if (expands.size() > 0) {
|
||||
String[] expandArray = new String[expands.size()];
|
||||
uriBuilder.expand(expands.toArray(expandArray));
|
||||
}
|
||||
|
||||
ODataEntitySetRequest<ClientEntitySet> request = odataClient.getRetrieveRequestFactory()
|
||||
.getEntitySetRequest(uriBuilder.build());
|
||||
|
||||
this.authStrategy.configureRequest(request);
|
||||
|
||||
if (expands.size() > 0) {
|
||||
// odata-metadata=full set by olingo generates issue when expand entities
|
||||
request.addCustomHeader("Accept", "application/json;odata-metadata=minimal");
|
||||
}
|
||||
|
||||
addCustomHeaders(request);
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
public EdmMetadataRequest createMetadataRetrieveRequest() {
|
||||
EdmMetadataRequest request = odataClient.getRetrieveRequestFactory()
|
||||
.getMetadataRequest(serviceRootURL);
|
||||
this.authStrategy.configureRequest(request);
|
||||
return request;
|
||||
}
|
||||
|
||||
public ODataEntitySetRequest<ClientEntitySet> createEntitySetRetrieveRequest() {
|
||||
URIBuilder uriBuilder = odataClient.newURIBuilder(serviceRootURL).appendEntitySetSegment("EntityDefinitions").select("EntitySetName,LogicalName");
|
||||
ODataEntitySetRequest<ClientEntitySet> entitySetRequest = odataClient.getRetrieveRequestFactory().getEntitySetRequest(uriBuilder.build());
|
||||
this.authStrategy.configureRequest(entitySetRequest);
|
||||
|
||||
addCustomHeaders(entitySetRequest);
|
||||
|
||||
return entitySetRequest;
|
||||
}
|
||||
|
||||
public ODataEntitySetRequest<ClientEntitySet> createEndpointsNamesRequest() {
|
||||
URIBuilder uriBuilder = odataClient.newURIBuilder(serviceRootURL);
|
||||
ODataEntitySetRequest<ClientEntitySet> entitySetRequest = odataClient.getRetrieveRequestFactory().getEntitySetRequest(uriBuilder.build());
|
||||
this.authStrategy.configureRequest(entitySetRequest);
|
||||
|
||||
addCustomHeaders(entitySetRequest);
|
||||
|
||||
return entitySetRequest;
|
||||
}
|
||||
|
||||
public ODataEntitySetRequest<ClientEntitySet> createRequest(URIBuilder uriBuilder) {
|
||||
ODataEntitySetRequest<ClientEntitySet> entitySetRequest = odataClient.getRetrieveRequestFactory().getEntitySetRequest(uriBuilder.build());
|
||||
this.authStrategy.configureRequest(entitySetRequest);
|
||||
|
||||
addCustomHeaders(entitySetRequest);
|
||||
|
||||
return entitySetRequest;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve records from EntitySet
|
||||
*
|
||||
* @param entitySet the EntitySet name which you want to retrieve records
|
||||
* @param queryOption
|
||||
* @return the entity set iterator object
|
||||
*
|
||||
* @throws ServiceUnavailableException
|
||||
*/
|
||||
public ClientEntitySet retrieveEntities(QueryOptionConfig queryOption) throws AuthenticationException {
|
||||
@@ -288,10 +218,12 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
/**
|
||||
* Create entity
|
||||
*
|
||||
* @param entitySet entitySet the EntitySet name which you want to create record
|
||||
* @param entity provided content for create
|
||||
*
|
||||
* @throws ServiceUnavailableException
|
||||
*/
|
||||
public CreateUpdateResult insertEntity(ClientEntity entity) throws ServiceUnavailableException {
|
||||
public HttpResponse insertEntity(ClientEntity entity) throws ServiceUnavailableException {
|
||||
URIBuilder insertURIBuilder = odataClient.newURIBuilder(serviceRootURL).appendEntitySetSegment(entitySet);
|
||||
HttpEntity httpEntity = convertToHttpEntity(entity);
|
||||
return createAndExecuteRequest(insertURIBuilder.build(), httpEntity, HttpMethod.POST);
|
||||
@@ -301,49 +233,27 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
* Update entity with provided content.
|
||||
* The PATCH method is used, so only given properties are updated.
|
||||
* Navigation link properties that must be set to null are updated by another DELETE calls.
|
||||
* Navigation link properties are saved during {@link #addEntityNavigationLink(ClientEntity, String, String, String, boolean, boolean)}
|
||||
* method call
|
||||
*
|
||||
* @param entity The payload containing properties to update
|
||||
* @param entity The payload containing properties to update
|
||||
* @param keySegment The id of the entity to update
|
||||
* @throws ServiceUnavailableException
|
||||
* @deprecated use {@link #updateEntity(ClientEntity, String, List)} instead with a list of navigation links list instead;
|
||||
*/
|
||||
@Deprecated
|
||||
public CreateUpdateResult updateEntity(ClientEntity entity, String keySegment) throws ServiceUnavailableException {
|
||||
CreateUpdateResult result = updateEntity(entity, keySegment, this.navigationLinksToNull);
|
||||
this.navigationLinksToNull.clear();
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update entity with provided content.
|
||||
* The PATCH method is used, so only given properties are updated.
|
||||
* Navigation link properties that must be set to null are updated by another DELETE calls.
|
||||
*
|
||||
* @param entity The payload containing properties to update
|
||||
* @param keySegment The id of the entity to update
|
||||
* @param navigationLinksToDelete list of navigation link names to delete
|
||||
* @throws ServiceUnavailableException
|
||||
*/
|
||||
public CreateUpdateResult updateEntity(ClientEntity entity, String keySegment, List<String> navigationLinksToDelete) throws ServiceUnavailableException {
|
||||
public HttpResponse updateEntity(ClientEntity entity, String keySegment) throws ServiceUnavailableException {
|
||||
URIBuilder updateURIBuilder = odataClient.newURIBuilder(serviceRootURL).appendEntitySetSegment(entitySet)
|
||||
.appendKeySegment(UUID.fromString(keySegment));
|
||||
HttpEntity httpEntity = convertToHttpEntity(entity);
|
||||
CreateUpdateResult result = createAndExecuteRequest(updateURIBuilder.build(), httpEntity, HttpMethod.PATCH);
|
||||
HttpResponse updateHttpResponse = createAndExecuteRequest(updateURIBuilder.build(), httpEntity, HttpMethod.PATCH);
|
||||
|
||||
// No need to test the updateHttpResponse code since it is returned only if it's a success.
|
||||
// The deletion of navigation links will be done only if the previous update doesn't throw an exception.
|
||||
this.deleteNavigationLinksToNull(keySegment, navigationLinksToDelete);
|
||||
this.deleteNavigationLinksToNull(keySegment);
|
||||
|
||||
return result;
|
||||
return updateHttpResponse;
|
||||
}
|
||||
|
||||
protected void deleteNavigationLinksToNull(String keySegment, List<String> navigationLinksToNull) throws ServiceUnavailableException {
|
||||
if (navigationLinksToNull == null || navigationLinksToNull.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
for (String navigationLinkName : navigationLinksToNull) {
|
||||
protected void deleteNavigationLinksToNull(String keySegment) throws ServiceUnavailableException {
|
||||
for(String navigationLinkName : this.navigationLinksToNull){
|
||||
this.deleteNavigationLink(navigationLinkName, keySegment);
|
||||
}
|
||||
}
|
||||
@@ -351,14 +261,16 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
/**
|
||||
* Deleted entity by key
|
||||
*
|
||||
* @param entitySet entitySet the EntitySet name which you want to delete records
|
||||
* @param keySegment Entity key segment
|
||||
*
|
||||
* @throws ServiceUnavailableException
|
||||
*/
|
||||
public HttpResponse deleteEntity(String keySegment) throws ServiceUnavailableException {
|
||||
URIBuilder deleteURIBuilder = odataClient.newURIBuilder(serviceRootURL).appendEntitySetSegment(entitySet)
|
||||
.appendKeySegment(UUID.fromString(keySegment));
|
||||
|
||||
return createAndExecuteRequest(deleteURIBuilder.build(), null, HttpMethod.DELETE).getResponse();
|
||||
return createAndExecuteRequest(deleteURIBuilder.build(), null, HttpMethod.DELETE);
|
||||
}
|
||||
|
||||
|
||||
@@ -367,17 +279,17 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
* Jira : TDI-39571
|
||||
*
|
||||
* @param navigationLinkName The navigation link name (not the _name_value generated lookup property)
|
||||
* @param keySegment The keysegment(id) of the main property
|
||||
* @param keySegment The keysegment(id) of the main property
|
||||
* @return The Http response.
|
||||
* @throws ServiceUnavailableException
|
||||
*/
|
||||
public HttpResponse deleteNavigationLink(String navigationLinkName, String keySegment) throws ServiceUnavailableException {
|
||||
URIBuilder deleteNavLinkURIBuilder = odataClient.newURIBuilder(serviceRootURL)
|
||||
.appendEntitySetSegment(entitySet)
|
||||
.appendKeySegment(UUID.fromString(keySegment))
|
||||
.appendNavigationSegment(navigationLinkName).appendRefSegment();
|
||||
.appendEntitySetSegment(entitySet)
|
||||
.appendKeySegment(UUID.fromString(keySegment))
|
||||
.appendNavigationSegment(navigationLinkName).appendRefSegment();
|
||||
|
||||
return createAndExecuteRequest(deleteNavLinkURIBuilder.build(), null, HttpMethod.DELETE).getResponse();
|
||||
return createAndExecuteRequest(deleteNavLinkURIBuilder.build(), null, HttpMethod.DELETE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -437,24 +349,24 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
*
|
||||
* @param entityType
|
||||
*/
|
||||
public void setEntityType(String entityType) {
|
||||
public void setEntityType(String entityType){
|
||||
this.entityType = entityType;
|
||||
}
|
||||
|
||||
public void addEntityNavigationLink(ClientEntity entity, String lookupEntitySet, String lookupName,
|
||||
String linkedEntityId, boolean emptyLookupIntoNull, boolean ignoreNull) {
|
||||
String linkedEntityId, boolean emptyLookupIntoNull, boolean ignoreNull) {
|
||||
|
||||
// To help the final user since lookup names '_name_value' are available in the schema
|
||||
// But it's the navigation link that can be updated.
|
||||
String navigationLinkName = this.extractNavigationLinkName(lookupName);
|
||||
|
||||
// If value is empty and emptyLookupIntoNull, then set the value to null to unlink the navigation (set to null)
|
||||
if (emptyLookupIntoNull && linkedEntityId != null && linkedEntityId.isEmpty()) {
|
||||
if(emptyLookupIntoNull && linkedEntityId != null && linkedEntityId.isEmpty()){
|
||||
linkedEntityId = null;
|
||||
}
|
||||
|
||||
// If ignore null is set and the value is null, then don't update/delete this navigation link
|
||||
if (ignoreNull && linkedEntityId == null) {
|
||||
if(ignoreNull && linkedEntityId == null){
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -465,50 +377,14 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
} catch (URISyntaxException e) {
|
||||
throw new HttpClientException(e);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else{
|
||||
// Retains all navigation links to delete (set to null)
|
||||
navigationLinksToNull.add(navigationLinkName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to add navigation link to entity.
|
||||
*
|
||||
* @param navigationLinkName extracted navigation link(see {@link #extractNavigationLinkName(String)})
|
||||
* @param entity to be updated
|
||||
* @param lookupEntitySet entity set referred by navigation link
|
||||
* @param linkedEntityId id of the referred entity
|
||||
* @param emptyLookupIntoNull if empty lookup values should be converted to null values
|
||||
* @param ignoreNull if null values should be skipped
|
||||
* @return true if the link was added or skipped, false if it should be deleted with a separate call.
|
||||
*/
|
||||
public boolean addOrSkipEntityNavigationLink(ClientEntity entity, String lookupEntitySet, String navigationLinkName,
|
||||
String linkedEntityId, boolean emptyLookupIntoNull, boolean ignoreNull) {
|
||||
// If value is empty and emptyLookupIntoNull, then set the value to null to unlink the navigation (set to null)
|
||||
if (emptyLookupIntoNull && linkedEntityId != null && linkedEntityId.isEmpty()) {
|
||||
linkedEntityId = null;
|
||||
}
|
||||
|
||||
// If ignore null is set and the value is null, then don't update/delete this navigation link
|
||||
if (ignoreNull && linkedEntityId == null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (linkedEntityId != null) {
|
||||
try {
|
||||
entity.getNavigationLinks().add(odataClient.getObjectFactory().newEntityNavigationLink(navigationLinkName,
|
||||
new URI(lookupEntitySet + "(" + linkedEntityId + ")")));
|
||||
} catch (URISyntaxException e) {
|
||||
throw new HttpClientException(e);
|
||||
}
|
||||
} else {
|
||||
// Retains all navigation links to delete (set to null)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public int getNbNavigationLinkToRemove() {
|
||||
public int getNbNavigationLinkToRemove(){
|
||||
return navigationLinksToNull.size();
|
||||
}
|
||||
|
||||
@@ -521,20 +397,20 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
* @param lookupName The auto-generated lookup name
|
||||
* @return The extracted navigation link name or the lookup name if it can't be extracted.
|
||||
*/
|
||||
public String extractNavigationLinkName(String lookupName) {
|
||||
public String extractNavigationLinkName(String lookupName){
|
||||
final int nameSize = lookupName.length();
|
||||
if (nameSize <= LOOKUP_NAME_MINSIZE) {
|
||||
if(nameSize <= LOOKUP_NAME_MINSIZE){
|
||||
return lookupName;
|
||||
}
|
||||
|
||||
String pref = lookupName.substring(0, LOOKUP_NAME_PREFIX.length());
|
||||
if (!pref.equals(LOOKUP_NAME_PREFIX)) {
|
||||
if(!pref.equals(LOOKUP_NAME_PREFIX)){
|
||||
return lookupName;
|
||||
}
|
||||
|
||||
final int endName = nameSize - LOOKUP_NAME_SUFFIX.length();
|
||||
String suff = lookupName.substring(endName, nameSize);
|
||||
if (!suff.equals(LOOKUP_NAME_SUFFIX)) {
|
||||
if(!suff.equals(LOOKUP_NAME_SUFFIX)){
|
||||
return lookupName;
|
||||
}
|
||||
|
||||
@@ -545,6 +421,7 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
* Convert OData entity to HttpEntity type
|
||||
*
|
||||
* @param entity OData entity.
|
||||
*
|
||||
* @return An entity that can be sent or received with an HTTP message.
|
||||
* @throws
|
||||
*/
|
||||
@@ -569,14 +446,15 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
/**
|
||||
* Created and executes a request
|
||||
*
|
||||
* @param uri the request URI
|
||||
* @param uri the request URI
|
||||
* @param httpEntity the entity to send.
|
||||
* @param method HTTP method
|
||||
* @param method HTTP method
|
||||
*
|
||||
* @return the response to the request.
|
||||
* @throws ServiceUnavailableException
|
||||
*/
|
||||
|
||||
protected CreateUpdateResult createAndExecuteRequest(URI uri, HttpEntity httpEntity, HttpMethod method)
|
||||
protected HttpResponse createAndExecuteRequest(URI uri, HttpEntity httpEntity, HttpMethod method)
|
||||
throws ServiceUnavailableException {
|
||||
|
||||
boolean hasRetried = false;
|
||||
@@ -598,31 +476,11 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
if (request instanceof HttpEntityEnclosingRequestBase) {
|
||||
((HttpEntityEnclosingRequestBase) request).setEntity(httpEntity);
|
||||
}
|
||||
|
||||
addCustomHeader(request);
|
||||
|
||||
CreateUpdateResult result = new CreateUpdateResult();
|
||||
HttpResponse response = httpClientState.getHttpClient().execute(request);
|
||||
result.setResponse(response);
|
||||
|
||||
if (isResponseSuccess(response.getStatusLine().getStatusCode())) {
|
||||
if (this.clientConfiguration.isReturnRepresentation()) {
|
||||
final HttpEntity entity = response.getEntity();
|
||||
if (entity != null && entity.isStreaming()) {
|
||||
try(InputStream instream = entity.getContent()) {
|
||||
String e = new BufferedReader(new InputStreamReader(instream))
|
||||
.lines().collect(Collectors.joining("\n"));
|
||||
result.setEntity(e);
|
||||
if (instream != null) {
|
||||
instream.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
EntityUtils.consume(response.getEntity());
|
||||
}
|
||||
request.releaseConnection();
|
||||
return result;
|
||||
EntityUtils.consume(response.getEntity());
|
||||
return response;
|
||||
} else {
|
||||
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED && !hasRetried) {
|
||||
this.authStrategy.refreshAuth();
|
||||
@@ -651,6 +509,7 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
* 201 create/update/delete entity success with return (not used in our component at present)
|
||||
*
|
||||
* @param statusCode HTTP status code
|
||||
*
|
||||
* @return success or not(true or false)
|
||||
*/
|
||||
public boolean isResponseSuccess(int statusCode) {
|
||||
@@ -683,30 +542,4 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
|
||||
}
|
||||
|
||||
public final static class CreateUpdateResult {
|
||||
|
||||
private HttpResponse response;
|
||||
private String entity;
|
||||
|
||||
public HttpResponse getResponse() {
|
||||
return response;
|
||||
}
|
||||
|
||||
public void setResponse(HttpResponse response) {
|
||||
this.response = response;
|
||||
}
|
||||
|
||||
public String getEntity() {
|
||||
return entity;
|
||||
}
|
||||
|
||||
public void setEntity(String entity) {
|
||||
this.entity = entity;
|
||||
}
|
||||
|
||||
public boolean hasEntity() {
|
||||
return this.entity != null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
package org.talend.ms.crm.odata;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class QueryExpandUtil {
|
||||
|
||||
public static List<String> getExpandConfig(List<String> fields, List<String> params) {
|
||||
if (fields == null || params == null || fields.size() != params.size()) {
|
||||
throw new IllegalArgumentException(
|
||||
"Please make sure list of expands fields and params are not null and their size are same.");
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(fields.size() <= 0){
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<String> expands = new ArrayList<>();
|
||||
for(int i=0; i< fields.size(); i++){
|
||||
String name = fields.get(i);
|
||||
if("".equals(name.trim())){
|
||||
continue;
|
||||
}
|
||||
|
||||
name = getSanitizedName(name);
|
||||
StringBuilder sb = new StringBuilder(name);
|
||||
final String param = params.get(i);
|
||||
if(!"".equals(param.trim())){
|
||||
sb.append('(');
|
||||
sb.append(param);
|
||||
sb.append(')');
|
||||
}
|
||||
expands.add(sb.toString());
|
||||
}
|
||||
|
||||
return expands;
|
||||
}
|
||||
|
||||
/**
|
||||
* expandable attrribute name are _entityid_value, should be transformed to entityid.
|
||||
* @param name
|
||||
* @return
|
||||
*/
|
||||
public static String getSanitizedName(final String name){
|
||||
String sanitized = ('_' == name.charAt(0)) ? name.substring(1) : name;
|
||||
sanitized = (sanitized.endsWith("_value")) ? sanitized.substring(0, sanitized.length() - 6): sanitized;
|
||||
|
||||
return sanitized;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
@@ -12,9 +12,6 @@
|
||||
// ============================================================================
|
||||
package org.talend.ms.crm.odata;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class QueryOptionConfig {
|
||||
|
||||
private int top = -1;
|
||||
@@ -27,9 +24,6 @@ public class QueryOptionConfig {
|
||||
|
||||
private String filter;
|
||||
|
||||
private List<String> expand = new ArrayList<>();
|
||||
|
||||
|
||||
public int getTop() {
|
||||
return top;
|
||||
}
|
||||
@@ -70,8 +64,4 @@ public class QueryOptionConfig {
|
||||
this.filter = filter;
|
||||
}
|
||||
|
||||
public void setExpands(List<String> expand) { this.expand = expand;}
|
||||
|
||||
public List<String> getExpands() { return this.expand; }
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
@@ -12,11 +12,13 @@
|
||||
// ============================================================================
|
||||
package org.talend.ms.crm.odata.authentication;
|
||||
|
||||
import javax.naming.AuthenticationException;
|
||||
|
||||
import org.talend.ms.crm.odata.ClientConfiguration;
|
||||
|
||||
/**
|
||||
* Factory for OData authentication strategies.
|
||||
* <p>
|
||||
*
|
||||
* No need to use singleton pattern since no implementation/extends, static is enough.
|
||||
*/
|
||||
public final class AuthStrategyFactory {
|
||||
@@ -24,18 +26,15 @@ public final class AuthStrategyFactory {
|
||||
private AuthStrategyFactory() {
|
||||
}
|
||||
|
||||
public static IAuthStrategy createAuthStrategy(ClientConfiguration conf) {
|
||||
public final static IAuthStrategy createAuthStrategy(ClientConfiguration conf) {
|
||||
IAuthStrategy authStrategy = null;
|
||||
switch (conf.getAuthStrategy()) {
|
||||
case OAUTH:
|
||||
authStrategy = new OAuthStrategyImpl(conf);
|
||||
break;
|
||||
case NTLM:
|
||||
authStrategy = new NTLMStrategyImpl(conf);
|
||||
break;
|
||||
case OAUTH_PREMISE:
|
||||
authStrategy = new OAuthPremiseStrategyImpl(conf);
|
||||
break;
|
||||
case OAUTH:
|
||||
authStrategy = new OAuthStrategyImpl(conf);
|
||||
break;
|
||||
case NTLM:
|
||||
authStrategy = new NTLMStrategyImpl(conf);
|
||||
break;
|
||||
}
|
||||
|
||||
return authStrategy;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
@@ -31,7 +31,7 @@ public interface IAuthStrategy {
|
||||
* Called when DynamicsCRMClient is instanciated.
|
||||
*
|
||||
*/
|
||||
void init() throws AuthenticationException;
|
||||
public void init() throws AuthenticationException;
|
||||
|
||||
/**
|
||||
* Retrieve the HttpClientFactory.
|
||||
@@ -41,21 +41,21 @@ public interface IAuthStrategy {
|
||||
* Called when DynamicsCRMClient is instanciated.
|
||||
*
|
||||
*/
|
||||
IHttpclientFactoryObservable getHttpClientFactory() throws AuthenticationException;
|
||||
public IHttpclientFactoryObservable getHttpClientFactory() throws AuthenticationException;
|
||||
|
||||
/**
|
||||
* Refresh Authentication if needed.
|
||||
*/
|
||||
void refreshAuth() throws AuthenticationException;
|
||||
public void refreshAuth() throws AuthenticationException;
|
||||
|
||||
/**
|
||||
* Configure request generated by odataClient.getRetrieveRequestFactory().
|
||||
*/
|
||||
void configureRequest(ODataRequest request);
|
||||
public void configureRequest(ODataRequest request);
|
||||
|
||||
/**
|
||||
* Configure request HttpRequestBase with POST/PATCH/DELETE method.
|
||||
*/
|
||||
void configureRequest(HttpRequestBase request);
|
||||
public void configureRequest(HttpRequestBase request);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
|
||||
@@ -1,208 +0,0 @@
|
||||
package org.talend.ms.crm.odata.authentication;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonIOException;
|
||||
import com.google.gson.JsonSyntaxException;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import org.apache.http.client.methods.HttpRequestBase;
|
||||
import org.apache.olingo.client.api.communication.request.ODataRequest;
|
||||
import org.apache.olingo.commons.api.http.HttpHeader;
|
||||
import org.talend.ms.crm.odata.ClientConfiguration;
|
||||
import org.talend.ms.crm.odata.authentication.httpclienthelper.HttpClient;
|
||||
import org.talend.ms.crm.odata.authentication.httpclienthelper.HttpResponse;
|
||||
import org.talend.ms.crm.odata.authentication.httpclienthelper.RequestHttpContext;
|
||||
import org.talend.ms.crm.odata.authentication.httpclienthelper.Token;
|
||||
import org.talend.ms.crm.odata.httpclientfactory.IHttpclientFactoryObservable;
|
||||
import org.talend.ms.crm.odata.httpclientfactory.OAuthHttpClientFactory;
|
||||
|
||||
import javax.naming.AuthenticationException;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class OAuthPremiseStrategyImpl implements IAuthStrategy {
|
||||
|
||||
private final static int MAX_REDIRECT_AUTH_CODE = 3;
|
||||
|
||||
private final ClientConfiguration conf;
|
||||
|
||||
private Token token;
|
||||
private OAuthHttpClientFactory httpClientFactory;
|
||||
|
||||
|
||||
OAuthPremiseStrategyImpl(ClientConfiguration conf) {
|
||||
this.conf = conf;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() throws AuthenticationException {
|
||||
oauthFlow();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IHttpclientFactoryObservable getHttpClientFactory() throws AuthenticationException {
|
||||
oauthFlow();
|
||||
|
||||
if (httpClientFactory == null) {
|
||||
httpClientFactory = new OAuthHttpClientFactory(this.conf);
|
||||
}
|
||||
|
||||
return httpClientFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void refreshAuth() throws AuthenticationException {
|
||||
oauthFlow();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureRequest(ODataRequest request) {
|
||||
request.addCustomHeader(HttpHeader.AUTHORIZATION, "Bearer " + token.getAccess_token());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureRequest(HttpRequestBase request) {
|
||||
request.addHeader(HttpHeader.AUTHORIZATION, "Bearer " + token.getAccess_token());
|
||||
}
|
||||
|
||||
private void oauthFlow() throws AuthenticationException {
|
||||
int retry = 0;
|
||||
|
||||
while (true) {
|
||||
retry++;
|
||||
try {
|
||||
|
||||
final Optional<String> code = retrieveAuthorizationCode();
|
||||
if (code.isPresent()) {
|
||||
final String sCode = code.get();
|
||||
final Optional<Token> token = retrieveToken(sCode);
|
||||
if (token.isPresent()) {
|
||||
this.token = token.get();
|
||||
break;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Can't retrieve oauth token, but no exception has been raised.");
|
||||
}
|
||||
} else {
|
||||
throw new IllegalArgumentException("Can't retrieve authorization code, but no exception has been raised.");
|
||||
}
|
||||
|
||||
} catch (IOException | InterruptedException | IllegalArgumentException e) {
|
||||
if (retry < conf.getMaxRetryTimes()) {
|
||||
try {
|
||||
Thread.sleep(conf.getIntervalTime());
|
||||
} catch (InterruptedException e1) {
|
||||
// ignore
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
throw new AuthenticationException("Can't retrieve ms crm oauth token after '" + retry + "' retries : " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Token json2Token(String json) throws JsonIOException, JsonSyntaxException {
|
||||
Gson gson = new Gson();
|
||||
JsonReader jsr = new JsonReader(new StringReader(json));
|
||||
return gson.fromJson(jsr, Token.class);
|
||||
}
|
||||
|
||||
private String getResource() throws MalformedURLException {
|
||||
if(conf.getForceResource() != null && !"".equals(conf.getForceResource().trim())){
|
||||
return conf.getForceResource();
|
||||
}
|
||||
|
||||
URL url = new URL(conf.getServiceAPI());
|
||||
final int port = url.getPort();
|
||||
StringBuilder sp = new StringBuilder();
|
||||
if (port > -1) {
|
||||
sp.append(":").append(port);
|
||||
}
|
||||
return url.getProtocol() + "://" + url.getHost() + sp.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* To compute token url, change last segment by token.
|
||||
* @return
|
||||
*/
|
||||
private String computeTokenUrl(String url){
|
||||
while(url.endsWith("/")) {
|
||||
url = url.substring(0, url.length() - 1);
|
||||
}
|
||||
String token = url.substring(0, url.lastIndexOf('/')) + "/token";
|
||||
return token;
|
||||
}
|
||||
|
||||
private Optional<Token> retrieveToken(String code) throws IOException, InterruptedException, IllegalArgumentException {
|
||||
Map<String, String> body = new HashMap<>();
|
||||
body.put("grant_type", "authorization_code");
|
||||
body.put("code", code);
|
||||
body.put("redirect_uri", conf.getRedirectURL());
|
||||
body.put("client_id", conf.getClientId());
|
||||
|
||||
if(conf.getClientSecret() != null && !"".equals(conf.getClientSecret().trim())){
|
||||
body.put("client_secret", conf.getClientSecret());
|
||||
}
|
||||
|
||||
RequestHttpContext queryContext = new RequestHttpContext("POST",
|
||||
computeTokenUrl(conf.getAuthoryEndpoint()),
|
||||
Collections.emptyMap(),
|
||||
new HashMap<>(),
|
||||
true,
|
||||
conf.getTimeout() * 1000,
|
||||
conf.getTimeout() * 1000);
|
||||
|
||||
queryContext.setBodyContent(body);
|
||||
|
||||
HttpClient client = new HttpClient(queryContext);
|
||||
|
||||
// Redirect are followed by the java http client
|
||||
final HttpResponse call = client.call(new AtomicInteger(-1), e -> true);
|
||||
|
||||
Token token = null;
|
||||
try {
|
||||
token = json2Token(call.getBody());
|
||||
}
|
||||
catch (JsonIOException | JsonSyntaxException e){
|
||||
throw new IllegalArgumentException("Can't parse retrieve ms crm oauth token : " + e.getMessage(), e);
|
||||
}
|
||||
return Optional.ofNullable(token);
|
||||
}
|
||||
|
||||
private Optional<String> retrieveAuthorizationCode() throws IOException, InterruptedException {
|
||||
Map<String, String> params = new HashMap();
|
||||
params.put("resource", getResource());
|
||||
params.put("response_type", "code");
|
||||
params.put("state", "");
|
||||
params.put("client_id", conf.getClientId());
|
||||
params.put("scope", "");
|
||||
params.put("redirect_uri", conf.getRedirectURL());
|
||||
|
||||
Map<String, String> form = new HashMap<>();
|
||||
form.put("UserName", conf.getUserName());
|
||||
form.put("Password", conf.getPassword());
|
||||
form.put("AuthMethod", "FormsAuthentication");
|
||||
|
||||
RequestHttpContext queryContext = new RequestHttpContext("POST",
|
||||
conf.getAuthoryEndpoint(),
|
||||
params,
|
||||
new HashMap<>(),
|
||||
false,
|
||||
conf.getTimeout() * 1000,
|
||||
conf.getTimeout() * 1000);
|
||||
|
||||
queryContext.setBodyContent(form);
|
||||
HttpClient client = new HttpClient(queryContext);
|
||||
|
||||
// We stop to follow redirect url once we have the code
|
||||
final HttpResponse call = client.call(new AtomicInteger(MAX_REDIRECT_AUTH_CODE), e -> !e.extractCode().isPresent());
|
||||
|
||||
return call.extractCode();
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
// ============================================================================
|
||||
//
|
||||
// Copyright (C) 2006-2022 Talend Inc. - www.talend.com
|
||||
// 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
|
||||
|
||||
@@ -1,127 +0,0 @@
|
||||
package org.talend.ms.crm.odata.authentication.httpclienthelper;
|
||||
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public final class HttpClient {
|
||||
|
||||
private final static int TEMPORARY_REDIRECT = 307;
|
||||
private final static int PERMANENT_REDIRECT = 308;
|
||||
|
||||
private final RequestHttpContext requestHttpContext;
|
||||
|
||||
public HttpClient(RequestHttpContext requestHttpContext) {
|
||||
this.requestHttpContext = requestHttpContext;
|
||||
}
|
||||
|
||||
public static String encodeValue(String value) throws UnsupportedEncodingException {
|
||||
return URLEncoder.encode(value, StandardCharsets.UTF_8.toString());
|
||||
}
|
||||
|
||||
public HttpResponse call(AtomicInteger atomicInteger, Function<HttpResponse, Boolean> acceptRedirect) throws IOException, InterruptedException {
|
||||
final HttpURLConnection conn = buildUrl(requestHttpContext);
|
||||
|
||||
if ("POST".equals(conn.getRequestMethod())) {
|
||||
conn.setDoOutput(true);
|
||||
try (DataOutputStream dos = new DataOutputStream(conn.getOutputStream())) {
|
||||
final byte[] form = requestHttpContext.getBodyContent().getBytes(StandardCharsets.UTF_8);
|
||||
dos.write(form);
|
||||
dos.flush();
|
||||
}
|
||||
} else {
|
||||
conn.connect();
|
||||
}
|
||||
|
||||
final HttpResponse respContext = HttpResponse.fromHttpUrlConnection(conn);
|
||||
return followRedirect(requestHttpContext, respContext, atomicInteger, acceptRedirect);
|
||||
}
|
||||
|
||||
private HttpResponse followRedirect(RequestHttpContext queryContext, HttpResponse response, AtomicInteger nbRedirect, Function<HttpResponse, Boolean> acceptRedirect) throws IOException, InterruptedException {
|
||||
final int nbR = nbRedirect.decrementAndGet();
|
||||
final int status = response.getStatus();
|
||||
|
||||
boolean redirect = false;
|
||||
if (status != HttpURLConnection.HTTP_OK && ((status == HttpURLConnection.HTTP_MOVED_TEMP
|
||||
|| status == HttpURLConnection.HTTP_MOVED_PERM || status == HttpURLConnection.HTTP_SEE_OTHER
|
||||
|| status == TEMPORARY_REDIRECT || status == PERMANENT_REDIRECT))) {
|
||||
redirect = true;
|
||||
}
|
||||
|
||||
final Optional<String> location = response.getFirstValueHeader("location");
|
||||
|
||||
if (!redirect || !location.isPresent() || nbR <= 0) {
|
||||
return response;
|
||||
}
|
||||
|
||||
queryContext.setBase(location.get());
|
||||
queryContext.setParams(Collections.emptyMap());
|
||||
|
||||
final List<String> cookie = response.getAllValuesHeader("Set-Cookie").orElse(Collections.emptyList());
|
||||
if (cookie.size() > 0) {
|
||||
final String collect = String.join("; ", cookie); //cookie.stream().collect(Collectors.joining("; "));
|
||||
queryContext.getHeaders().put("Cookie", collect);
|
||||
}
|
||||
|
||||
Boolean continueRedirect = acceptRedirect.apply(response);
|
||||
if (!continueRedirect) {
|
||||
return response;
|
||||
}
|
||||
|
||||
HttpClient manager = new HttpClient(queryContext);
|
||||
final HttpResponse redirectResponseContext = manager.call(nbRedirect, acceptRedirect);
|
||||
|
||||
|
||||
return redirectResponseContext;
|
||||
}
|
||||
|
||||
private HttpURLConnection buildUrl(RequestHttpContext context) throws IOException {
|
||||
StringBuilder sb = new StringBuilder(context.getBase());
|
||||
|
||||
if (context.getParams().size() > 0) {
|
||||
sb.append("?");
|
||||
|
||||
boolean first = true;
|
||||
for (Map.Entry<String, String> e : context.getParams().entrySet()) {
|
||||
if (!first) {
|
||||
sb.append("&");
|
||||
}
|
||||
first = false;
|
||||
sb.append(e.getKey());
|
||||
sb.append("=");
|
||||
sb.append(encodeValue(e.getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
URL url = new URL(sb.toString());
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
|
||||
if (context.getHeaders().size() > 0) {
|
||||
for (Map.Entry<String, String> e : context.getHeaders().entrySet()) {
|
||||
conn.setRequestProperty(e.getKey(), e.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
conn.setRequestMethod(context.getMethod());
|
||||
conn.setInstanceFollowRedirects(context.isFollowRedirects());
|
||||
conn.setConnectTimeout(context.getConnectionTimeout());
|
||||
conn.setReadTimeout(context.getReadTimeout());
|
||||
|
||||
return conn;
|
||||
}
|
||||
|
||||
public RequestHttpContext getRequestHttpContext() {
|
||||
return requestHttpContext;
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user