Compare commits
1 Commits
patch/7.3.
...
feature/ma
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
29f192d71d |
@@ -1,63 +0,0 @@
|
||||
---
|
||||
version: 7.3.1
|
||||
module: https://talend.poolparty.biz/coretaxonomy/42
|
||||
product:
|
||||
- https://talend.poolparty.biz/coretaxonomy/183
|
||||
---
|
||||
|
||||
# TPS-4855
|
||||
|
||||
| Info | Value |
|
||||
| ---------------- | ---------------- |
|
||||
| Patch Name | Patch\_20210622\_TPS-4855\_v1-7.3.1 |
|
||||
| Release date | 2021-06-22 |
|
||||
| Target version | 20200219\_1130-7.3.1 |
|
||||
| Product affected | Talend Studio |
|
||||
|
||||
## Introduction
|
||||
This is a self-contained patch.
|
||||
|
||||
|
||||
**NOTE**: For information on how to obtain this patch, reach out to your Support contact at Talend.
|
||||
|
||||
## Fixed issues
|
||||
|
||||
This patch contains the following fixes:
|
||||
|
||||
- [7.3.1] FCB 'EnableRegionalDisco' is disabled error when using tMicrosoftCrmInput (TDI-46297)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Consider the following requirements for your system:
|
||||
|
||||
- Talend Studio 7.3.1 must be installed.
|
||||
|
||||
- This patch is depend on monthly patch **R2020-12**.
|
||||
|
||||
## Installation
|
||||
|
||||
**NOTE**: If the patch is deployed in the approach Installing the patch using Talend Studio, the folder configuration under this patch must be replaced manually.
|
||||
|
||||
### Installing the patch using Software update
|
||||
|
||||
1) Logon TAC and switch to Configuration->Software Update, then enter the correct values and save referring to the documentation: https://help.talend.com/reader/f7Em9WV_cPm2RRywucSN0Q/j9x5iXV~vyxMlUafnDejaQ
|
||||
|
||||
2) Switch to Software update page, where the new patch will be listed. The patch can be downloaded from here into the nexus repository.
|
||||
|
||||
3) On Studio Side: Logon Studio with remote mode, on the logon page the Update button is displayed: click this button to install the patch.
|
||||
|
||||
### Installing the patch using Talend Studio
|
||||
|
||||
1) Create a folder named "patches" under your studio installer directory and copy the patch .zip file to this folder.
|
||||
|
||||
2) Restart your studio: a window pops up, then click OK to install the patch, or restart the commandline and the patch will be installed automatically.
|
||||
|
||||
### Installing the patch using Commandline
|
||||
|
||||
Execute the following commands:
|
||||
|
||||
1. Talend-Studio-win-x86_64.exe -nosplash -application org.talend.commandline.CommandLine -consoleLog -data commandline-workspace startServer -p 8002 --talendDebug
|
||||
2. initRemote {tac_url} -ul {TAC login username} -up {TAC login password}
|
||||
3. checkAndUpdate -tu {TAC login username} -tup {TAC login password}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ BusinessAbstractParser.StringIntegerConvertError=String value cannot be converte
|
||||
BusinessPaletteFactory.CreateGear=Create new Gear
|
||||
SimpleBusinessCreationWizardPage.Title=New Business Model
|
||||
BusinessNewDiagramFileWizard.CreateNewDiagram=Create new diagram based on {0} model content
|
||||
BusinessAbstractParser.UnknownLiteral=Unknown literal:
|
||||
BusinessAbstractParser.UnknownLiteral=Unknown literal:
|
||||
BusinessAbstractParser.StringLongConverError=String value cannot be converted to Long value
|
||||
AssignmentPropertySection.DeleteAssignment=Delete Assignment
|
||||
AssignmentPropertySection.Type=Type
|
||||
@@ -20,7 +20,7 @@ AssignmentPropertySection.Name=Name
|
||||
CreateAssignmentCommand.CannotAssign=Cannot Assign.
|
||||
BusinessNewDiagramFileWizard.DiagramRootElement=Diagram root element
|
||||
BusinessNewDiagramFileWizard.NoDiagramRootElementSelectedError=No diagram root element selected
|
||||
BusinessVisualIDRegistry.ParseError=Unable to parse view type as a visualID number:
|
||||
BusinessVisualIDRegistry.ParseError=Unable to parse view type as a visualID number:
|
||||
OpenDiagramAction.EditBusinessModel=Edit Business Model
|
||||
BusinessAbstractParser.ValueOfTypeByteIsExpected=Value of type Byte is expected
|
||||
BusinessAbstractParser.ValueOfTypeCharacterIsExpected=Value of type Character is expected
|
||||
@@ -35,11 +35,11 @@ BusinessPaletteFactory.DatabaseComment=Create new Database
|
||||
AssignmentPropertySection.Comment=Comment
|
||||
SimpleBusinessCreationWizard.NewBusinessModel=New Business Model
|
||||
BusinessNewDiagramFileWizard.InvalidDiagramRootElementSelected=Invalid diagram root element was selected
|
||||
BusinessInitDiagramFileAction.IntialNew=Initialize new
|
||||
BusinessInitDiagramFileAction.IntialNew=Initialize new
|
||||
FindAssignmentAction.FindAssignments=Find Assignments
|
||||
RepositoryFactoryProxyLabelProvider.NotFound= (Not Found)
|
||||
BusinessPaletteFactory.Terminal=Terminal
|
||||
BusinessAbstractParser.InvalidInputAt=Invalid input at
|
||||
BusinessAbstractParser.InvalidInputAt=Invalid input at
|
||||
BusinessPaletteFactory.Gear=Gear
|
||||
BusinessPaletteFactory.InputComment=Create new Input
|
||||
BusinessPaletteFactory.Data=Data
|
||||
@@ -54,7 +54,7 @@ BusinessModelingAssistantProvider.SelectDomainModelElement=Select domain model e
|
||||
BusinessPaletteFactory.CreateActor=Create new Actor
|
||||
BusinessAbstractParser.StringDoubleConvertError=String value cannot be converted to Double value
|
||||
BusinessPaletteFactory.Actor=Actor
|
||||
EditAction.Edit=Edit
|
||||
EditAction.Edit=Edit
|
||||
BusinessCreationWizardPage.CreateBusinessDiagram=Create a Business diagram
|
||||
BusinessPaletteFactory.Database=Datasource
|
||||
BusinessPaletteFactory.ListComment=Create new List
|
||||
@@ -66,7 +66,7 @@ BusinessInitDiagramFileAction.LoadFaild=Model file loading failed
|
||||
BusinessPaletteFactory.DecisionComment=Create new Decision
|
||||
BusinessAbstractParser.ValueOfDoubleIsExpected=Value of type Double is expected
|
||||
OpenDiagramAction.ReadBusinessModel=Read Business Model
|
||||
BusinessInitDiagramFileAction.UnableToLoadResource=Unable to load resource:
|
||||
BusinessInitDiagramFileAction.UnableToLoadResource=Unable to load resource:
|
||||
BusinessPaletteFactory.CreateEllipse=Create new Ellipse
|
||||
BusinessNewDiagramFileWizard.DiagramFile=Diagram file
|
||||
BusinessAbstractParser.StringShortConverError=String value cannot be converted to Short value
|
||||
|
||||
@@ -2,7 +2,7 @@ JavaRoutineSynchronizer.UnsupportedOperation.Exception1=method not implemented:
|
||||
CodeGeneratorEmittersPoolFactory.JETEmitters.NoPresent=JETEmitters Project not present, full reinitialize is needed
|
||||
generatedcode.footerprocess.nbcharsgenerated={0} characters generated by {1}
|
||||
CodeGeneratorEmittersPoolFactory.Class.NotFound=Template still present, but class {0} has disapeared from workspace. This unit needs to be recompiled.
|
||||
CodeGeneratorEmittersPoolFactory.PersitentData.Error=Persitent data cannot be saved :
|
||||
CodeGeneratorEmittersPoolFactory.PersitentData.Error=Persitent data cannot be saved :
|
||||
generatedcode.copyright.title=Copyright (c) 2005-2011, Talend Inc.
|
||||
CodeGeneratorEmittersPoolFactory.initMessage=Generation Engine Initialization in progress...
|
||||
generatedcode.copyright.body5=(http://www.gnu.org/licenses/lgpl.html).
|
||||
@@ -35,7 +35,7 @@ CodeGenInit.removeLink=Remove linked resources
|
||||
CodeGenInit.saveWorkspace=Saving workspace
|
||||
DocumentRootImpl.mixed=\ (mixed:
|
||||
NodesSubTree.enableParallel=__ENABLE_PARALLEL__
|
||||
PoolTypeImpl.persistentPool=\ (persistentPool:
|
||||
PoolTypeImpl.persistentPool= \ (persistentPool:
|
||||
TalendJetEmitter.compileFail=\ compile fail : {0} : {1}
|
||||
TalendJetEmitter.exception=Exception on
|
||||
JetFilesProviderManager.unableLoad=Unable to load {0}JetFilesProviderManager.unableLoad
|
||||
@@ -84,7 +84,7 @@ FAMILY.eXist=eXist
|
||||
FAMILY.FTP=FTP
|
||||
FAMILY.Fields=Fields
|
||||
FAMILY.File=File
|
||||
FAMILY.FireBird=Firebird
|
||||
FAMILY.FireBird=FireBird
|
||||
FAMILY.Greenplum=Greenplum
|
||||
FAMILY.HSQLDb=HSQLDb
|
||||
FAMILY.Healthcare=Healthcare
|
||||
|
||||
@@ -139,3 +139,7 @@ ComponentsPreferencePage_SuccessMessage1=Red\u00E9marrez le Studio pour charger
|
||||
ComponentsPreferencePage_SuccessMessage2=Red\u00E9marrer maintenant ?
|
||||
ComponentsPreferencePage.installComponentsFailure=\u00C9chec de l'installation des composants
|
||||
ComponentsFactory.init.waitForFinish.timeout=Impossible d\'initialiser ComponentsFactory, veuillez r\u00E9essayer.
|
||||
ComponentsPreferencePage.enableOnLineHelp=Activer l\'aide en ligne pour les composants
|
||||
ComponentsPreferencePage.titleInstallHelp=Installer la fonctionnalit\u00E9 d\'aide hors ligne\u00A0?
|
||||
ComponentsPreferencePage.msgInstallHelp=Cela va ouvrir une bo\u00EEte de dialogue de packages suppl\u00E9mentaires pour installer la fonctionnalit\u00E9 d\'aide hors ligne, continuer ?
|
||||
ComponentsPreferencePage.grpHelp=Aide
|
||||
|
||||
@@ -39,3 +39,4 @@ metadataofTalendType=Metadata of TalendType
|
||||
palettesettings=Palette Settings
|
||||
standard.job.standalone=Standalone
|
||||
standard.job.osgi=OSGi Bundle
|
||||
runtimeLineage=Runtime lineage
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
FileController.decoration.description=Content taken from the repository
|
||||
AdvancedContextComposite.Name=Name
|
||||
EParameterName.tableMeter=Meter Table
|
||||
EParameterName.password=Password
|
||||
EParameterName.password=Password
|
||||
DesignerPreferencePage.display.useRepositoryName=Use the Repository name as label for the components dragged and dropped from the Repository Metadata.
|
||||
UpdateDetectionDialog.Expand=Expand All
|
||||
EParameterName.CurrentOS=Current OS
|
||||
@@ -94,7 +94,7 @@ ExecuteSystemCommandCommand.Command=Execute...
|
||||
UpdateDetectionDialog.Operations=Operations
|
||||
ChangeConnectionStatusCommand.setLinkRef=set Link as Ref
|
||||
Note.DefaultText=text
|
||||
DesignerColorsPreferencePage.ConnectionColorMessages=If you change link colors, you should restart the current job to apply changes.
|
||||
DesignerColorsPreferencePage.ConnectionColorMessages=If you change link colors, you should restart the current job to apply changes.
|
||||
MultiPageEditorContributor.runMenu=Run
|
||||
EParameterName.uniqueName=Unique Name
|
||||
ExternalNodeChangeCommand.propagateMessage=Would you like to propagate changes ?
|
||||
@@ -109,7 +109,7 @@ ConfigureConnParamDialog.ContextText=With Context:
|
||||
EParameterName.UseStatistics=Use statistics (tStatCatcher)
|
||||
StatsAndLogsComposite.StatsLogsSettings=Stats & Logs Settings
|
||||
NodesPasteCommand.label=Paste
|
||||
ExternalNodeChangeCommand.modifaicationFrom=Modification from
|
||||
ExternalNodeChangeCommand.modifaicationFrom=Modification from
|
||||
EmfComponent.Time=Time
|
||||
ContextParameterExtractor.ExistedMessages=Some context parameters have be existed in {0}.
|
||||
TextController.decoration.description=Value taken from the repository
|
||||
@@ -229,10 +229,10 @@ ContextParameterPage.title=Context parameter
|
||||
NodeReturn.Availability.AFTER=After
|
||||
EmfComponent.repository=Repository
|
||||
EParameterName.ConnectionFormat=Connection format
|
||||
ExecuteSystemCommandCommand.Title=Executed command
|
||||
ExecuteSystemCommandCommand.Title=Executed command
|
||||
EParameterName.Description=Description
|
||||
Process.IfToUpgradeMetadata=The metadata used in the following component(s) has been modified.\nSelect the component(s) that you want to update from the repository.
|
||||
NewProcessWizard.title=New Job
|
||||
NewProcessWizard.title=New job
|
||||
CheckController.decoration.description=Value taken from the repository
|
||||
ContextParameterPage.comment=Comment
|
||||
EParameterName.onConsoleFlag=On Console
|
||||
@@ -268,7 +268,7 @@ ContextParameterPage.nameExists=Parameter name already exists.
|
||||
ExecuteSystemCommandCommand.Label=Executes special commands which were set by user or defined in component.
|
||||
ContextParameterPage.defaultValue=Default value
|
||||
MergeOrderDialog.MoveDown=Move Down
|
||||
EParameterName.dbName=Db Name
|
||||
EParameterName.dbName=Db Name
|
||||
TalendEditorContextMenuProvider.Row=Row
|
||||
EParameterName.catchUserWarning=Catch user warnings
|
||||
StatsAndLogsComposite.Save=&Save to preferences
|
||||
@@ -502,7 +502,7 @@ TraceEnableAction.TraceEnableDesc=Set Trace Enable
|
||||
TraceEnableAction.TraceEnableTitle=Trace Enable
|
||||
UpdateManagerUtils.updateMOfification=Update manager modification
|
||||
WSDL2JAVAController.TOS=Talend Open Studio
|
||||
WSDL2JAVAController.generateFileFailed=Generate java files failed \n{0} \:
|
||||
WSDL2JAVAController.generateFileFailed=Generate java files failed \n{0} :
|
||||
WSDL2JAVAController.generateFileFailedFromWSDL=Generate java files from the wsdl file\: {0} successfully.
|
||||
JobSettingProjectSettingPage.implictLabel=Implicit context load
|
||||
JobSettingProjectSettingPage.statAndLog=Stats and logs
|
||||
@@ -673,7 +673,7 @@ ModifyMergeOrderAction.ERROE=Error
|
||||
ConnectionDeleteCommand.COLLAPSE=Warning
|
||||
ConnectionDeleteCommand.COLLAPSEJOBLET=Can not delete the connections of the expanded Joblet in Job.
|
||||
MultiPageTalendEditor.DIRTY=Dirty joblet
|
||||
MultiPageTalendEditor.DIRTYMESSAGE=\ is dirty, Please save joblet first, otherwise you will lose the modification in joblet?
|
||||
MultiPageTalendEditor.DIRTYMESSAGE= is dirty, Please save joblet first, otherwise you will lose the modification in joblet?
|
||||
UpdateDetectionDialog.jobletMessage=Job closed will be updated automatically.
|
||||
ImportExportPreferencePage.addClasspathJar=Add classpath jar in exported jobs (not compatible with JobServer)
|
||||
DbTableController.dialog.title=Error
|
||||
@@ -717,7 +717,7 @@ TalendEditorDropTargetListener.updateHadoopCfgDialog.msg=The hadoop configuratio
|
||||
CodeView.initMessage=Generation Engine Initialization in progress...
|
||||
Connection.paral_queuesize=QUEUE_SIZE
|
||||
ModulesInstaller_text1=Component {0} requires the following third party modules;
|
||||
ModulesInstaller_title1=List of modules not installed for component
|
||||
ModulesInstaller_title1=List of modules not installed for component
|
||||
ModulesInstaller_text2=Selected components require the following third party modules
|
||||
ModulesInstaller_title2=List of modules not installed for the selected components
|
||||
PropertiesWizardPage.ItemExistsError=This item already exists. Check the Recycle bin and empty it if needed.
|
||||
@@ -1005,3 +1005,10 @@ PerformancePreferencePage.propagateContext=Propagate contexts added in repositor
|
||||
LicenseKeyController.NewLicenseKey=Enter a new license key
|
||||
ReconcilerStyledText.illegalArgs=Input args are bigger than text length:{0}, original input <{1}, {2}>, changed to <{3}, {4}>.
|
||||
JobLaunchConfigurationDelegate.waitProcessRunning=Waiting for running process...
|
||||
StitchDataLoaderConstants.descriptionForIntegrationSource=Extract {0} data and ingest it in the cloud destination of your choice using Stitch Data Loader. Select this option to open your browser and try it for free.
|
||||
StitchDataLoaderConstants.descriptionForDataWarehouseDestination=Ingest data from over 100 popular sources to {0} using Stitch Data Loader. Select this option to open your browser and try it for free.
|
||||
ExtraComposite.RuntimeLineageSettings.all=Use runtime lineage for all Jobs
|
||||
ExtraComposite.RuntimeLineageSettings.select=Use runtime lineage for selected Jobs
|
||||
ExtraComposite.RuntimeLineageSettings.save=Save runtime lineage project settings ...
|
||||
ExtraComposite.RuntimeLineageSettings.outputPath=Output path:
|
||||
ExtraComposite.RuntimeLineageSettings.note=To fully use this feature, the product Talend Data Catalog is required.
|
||||
|
||||
@@ -975,3 +975,29 @@ PerformancePreferencePage.defaultTimeout.read=Valeur du d\u00E9lai avant expirat
|
||||
Node.hasMoreThenOneSourceKey=Ce composant n\'a pas de source cl\u00E9 d\u00E9finie.
|
||||
DatabaseForm.checkFailure=\u00C9chec de la connexion
|
||||
DatabaseForm.checkFailureTip=Vous devez modifier les param\u00E8tres de la base de donn\u00E9es.
|
||||
AbstractPreferenceComposite.textContent2=Appliquer aux sous-Jobs
|
||||
AbstractPreferenceComposite.tipContent2=Appliquer aux sous-Jobs
|
||||
ActivateSubjobAction.ActivateComplete2=Activer le sous-Job complet
|
||||
ActivateSubjobAction.ActivatePart2=Activer le sous-Job courant
|
||||
ActivateSubjobAction.DeactivateComplete2=D\u00E9sactiver le sous-Job complet
|
||||
ActivateSubjobAction.DeactivatePart2=D\u00E9sactiver le sous-Job courant
|
||||
ChangeActivateStatusSubjobCommand.Label.ActiveComplete2=Activer le sous-Job complet
|
||||
ChangeActivateStatusSubjobCommand.Label.ActivePart2=Activer le sous-Job courant
|
||||
ChangeActivateStatusSubjobCommand.Label.DeactiveComplete2=D\u00E9sactiver le sous-Job complet
|
||||
ChangeActivateStatusSubjobCommand.Label.DeactivePart2=D\u00E9sactiver le sous-Job courant
|
||||
ComponentSettingsView.subjob2=Sous-Job
|
||||
ConnectionSetAsMainRef.ConnectionModifyError2=Impossible de modifier la connexion lorsque le composant de d\u00E9but a un lien subJob.
|
||||
DisplaySubjobCommand.DisplaySubjob2=Afficher le sous-Job
|
||||
DisplaySubjobCommand.HideSubjob2=Masquer le sous-Job
|
||||
EParameterName.OverrideEncodingFlag=\u00C9craser l\'encodage
|
||||
EParameterName.showSubjob2=Afficher le titre du sous-Job
|
||||
ModifyMergeOrderAction.ConnectionModifyError2=Impossible de modifier la connexion lorsque le composant de d\u00E9but a un lien subJob.
|
||||
Node.notSubjobStartNode2=Ce composant \"{0}\" n\'est pas un n\u00BDud de d\u00E9but de sous-Job.
|
||||
Node.inLoop=Le n\u00BDud ({0}) est dans une boucle r\u00E9cursive.
|
||||
ToggleSubjobsAction.LABEL2=D\u00E9velopper/r\u00E9duire les sous-Jobs
|
||||
PerformancePreferencePage.propagateContext=Propager les contextes ajout\u00E9s aux groupes de contextes du r\u00E9f\u00E9rentiel
|
||||
LicenseKeyController.NewLicenseKey=Saisissez une nouvelle cl\u00E9 de licence
|
||||
ReconcilerStyledText.illegalArgs=Les arguments d\'entr\u00E9e sont plus grands que la longueur du texte\u00A0:{0}, entr\u00E9e originale <{1}, {2}>, modifi\u00E9e en <{3}, {4}>.
|
||||
JobLaunchConfigurationDelegate.waitProcessRunning=En attente du processus en cours d\'ex\u00E9cution...
|
||||
StitchDataLoaderConstants.descriptionForIntegrationSource=Extrait des donn\u00E9es {0} et les ing\u00E8re dans la destination Cloud de votre choix \u00E0 l'aide de Stitch Data Loader. S\u00E9lectionnez cette option pour ouvrir votre navigateur et l'essayer gratuitement.
|
||||
StitchDataLoaderConstants.descriptionForDataWarehouseDestination=Ing\u00E8re des donn\u00E9es de plus de 100 sources populaires dans {0} \u00E0 l'aide de Stitch Data Loader. S\u00E9lectionnez cette option pour ouvrir votre navigateur et l'essayer gratuitement.
|
||||
|
||||
@@ -84,7 +84,7 @@ SqlMemoController.QueryError.mainMsg=\u30AF\u30A8\u30EA\u30B9\u30C6\u30FC\u30C8\
|
||||
ContextRepositoryCommand.modifyContext=\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u306E\u5909\u66F4
|
||||
EParameterName.DisableWarnings=\u8B66\u544A\u306E\u7121\u52B9\u5316
|
||||
ChangeConnTextCommand.Label=\u63A5\u7D9A\u30E9\u30D9\u30EB\u306E\u5909\u66F4
|
||||
TalendEditorPaletteFactory.Note=\u30CE\u30FC\u30C8
|
||||
TalendEditorPaletteFactory.Note=\u6CE8
|
||||
EParameterName.tStatCatcherStats=tStatCatcher\u7D71\u8A08\u60C5\u5831
|
||||
EParameterName.LoadNewVariableLabel=\u5909\u6570\u3092\u30ED\u30FC\u30C9\u3059\u308B\u5834\u5408\u306F\u3001\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u306B\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093
|
||||
EParameterName.startable=\u958B\u59CB\u53EF\u80FD
|
||||
@@ -1005,3 +1005,5 @@ PerformancePreferencePage.propagateContext=\u30EA\u30DD\u30B8\u30C8\u30EA\u30FC\
|
||||
LicenseKeyController.NewLicenseKey=\u65B0\u3057\u3044\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u3092\u5165\u529B
|
||||
ReconcilerStyledText.illegalArgs=\u5165\u529B\u5F15\u6570\u304C\u30C6\u30AD\u30B9\u30C8\u9577\u3092\u8D85\u3048\u3066\u3044\u307E\u3059:{0}\u3001\u5143\u306E\u5165\u529B<{1}\u3001{2}>\u3001\u5909\u66F4\u3057\u3066<{3}\u3001{4}>\u3068\u306A\u308A\u307E\u3057\u305F\u3002
|
||||
JobLaunchConfigurationDelegate.waitProcessRunning=\u5B9F\u884C\u30D7\u30ED\u30BB\u30B9\u3092\u5F85\u6A5F\u4E2D...
|
||||
StitchDataLoaderConstants.descriptionForIntegrationSource=Stitch Data Loader\u3092\u4F7F\u3044\u3001100\u3092\u8D85\u3048\u308B\u4EBA\u6C17\u306E\u30BD\u30FC\u30B9\u304B\u3089\u30C7\u30FC\u30BF\u3092{0}\u306B\u53D6\u308A\u8FBC\u307F\u307E\u3059\u3002\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u30D6\u30E9\u30A6\u30B6\u30FC\u3067\u304A\u8A66\u3057\u3044\u305F\u3060\u3051\u307E\u3059\u3002
|
||||
StitchDataLoaderConstants.descriptionForDataWarehouseDestination=Stitch Data Loader\u3092\u4F7F\u3044\u3001{0}\u30C7\u30FC\u30BF\u3092\u62BD\u51FA\u3057\u3066\u6307\u5B9A\u306E\u30AF\u30E9\u30A6\u30C9\u30C7\u30B9\u30C6\u30A3\u30CD\u30FC\u30B7\u30E7\u30F3\u306B\u53D6\u308A\u8FBC\u307F\u307E\u3059\u3002\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u30D6\u30E9\u30A6\u30B6\u30FC\u3067\u304A\u8A66\u3057\u3044\u305F\u3060\u3051\u307E\u3059\u3002
|
||||
|
||||
@@ -36,7 +36,7 @@ TableEntriesManager.exceptionMessage.caseNotFound=case not found
|
||||
ToolbarInputZone.widgetTooltip.addAlias=Add alias
|
||||
ToolbarOutputZone.widgetTooltip.removeOutputTable=Remove selected output table
|
||||
InputDataMapTableView.columnTitle.ExplicitJoin=Explicit join
|
||||
AliasDialog.addNewAlias=Add a new alias
|
||||
AliasDialog.addNewAlias=Add a new alias
|
||||
MapperManager.exceptionMessage.useOtherSignature=Use other signature method to add entry
|
||||
UIManager.propagateTitle=Propagate
|
||||
MapperManager.removeOutputTableTitle=Remove output table
|
||||
@@ -69,7 +69,7 @@ InputDataMapTableView.columnTitle.Operator=Operator
|
||||
ProblemsManager.operatorNotSet=Operator of input entry '{0}' is not set.
|
||||
VarsTable.invalidTip=' is invalid.
|
||||
UIManager.3= doesn't exist !
|
||||
UIManager.2=The zone
|
||||
UIManager.2=The zone
|
||||
DbMapComponent.unknowValue=Value of element parameter NAME is unknown :
|
||||
UIManager.nameExistOrNull=The name already exists or is null.
|
||||
AliasDialog.inputValid=Input is invalid.
|
||||
@@ -157,3 +157,12 @@ DataMapTableView.buttonTooltip.menu.addOtherClauses=Add an other (GROUP...) clau
|
||||
ProblemsAnalyser.needAlias.error1=The '{0}' linked table name '{1}' is too complex ,please use alias to generate sql!
|
||||
ToolbarOutputZone.widgetTooltip.delimitedIdentifiers=Active me to add double quotes for schemas to support delimited identifiers.
|
||||
ToolbarOutputZone.widgetText.delimitedIdentifiers=Delimited identifiers
|
||||
ExpressionComposite.expression=Expression
|
||||
ExpressionComposite.clear=Clear
|
||||
ExpressionBuilderDialog.message=Close without saving
|
||||
ExpressionBuilderDialog.Confirm=Do you want to close the Expression Builder without save and lose your changes?
|
||||
ExpressionBuilderDialog.ok.button=Ok
|
||||
ExpressionBuilderDialog.cancel.button=Cancel
|
||||
ExpressionBuilderDialog.expression.builder=Expression Builder
|
||||
ExpressionComposite.Wrap=Wrap
|
||||
ExpressionComposite.undo=Undo
|
||||
|
||||
@@ -27,11 +27,11 @@ FOXUI.2=Related Column
|
||||
FOXUI.1=XML Tree
|
||||
FOXUI.0=Link target
|
||||
DragAndDrogDialog.AddAttributes=Create as attribute of target node
|
||||
FOXUI.19=Linker source
|
||||
FOXUI.19=Linker Source
|
||||
FOXUI.18=Remove Group Element
|
||||
FOXUI.17=Set As Group Element
|
||||
FOXUI.16=Set As Loop Element
|
||||
FOXUI.15=Guess loop element
|
||||
FOXUI.15=Guess Loop Element
|
||||
Schema2XMLDragAndDropHandler.IsNotElementWarning=isn't a Element, can not create sub-elements or attributes.
|
||||
FOXUI.14=Import XML Tree
|
||||
FooterComposite.AutoMap=Auto map!
|
||||
|
||||
@@ -67,12 +67,12 @@ MapperManager.removeOutputTableTitleMessage=Are you sure you want to remove the
|
||||
ToolbarOutputZone.moveupTooltip=Move up selected output table
|
||||
DataMapTableView.buttonTooltip.minimize=Minimize
|
||||
EntryContentProposal.column=Column:
|
||||
Problem.warning.setExpressionKey=Try to set an Expression key if possible in the lookup table '{0}' to improve performance.
|
||||
Problem.warning.setExpressionKey=Try to set an Expression key if possible in the lookup table '{0}' to improve performance.
|
||||
ToolbarInputZone.restoreTooltip=Restore all input tables
|
||||
VarsTable.invalidTip=' is invalid.
|
||||
Problem.warning.unusableReject=As no filter is defined in table(s) {0}, the output rejection cannot be used.
|
||||
Problem.warning.unusableReject=As no filter is defined in table(s) {0}, the output rejection cannot be used.
|
||||
UIManager.3= does'nt exist !
|
||||
UIManager.2=The zone
|
||||
UIManager.2=The zone
|
||||
OutputDataMapTableView.columnTitle.filterCondition=Filters conditions (AND)
|
||||
MapperComponent.generationNotInitial=generationManager is not initialized by the perljet/javajet\!
|
||||
VarsDataMapTableView.nullable=Nullable
|
||||
@@ -105,11 +105,11 @@ InputDataMapTableView.removeGlobalMapVar.Title=Remove globalMap variable
|
||||
InputDataMapTableView.removeGlobalMapVar.Message=Are you sure to remove the globalMap variable {0}?
|
||||
InputDataMapTableView.globalMapKey=globalMap Key
|
||||
InputDataMapTableView.invalid=<Invalid>
|
||||
InputDataMapTableView.invalidConfiguration=Invalid configuration, choose another lookup mode or set an expression in the lookup key column "{0}\\"
|
||||
InputDataMapTableView.invalidConfiguration=Invalid configuration, choose another lookup mode or set an expression in the lookup key column "{0}\"
|
||||
FooterComposite.button.APPLY=Apply
|
||||
InputDataMapTableView.columnTitle.Operator=Operator
|
||||
HTMLDocGenerator_generate_document=Generated documentation
|
||||
HTMLDocGenerator.author=AUTHOR
|
||||
HTMLDocGenerator.author=Author
|
||||
HTMLDocGenerator.author1=Author
|
||||
HTMLDocGenerator.column=Column
|
||||
HTMLDocGenerator.comment=Comment
|
||||
|
||||
@@ -2,7 +2,7 @@ RowGenPreivewCodeMain.Process.Generate=Process tRowGenerator generate...
|
||||
RowGenPreivewCodeMain.PreviewBtn.Text=Preview
|
||||
TabFolderEditors.FunParamTab.TitleText=Function parameters
|
||||
MetadataToolbarEditorViewExt.Columns.Text=Columns
|
||||
RowGenProcess.ConnectionName.NotValid=The name of the connection is not valid:
|
||||
RowGenProcess.ConnectionName.NotValid=The name of the connection is not valid:
|
||||
RowGenProcess.BeseName.BeNull=baseName can't be null
|
||||
UIManager.MessageBox.Content=Do you want to close the tRowGenerator without saving the current settings?
|
||||
RowGenTableEditor2.Preview.TitleText=Preview
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
ProcessComposite2.statsComposite=Stats && Traces
|
||||
ProcessComposite.clearBefore=Clear before run
|
||||
ProcessComposite.kill=Kill
|
||||
ProcessComposite.confirmText=Do you really want to launch the job with context {0} ?
|
||||
ProcessComposite.confirmText=Do you really want to launch the job with context {0} ?
|
||||
Processor.perlModuleNotFound=Perl Module Plugin not found.
|
||||
PromptDialog.title=Run Context {0} with parameters:
|
||||
ProcessComposite.execTimeHint=Show the time of running this job
|
||||
@@ -9,7 +9,7 @@ Processor.tempFailed=Failed to generate temporary files.
|
||||
ProcessComposite.exec=Run
|
||||
ProcessView.subtitleEmpty=No job to run
|
||||
ProcessComposite.statHint=Statistics on job execution will be shown
|
||||
prefs.clientTracePortBound2=to
|
||||
prefs.clientTracePortBound2=to
|
||||
prefs.clientTracePortBound1=Trace port range :
|
||||
ProcessComposite.execGroup=Execution
|
||||
ProcessView.gainFocusLog=Run process gain focus
|
||||
@@ -20,7 +20,7 @@ prefs.clientStatInvalidRange=Client stats port must be between 1024 and 65535 in
|
||||
Processor.commandLineLog=Command line:
|
||||
ProcessView.jobName=Job
|
||||
JavaProcessor.notFoundedProjectException=Java project not found.
|
||||
prefs.clientStatsPortBound2=to
|
||||
prefs.clientStatsPortBound2=to
|
||||
ProcessView.titleEmpty=Run job
|
||||
RunProcessContext.PortErrorTraces=Traces
|
||||
prefs.clientStatsPortBound1=Stats port range :
|
||||
@@ -30,7 +30,7 @@ ProcessComposite.trace=Traces
|
||||
RunProcessContext.PortErrorTitle={0} Port Error!
|
||||
ProcessDebugDialog.title=Debug job {0}
|
||||
ProcessComposite.killHint=Stop immediatly the execution of the job
|
||||
ProcessComposite.buildTask=Building Job
|
||||
ProcessComposite.buildTask=Building job
|
||||
ProcessComposite.execFailed=Execution failed :
|
||||
Processor.execFailed=Job execution failed.
|
||||
ProcessComposite.stat=Statistics
|
||||
@@ -55,13 +55,13 @@ prefs.clientConfiguration=Talend client configuration
|
||||
ProcessView.title=Run ({0})
|
||||
Processor.configurePerl=Perl interpreter not configured.
|
||||
JavaProcessor.notFoundedFolderException=Folder within .Java project not found
|
||||
ProcessComposite.execHint=Run the job
|
||||
ProcessComposite.execHint=Run the job
|
||||
ProcessComposite.valueCol=Value
|
||||
ProcessComposite.saveBeforeRunHint=Saves the Job before the execution.
|
||||
ProcessDebugDialog.debugBtn=Debug
|
||||
prefs.configuration.title=Run process configuration :
|
||||
DefaultRunProcessService.methodCalledError=This method should'nt be called here, use it on RunProcessService class.
|
||||
ErrorDetailDialog.errorExist=\ \ Warning\! Some errors exist in job. Would you like to continue?
|
||||
ErrorDetailDialog.errorExist= Warning! Some errors exist in job. Would you like to continue?
|
||||
ErrorDetailDialog.findError=Error found
|
||||
ProcessComposite.hideContext=hide the Context
|
||||
ProcessComposite.lineLimited=Line limit
|
||||
@@ -96,7 +96,7 @@ CamelJobErrorsChecker_compile_errors=Route compile errors
|
||||
CamelJobErrorsChecker_compile_error_content=At least Route "{0}" has compile errors, please fix and export again.
|
||||
RunProcessPreferencePage.RouteVmArgument=Route Run VM arguments
|
||||
ProcessComposite.wrapbutton=Wrap
|
||||
JavaProcessorUtilities.msg.missingjar.forProcess=Missing jars:
|
||||
JavaProcessorUtilities.msg.missingjar.forProcess=Missing jars:
|
||||
JavaProcessorUtilities.msg.missingjar.note=Note:
|
||||
JavaProcessorUtilities.msg.missingjar.onlyforroutine=The following jars are also required by compiler:
|
||||
JavaProcessorUtilities.msg.missingjar.warningtitle=Warning!
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
ProcessComposite2.statsComposite=Stats && Traces
|
||||
ProcessComposite.clearBefore=Effacer avant l\'ex\u00E9cution
|
||||
ProcessComposite.kill=Arr\u00EAter
|
||||
ProcessComposite.confirmText=Voulez-vous vraiment lancer le Job avec le contexte {0} ?
|
||||
ProcessComposite.confirmText=Voulez-vous lancer le Job avec le contexte {0}\u00A0?
|
||||
Processor.perlModuleNotFound=Impossible de trouver le plug-in du module Perl.
|
||||
PromptDialog.title=Ex\u00E9cuter le contexte {0} avec les param\u00E8tres \:
|
||||
ProcessComposite.execTimeHint=Afficher le temps d'ex\u00E9cution du job
|
||||
@@ -96,7 +96,7 @@ CamelJobErrorsChecker_compile_errors=Erreurs de compilation de la route
|
||||
CamelJobErrorsChecker_compile_error_content=Au moins la route "{0}" a des erreurs de compilation, fixez-les et exportez \u00E0 nouveau.
|
||||
RunProcessPreferencePage.RouteVmArgument=Arguments VM d\'ex\u00E9cution des jobs
|
||||
ProcessComposite.wrapbutton=Retour automatique \u00E0 la ligne
|
||||
JavaProcessorUtilities.msg.missingjar.forProcess=Jars manquants :
|
||||
JavaProcessorUtilities.msg.missingjar.forProcess=Jars manquants\u00A0:
|
||||
JavaProcessorUtilities.msg.missingjar.note=Remarque :
|
||||
JavaProcessorUtilities.msg.missingjar.onlyforroutine=Les Jar suivants sont aussi requis par le compilateur :
|
||||
JavaProcessorUtilities.msg.missingjar.warningtitle=Attention !
|
||||
@@ -134,3 +134,6 @@ Processor.memoryRun.searchJvmInfo=Recherche de la JVM active du Job actuel.
|
||||
Processor.memoryRun.jvmInfo=Le JVM est d\u00E9connect\u00E9e.
|
||||
ShellPs1SettingPreferencePage_Title=Scripts ps1
|
||||
JobErrorsChecker_compile_error_errormessage=Message d\'erreur
|
||||
ProcessComposite.endJobPattern=Job {0} termin\u00E9 \u00E0 {1}.
|
||||
ProcessComposite.endExitCode=Code de sortie {0}
|
||||
ProcessComposite.startJobPattern=D\u00E9marrage du Job {0} \u00E0 {1}.
|
||||
|
||||
@@ -26,3 +26,6 @@ FTPForm_proxyPortText=Port du proxy
|
||||
FTPForm_proxyUsernameText=Utilisateur du proxy
|
||||
FTPForm_proxyPasswordText=Mot de passe du proxy
|
||||
FTPForm_filepathAlert=Le chemin du fichier doit \u00EAtre sp\u00E9cifi\u00E9
|
||||
FTPForm_conn_timeout=Expiration de la connexion
|
||||
FTPForm_conn_timeunit=Unit\u00E9\u00A0: millisecondes
|
||||
FTPForm_ftpTimeoutText_check=Le d\u00E9lai avant expiration doit \u00EAtre un nombre.
|
||||
|
||||
@@ -8,7 +8,7 @@ migrationtask.upgradetWarntDiePriority.title=Upgrade tWarn and tDie priority
|
||||
migrationtask.renametDbInputToPostgresql.title=Rename tDBxxTotPostgresqlxx
|
||||
migrationtask.renametFTPtoFTP.title=Rename tFTP to specialized tFTP
|
||||
prefsStatusName=Status
|
||||
migrationtask.renametFileZipUnzip.description=Rename tFileZip and tFileUnzip components to tFileArchive and tFileUnarchive
|
||||
migrationtask.renametFileZipUnzip.description=Rename tFileZip and tFileUnzip components to tFileArchive and tFileUnarchive
|
||||
migrationtask.renametDbInputToMySQL.description=Migrate database generic components connected to a MySQL database to the corresponding specific MySQL components.
|
||||
migrationtask.renameNormalize.description=Rename all components tNormalizer to tNormalize
|
||||
migrationtask.updatetRowGenerator.description=Migrate simple interface tRowGenerator components to advanced interface.
|
||||
@@ -21,7 +21,7 @@ migrationtask.RenametMapPersistentMigrationTask.title=Rename tMapPersistent to t
|
||||
migrationtask.renametDbInputToOracle.title=Rename tDBxxTotOraclexx
|
||||
migrationtask.UpgradetAdvancedFileOutputXMLMigrationTask.title=Upgrade mapping tAdvancedFileOutputXML
|
||||
migrationtask.changetUniqRowLinks.description=Change the link type of all tUniqRow components from "Main" to "Unique".
|
||||
migrationtask.AddPerlRefArrayPointer2.desc=Replace this syntax "$xxx[" by "$xxx->[" and "@xxx" by "@$xxx" only for known existing Talend connections and components
|
||||
migrationtask.AddPerlRefArrayPointer2.desc=Replace this syntax "$xxx[" by "$xxx->[" and "@xxx" by "@$xxx" only for known existing Talend connections and components
|
||||
migrationtask.renametDbInputToPostgresql.description=Migrate database generic components connected to a PostgreSQL database to the corresponding specific PostgreSQL components.
|
||||
migrationtask.AddPerlRefArrayPointer2.title=Add ref array pointers and unreference arrays contained in Table fields
|
||||
migrationtask.AddQuotesToModuleList.desc=Add quotes to module list if needed.
|
||||
@@ -39,12 +39,12 @@ migrationtask.renametDbInputToMssql.title=Rename tDBxxTotMssqlxx
|
||||
migrationtask.RenameTheClassnameofTheRoutinesFileMigrationTask.title=Rename the classes named __CLASS_NAME__
|
||||
migrationtask.AddPerlRefArrayPointer.title=Add ref array pointers and unreference arrays contained in Text fields
|
||||
migrationtask.renametFileZipUnzip.title=Rename tFileZip and tFileUnzip components
|
||||
migrationtask.renametDbInputToMySQL.title=Rename tDBxxTotMySQLxx
|
||||
migrationtask.renametDbInputToMySQL.title=Rename tDBxxTotMySQLxx
|
||||
deleteProjectsAction.title=Delete projects
|
||||
repository.prop.version=Version
|
||||
prefsRepositoryName=Repository
|
||||
migrationtask.renametDbInputToMssql.description=Migrate database generic components connected to a Microsoft SQL Server database to the corresponding specific Microsoft SQL Server components.
|
||||
migrationtask.convertOldPerlTypes.title=Convert the old Perl types to new types.
|
||||
migrationtask.convertOldPerlTypes.title=Convert the old Perl types to new types.
|
||||
migrationtask.renameFlowMeter.description=Rename all components tMetter to tFlowMeter
|
||||
migrationtask.UpgradetAdvancedFileOutputXMLMigrationTask.description=Upgrade mapping tAdvancedFileOutputXML, change the level architecture to path.
|
||||
migrationtask.RenametXMLRPCMigrationTask.description=Rename all components tXMLRPC to tXMLRPCInput in all jobs in repository
|
||||
@@ -54,7 +54,7 @@ migrationtask.ReplaceMultiFlowBytReplicate.desc=Replace Multi-flow by tReplicate
|
||||
migrationtask.upgradetWarntDiePriority.description=Upgrade priority to switch from text field to dialog field.
|
||||
migrationtask.renameFlowMeterCatcher.description=Rename all components tMetterCatcher to tFlowMeterCatcher
|
||||
providerName=www.example.org
|
||||
migrationtask.AddPerlRefArrayPointer.desc=Replace this syntax "$xxx[" by "$xxx->[" and "@xxx" by "@$xxx" only for known existing Talend connections and components
|
||||
migrationtask.AddPerlRefArrayPointer.desc=Replace this syntax "$xxx[" by "$xxx->[" and "@xxx" by "@$xxx" only for known existing Talend connections and components
|
||||
projectsetting.General=General
|
||||
projectsetting.Designer=Designer
|
||||
projectsetting.VersionManagement=Version Management
|
||||
|
||||
@@ -85,3 +85,4 @@ projectSetting.projectRefSettingPage=Projets de r\u00E9f\u00E9rence
|
||||
ProjectSetting.groupId=GroupId du d\u00E9ploiement
|
||||
projectSetting.deploymentConfiguration=Configuration du d\u00E9ploiement
|
||||
projectsetting.Audit=Audit
|
||||
projectSetting.ArtifactProxy=Configuration du proxy d\'artefacts
|
||||
|
||||
@@ -85,7 +85,7 @@ SelectorTableForm.ColumnNumber=Column number
|
||||
CommonWizard.persistenceException=Access to the data failure
|
||||
JavaJobScriptsExportWSWizardPage.AxisLib=Axis 1.4 Lib
|
||||
FileStep2.escapeCharAlert=Escape Char must be specified
|
||||
CreateFileXmlAction.action.createTitle=Create file XML
|
||||
CreateFileXmlAction.action.createTitle=Create XML file
|
||||
FileStep2.fieldPosition=Marker position
|
||||
FileStep3.guessIsDone=Guess successful
|
||||
FileStep2.fieldSeparatorAlert=The field separator must be specified. To be valid, it must be surrounded by quotation marks.
|
||||
@@ -153,7 +153,7 @@ LoginComposite.manageProjectPre=Or
|
||||
ConfigExternalPerlModulePage.moduleFieldLabel=Module
|
||||
ImportDemoProjectAction.actionTooltip=Import demo project
|
||||
CreateConnectionAction.action.openTitle=Open connection
|
||||
FileStep2.previewIsDone=Preview successful...
|
||||
FileStep2.previewIsDone=Preview successful...
|
||||
FileStep3.guessConfirmation=Confirm changes ?
|
||||
VersionManagementDialog.Version=Version
|
||||
CreateDocumentationAction.createDocActionTipText.addDocItem=Add a new documentation item
|
||||
@@ -193,7 +193,7 @@ ConfigExternalJarPage.inputJARName=Input a library's name
|
||||
FileStep1.serverAlert=Server must be specified
|
||||
RefreshAction.toolTipText=Refresh
|
||||
ProjectSettingsWizardPage.PaletteSettings=Palette Settings
|
||||
PositionalTextTest.println.fieldValue=Field Value
|
||||
PositionalTextTest.println.fieldValue=Field Value
|
||||
VersionManagementDialog.EachVersion=Update the version of each item.
|
||||
RepositoryPreferencePage.RefreshTitle=Repository Refresh
|
||||
DocumentationPage.option=Option
|
||||
@@ -241,7 +241,7 @@ ImportProjectAsWizardPage.form.browse=Browse
|
||||
ImportProjectAsWizardPage.form.selectDirectory=Select root directory
|
||||
CreateFileRegexpAction.action.createTitle=Create file regex
|
||||
EditPropertiesAction.action.title=Edit properties
|
||||
ImportDemoProjectAction.actionTitle=Demos
|
||||
ImportDemoProjectAction.actionTitle=Demos
|
||||
FileStep1.formatAlert=Format must be specified
|
||||
JobScriptsExportWizardPage.jobPerlScripts=Perl scripts
|
||||
DetecteViewImpactAction.Label=Detect dependencies
|
||||
@@ -279,7 +279,7 @@ ImportExternalJarPage.pageMessage=Configuration of external libraries for routin
|
||||
CommonWizard.next=Next
|
||||
FileStep2.empty=Empty
|
||||
DocumentationPage.LinkLabel= Copy documentation to repository.
|
||||
LoginComposite.buttons.importProject=Import
|
||||
LoginComposite.buttons.importProject=Import
|
||||
EditContextAction.readContext=Read context group
|
||||
NewProjectWizard.failureTitle=Error
|
||||
XmlToXPathLinker.exceptionReturn.xPathInvalid=The current XPath expression is invalid
|
||||
@@ -297,7 +297,7 @@ ConfigExternalJarPage.jarFile.label=Library File:
|
||||
DatabaseTableForm.name=Name
|
||||
EditContextAction.editContext=Edit context group
|
||||
FileStep1.noExist=doesn't exist
|
||||
DatabaseTableForm.connectionIsDone=Connection successful.
|
||||
DatabaseTableForm.connectionIsDone=Connection successful.
|
||||
ImportProjectsUtilities.task.importingProject=Importing project...
|
||||
FileStep2.fieldPositionTip=You must define here the position of each column. The positions must be presented in ascending order.
|
||||
FileStep2.headerTip=Header
|
||||
@@ -308,7 +308,7 @@ connections.form.emptyField.repository=Repository must be selected
|
||||
LibraryField.requiredColumn=Required
|
||||
SelectDeleteProjectDialog.SelectAll=Select All
|
||||
SelectorTableForm.selectAllTables=Select All
|
||||
LoginComposite.buttons.deleteProject=Delete
|
||||
LoginComposite.buttons.deleteProject=Delete
|
||||
ImportDemoProjectAction.alertDialog.messageTitle=Message
|
||||
ConfigExternalJarPage.title=New Module
|
||||
FileStep2.rowSeparator=Row Separator
|
||||
@@ -351,7 +351,7 @@ SelectDeleteProjectDialog.DeselectAll=Deselect All
|
||||
LoginComposite.buttons.newProject.desc=Create a new local project
|
||||
FileStep1.server=Server
|
||||
JavaJobScriptsExportWSWizardPage.WSDLFile=Web Service files
|
||||
FileStep2.quoteDelimitedTip=The character " is unusable without escape character. Use: \"
|
||||
FileStep2.quoteDelimitedTip=The character " is unusable without escape character. Use: "
|
||||
FileStep3.metadataComment=Comment
|
||||
FileStep2.settingsIncomplete=The settings must be completed to show the preview
|
||||
CreateTableAction.action.editTitle=Edit Schema
|
||||
@@ -393,8 +393,8 @@ connections.form.emptyField.username=A username is needed.
|
||||
FileStep2.escapeCharTip=Escape Char
|
||||
ItemsVersionChangedDialog.Title=Confirm the new version of items
|
||||
LicenseWizard.windowTitle=License
|
||||
FileStep2.fieldPositionNotValidate=Field Position must contain only numbers and comma. The positions must be presented in the ascending order
|
||||
LoginComposite.buttons.newProject=Create
|
||||
FileStep2.fieldPositionNotValidate=Field Position must contain only numbers and comma. The positions must be presented in the ascending order
|
||||
LoginComposite.buttons.newProject=Create
|
||||
ConfigExternalPerlModulePage.required.label=If the module is required
|
||||
CommonWizard.cancel=Cancel
|
||||
NewProjectWizardPage.comment=Project description
|
||||
@@ -404,7 +404,7 @@ connections.form.emptyField.connname=A connection name is needed.
|
||||
VersionManagementDialog.Revert=Revert
|
||||
VersionManagementDialog.ConfirmTitle=Confirm
|
||||
LoginComposite.existing=Select
|
||||
CommonWizard.nameAlreadyExist=This name already exists
|
||||
CommonWizard.nameAlreadyExist=This name already exists
|
||||
FileStep1.groupFileViewer=File Viewer
|
||||
GenerateDocAsHTMLWizardPage.generateDocAsHTML=Generate job information to an archive file on the local file system.
|
||||
JobPerlScriptsManager.allInterpreter=All
|
||||
@@ -412,7 +412,7 @@ CreateFilePositionalAction.action.openTitle=Open file positional
|
||||
ReplaceRunBeforeAfterWithThenRunMigrationTask.ThenRun=ThenRun
|
||||
NewProjectWizardPage.technicalName=Technical Name
|
||||
RepositoryPreferencePage.RefreshCreated=Refresh when creating an item
|
||||
ConnectionsListButtonsToolBar.copyLabelPrefix=Copy of
|
||||
ConnectionsListButtonsToolBar.copyLabelPrefix=Copy of
|
||||
FileStep3.guessProgress=Guess in progress...
|
||||
ExtractionFieldsWithXPathEditorView.columnTitle.columnName=Column Name
|
||||
NewFolderWizard.label=Label
|
||||
@@ -596,7 +596,7 @@ CreateSandboxProjectDialog.Settings=Settings
|
||||
LoginComposite.DIFFERENT_WORKSPACES=Workspace has been changed. Please restart.
|
||||
LoginComposite.PROJECT_NEED=A project is needed...
|
||||
LoginComposite.TisWorkspace_welcome=Welcome to {0}!
|
||||
VersionManagementDialog.AllDependencies=select all dependencies
|
||||
VersionManagementDialog.AllDependencies=Select all dependencies
|
||||
VersionManagementDialog.FixVersion=Fix tRunJob versions if Latest
|
||||
VersionManagementDialog.FixLastVersion=When update the version, if all tRunJob are setup by default with Latest version, this will fix the version to the previous version.\nFor example : father 1.0 (tRunJob<child, Latest>).\nIf upgrade to version 1.1: \n - the father version 1.0 will contain : (tRunJob<child, 1.0>). To run the child with version 1.0 also.\n - the father version 1.1 will contain : (tRunJob<child, Latest>). To keep using the latest version.\n\nNote: this won't do anything if the versions are already fixed, and if doesn't use Latest.
|
||||
ImportItemAction.Label=Import items
|
||||
@@ -883,7 +883,7 @@ VersionManagementDialog.applyVersion=Apply version
|
||||
VersionManagementDialog.useJobVersion=Use job versions.
|
||||
JavaVersionProjectSettingPage.versionLabel=JDK Compiler compliance level:
|
||||
BuildJobManager.mavenErrorMessage=Job was not built successfully, please check the logs for more details available on {0}
|
||||
VersionManagementDialog.projectVersion=Project Version
|
||||
VersionManagementDialog.projectVersion=Project version
|
||||
VersionManagementDialog.useSnapshot=Use snapshot
|
||||
VersionManagementDialog.applyDetail=Apply
|
||||
VersionManagementDialog.eachMavenVersion=Change the version of each item individually.
|
||||
@@ -893,7 +893,7 @@ VersionManagementDialog.remove=Remove
|
||||
JavaJobScriptsExportWSWizardPage.MSESB=Microservice (Spring Boot) For ESB
|
||||
LimitRESTRequestJobChecker.limit_ESBJobForMS=Only ESB Job with "{0}" could build using [Microservice (Spring Boot) For ESB] type.
|
||||
LoginProjectPage.project_need.remote.cloud=Can't retrieve any project from Cloud, please ask for help from the administrator.
|
||||
NetworkErrorRetryForm.connectTimeout.label=Connection Timeout (seconds)
|
||||
NetworkErrorRetryForm.connectTimeout.label=Connection timeout (seconds)
|
||||
NetworkErrorRetryForm.connectTimeout.error.bound=Please input an integer between {0} and {1}
|
||||
NetworkErrorRetryForm.details=Details
|
||||
NetworkErrorRetryForm.toggle.message=Always don't retry before restart
|
||||
@@ -939,12 +939,12 @@ MavenDeploymentConfigurationProjectSettingPage.removeWarning=Do you want to dele
|
||||
MavenDeploymentConfigurationProjectSettingPage.nameExistedWarning={0} is existed!
|
||||
FileStep2.fieldSeparatorPositionalTip=You must defined here the position of each column. The positions must be presented in the ascending order
|
||||
FileStep2.stop=Stop
|
||||
JobScriptsExportWizardPage.requiredTalendPerlModules=Required talend modules
|
||||
JobScriptsExportWizardPage.requiredTalendPerlModules=Required Talend modules
|
||||
PropertiesWizardPage.Description=Description
|
||||
PropertiesWizardPage.Name=Name
|
||||
ReferenceProjectSetupPage.ErrorMissingReferencedProject=Missing referenced project [{0}].
|
||||
MavenGroupIdProjectSettingPage.skipGroupIdLabel=Skip base groupID if the item has folder
|
||||
AuditProjectSettingPage.selectAuditReportFolder=Please select a generate audit report folder\!
|
||||
AuditProjectSettingPage.selectAuditReportFolder=Please select a generate audit report folder!
|
||||
AuditProjectSettingPage.generateAuditReportProgressBar=Generating Audit Report!
|
||||
LimitRESTRequestJobChecker.limit_ESBJobForOSGI=Job without ESB components could not build using [OSGI Bundle For ESB] type.
|
||||
AuditProjectSettingPage.generateButtonText=Generate Audit Report
|
||||
@@ -1008,3 +1008,6 @@ ProjectSettingPage.ArtifactProxySetting.checkConnection=Check Connection
|
||||
ProjectSettingPage.ArtifactProxySetting.connectionFailureMsg=Connection failure,please check the proxy configuration
|
||||
LoginHelper.connectUserLibraryTitle=Check user libraries connection.
|
||||
LoginHelper.connectUserLibraryFailureWarning=Cannot connect to the user libraries artifact repository set in administrator. Do you want to open the project anyway?
|
||||
ConnectionsDialog.usernameOrPasswordInvalid=Check your username or password or contact your administrator.
|
||||
LoginProjectPage.authorizationErrorMessage=Invalid username or password for the remote connection. Do you want to fix it now?
|
||||
LoginProjectPage.errorMessageTitle=Error
|
||||
|
||||
@@ -193,7 +193,7 @@ ConfigExternalJarPage.inputJARName=Saisissez un nom de biblioth\u00E8que
|
||||
FileStep1.serverAlert=Le serveur doit \u00EAtre sp\u00E9cifi\u00E9
|
||||
RefreshAction.toolTipText=Rafra\u00EEchir
|
||||
ProjectSettingsWizardPage.PaletteSettings=Param\u00E8tres de la Palette
|
||||
PositionalTextTest.println.fieldValue=Valeur du champs
|
||||
PositionalTextTest.println.fieldValue=Valeur du champ
|
||||
VersionManagementDialog.EachVersion=Mettre \u00E0 jour la version de chaque \u00E9l\u00E9ment.
|
||||
RepositoryPreferencePage.RefreshTitle=Rafra\u00EEchir le r\u00E9f\u00E9rentiel
|
||||
DocumentationPage.option=Option
|
||||
@@ -985,3 +985,25 @@ connections.form.field.token=Jeton
|
||||
connections.form.field.token.browse=Ouvrir la page de g\u00E9n\u00E9ration de jetons dans le navigateur
|
||||
connections.form.getTokenUrl.failed=V\u00E9rifiez l'URL du serveur.
|
||||
ImportProjectAsWizardPage.importDescription=Saisir un nom de projet et sp\u00E9cifer le projet {0} \u00E0 importer.
|
||||
LoginProjectPage.cloud.aws_us=AWS - Est des \u00C9tats-Unis
|
||||
LoginProjectPage.cloud.aws_eu=AWS - Europe
|
||||
LoginProjectPage.cloud.aws_apac=AWS - Asie-Pacifique
|
||||
LoginProjectPage.cloud.usa_west=Azure - Ouest des \u00C9tats-Unis
|
||||
LoginProjectPage.cloud.cloud_custom=Cloud personnalis\u00E9
|
||||
LoginDialog.logonDenyTitle=Informations
|
||||
LoginDialog.logonDenyMsg=La version du produit est expir\u00E9e.\\nInstallez d\'abord [{0}].
|
||||
VersionManagementDialog.subjob2=S\u00E9lectionner tous les sous-Jobs
|
||||
Log4jSettingPage.Log4jVersionChangedWarn=La synchronisation des POM est requise apr\u00E8s modification de la version log4j. Changer maintenant\u00A0?
|
||||
Log4jSettingPage.ActivateLog4j2=Activer Log4j2 dans les composants
|
||||
Log4jSettingPage.Log4jVersion=Version de Log4j
|
||||
ProjectSettingPage.ArtifactProxySetting.groupNameTalendLib=Configuration du proxy des biblioth\u00E8ques Talend
|
||||
ProjectSettingPage.ArtifactProxySetting.artifactType=Type\u00A0:
|
||||
ProjectSettingPage.ArtifactProxySetting.url=URL\u00A0:
|
||||
ProjectSettingPage.ArtifactProxySetting.username=Utilisateur\u00A0:
|
||||
ProjectSettingPage.ArtifactProxySetting.password=Mot de passe\u00A0:
|
||||
ProjectSettingPage.ArtifactProxySetting.repositoryId=ID du r\u00E9f\u00E9rentiel\u00A0:
|
||||
ProjectSettingPage.ArtifactProxySetting.enableProxySetting=Activer les param\u00E8tres de proxy
|
||||
ProjectSettingPage.ArtifactProxySetting.checkConnection=V\u00E9rifier la connexion
|
||||
ProjectSettingPage.ArtifactProxySetting.connectionFailureMsg=\u00C9chec de la connexion, v\u00E9rifiez la configuration du proxy.
|
||||
LoginHelper.connectUserLibraryTitle=V\u00E9rifier la connexion aux biblioth\u00E8ques utilisateurs.
|
||||
LoginHelper.connectUserLibraryFailureWarning=Impossible de se connecter au r\u00E9f\u00E9rentiel d\'artefacts contenant les biblioth\u00E8ques utilisateur en mode administrateur. Ouvrir le projet malgr\u00E9 tout\u00A0?
|
||||
|
||||
@@ -688,7 +688,7 @@ JobScriptsExportWSWizardPage.newJobVersion.Label=\u30B8\u30E7\u30D6\u30D0\u30FC\
|
||||
JobScriptsExportWizardPage.newExportJob0=\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8 {0}: {1}_{2}
|
||||
JobScriptsExportWizardPage.newExportJob1=\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8 {0}: {1}_{2}
|
||||
JobScriptsExportWizardPage.newExportJobScript={0}\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u4E2D
|
||||
JobScriptsExportWizardPage.newExportJobSucessful=\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8{0}: {1}_{2}\u304C\u6210\u529F\u3057\u307E\u3057\u305F!
|
||||
JobScriptsExportWizardPage.newExportJobSucessful=\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8 {0}: {1}_{2}\u304C\u6210\u529F\u3057\u307E\u3057\u305F!
|
||||
JobScriptsExportWizardPage.newExportSuccess={0} \u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306B\u6210\u529F\u3057\u307E\u3057\u305F\uFF01
|
||||
LoginComposite.NewCreate=\u4F5C\u6210...
|
||||
LoginComposite.NewImport=\u30A4\u30F3\u30DD\u30FC\u30C8...
|
||||
@@ -1007,4 +1007,4 @@ ProjectSettingPage.ArtifactProxySetting.enableProxySetting=\u30D7\u30ED\u30AD\u3
|
||||
ProjectSettingPage.ArtifactProxySetting.checkConnection=\u63A5\u7D9A\u3092\u30C1\u30A7\u30C3\u30AF
|
||||
ProjectSettingPage.ArtifactProxySetting.connectionFailureMsg=\u63A5\u7D9A\u304C\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30D7\u30ED\u30AD\u30B7\u8A2D\u5B9A\u3092\u30C1\u30A7\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
||||
LoginHelper.connectUserLibraryTitle=\u30E6\u30FC\u30B6\u30FC\u30E9\u30A4\u30D6\u30E9\u30EA\u30FC\u63A5\u7D9A\u3092\u30C1\u30A7\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
||||
LoginHelper.connectUserLibraryFailureWarning=\u7BA1\u7406\u8005\u306E\u30E6\u30FC\u30B6\u30FC\u30E9\u30A4\u30D6\u30E9\u30EA\u30FC\u306E\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30EA\u30DD\u30B8\u30C8\u30EA\u30FC\u30BB\u30C3\u30C8\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3002\u7D9A\u884C\u3057\u3066\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3092\u958B\u304D\u307E\u3059\u304B?
|
||||
LoginHelper.connectUserLibraryFailureWarning=\u7BA1\u7406\u8005\u306E\u30E6\u30FC\u30B6\u30FC\u30E9\u30A4\u30D6\u30E9\u30EA\u30FC\u306E\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30EA\u30DD\u30B8\u30C8\u30EA\u30FC\u30BB\u30C3\u30C8\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3002\u3053\u306E\u307E\u307E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3092\u958B\u304D\u307E\u3059\u304B?
|
||||
|
||||
@@ -1007,4 +1007,4 @@ ProjectSettingPage.ArtifactProxySetting.enableProxySetting=\u542F\u7528\u4EE3\u7
|
||||
ProjectSettingPage.ArtifactProxySetting.checkConnection=\u68C0\u67E5\u8FDE\u63A5
|
||||
ProjectSettingPage.ArtifactProxySetting.connectionFailureMsg=\u8FDE\u63A5\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u4EE3\u7406\u914D\u7F6E
|
||||
LoginHelper.connectUserLibraryTitle=\u68C0\u67E5\u7528\u6237\u5E93\u8FDE\u63A5\u3002
|
||||
LoginHelper.connectUserLibraryFailureWarning=\u65E0\u6CD5\u8FDE\u63A5 Administrator \u4E2D\u7684\u7528\u6237\u5E93\u6784\u4EF6\u5E93\u96C6\uFF0C\u60F3\u8981\u7EE7\u7EED\u6253\u5F00\u5DE5\u7A0B\u5417\uFF1F
|
||||
LoginHelper.connectUserLibraryFailureWarning=\u65E0\u6CD5\u8FDE\u63A5\u81F3 Administrator \u4E2D\u7684\u7528\u6237\u5E93\u6784\u4EF6\u5E93\u96C6\u3002\u662F\u5426\u4ECD\u8981\u7EE7\u7EED\u6253\u5F00\u5DE5\u7A0B\uFF1F
|
||||
|
||||
@@ -3,14 +3,14 @@ JobScriptsExportWizardPage.contextPerlScripts=Context scripts
|
||||
SpagoBiServerEditor.descriptionColumnTitle=Short description
|
||||
SpagoBiServerEditor.hostColumnTitle=Host
|
||||
SpagoBiServerDialog.host=Host
|
||||
SpagoBiServerDialog.shellText.editServer=Edit SpagoBi server
|
||||
SpagoBiServerDialog.shellText.editServer=Edit SpagoBI server
|
||||
PublishOnSpagoExportWizardPage.publishResourceError=Deploy Resource Error
|
||||
PublishOnSpagoExportWizardPage.Settings=Settings
|
||||
SpagoBiServerDialog.engineNameText=Engine name
|
||||
PublishOnSpagoExportWizardPage.publishJob=Deploy job scripts to SpagoBI.
|
||||
PublishOnSpagoExportWizardPage.jobLabel=Label
|
||||
SpagoBiServerEditor.engineColumnTitle=Engine name
|
||||
SpagoBiServerDialog.shellText.createNewServer=Create new SpagoBi server
|
||||
SpagoBiServerDialog.shellText.createNewServer=Create new SpagoBI server
|
||||
PublishOnSpagoExportWizardPage.chooseResource=Choose at least one resource to export
|
||||
PublishOnSpagoExportWizardPage.jobDescription=Description
|
||||
PublishOnSpagoExportWizard.publishJob=Deploy on SpagoBI
|
||||
|
||||
@@ -26,4 +26,4 @@ SpagicServerDialog.shortDescription=Short description
|
||||
DataTransferMessages.ZipExport_mustBeFile=Export destination must be a file, not a directory.
|
||||
DataTransferMessages.ZipExport_alreadyExists=Target file already exists. Would you like to overwrite it?
|
||||
DataTransferMessages.ZipExport_alreadyExistsError=Export destination already exists and cannot be overwritten.
|
||||
SpagicDeployWizardPage.requiredTalendPerlModules=Required talend modules
|
||||
SpagicDeployWizardPage.requiredTalendPerlModules=Required Talend modules
|
||||
|
||||
@@ -4,9 +4,9 @@ AbstractDataSetTab.logMessage2=Error creating ResultSetTab:
|
||||
AbstractDataSetTab.logMessage1=DataSetTab Exception
|
||||
MultiPageSqlBuilderEditor.DesignerTab.Text=Designer
|
||||
SQLResultsView.Count.Prefix=Number of rows returned:
|
||||
MultiPageSqlBuilderEditor.ErrorInfo=Parse Sql Statement Error:
|
||||
MultiPageSqlBuilderEditor.ErrorInfo=Parse Sql Statement Error:
|
||||
SQLResultsView.NoResults=Execute a query to view the results here...
|
||||
TableNode.logMessage4=Could not create child nodes for
|
||||
TableNode.logMessage4=Could not create child nodes for
|
||||
TableNode.logMessage3=Could not load primary key names
|
||||
GUIModificationQueryAction.ButtonText=Modify the query using graphical editor
|
||||
TableNode.logMessage2=Could not load foreign key names
|
||||
@@ -26,8 +26,8 @@ Images.SqlEditorIcon=icons/edittsk_tsk.gif
|
||||
Open_2=Open
|
||||
Open_1=Open
|
||||
MultiPageSqlBuilderEditor.AddComment.Info=Get the query from the Designer tab?
|
||||
ImageUtil.logMessage3=Could not create image for
|
||||
ImageUtil.logMessage2=Missing image path for
|
||||
ImageUtil.logMessage3=Could not create image for
|
||||
ImageUtil.logMessage2=Missing image path for
|
||||
ImageUtil.logMessage1=Error while disposing images
|
||||
OpenDialogJob.Waitdatabase=Waiting for SqlBuilderDialog to open in built-in mode...
|
||||
DatabaseDetailView.Tab.ColumnPrefix=, col:
|
||||
@@ -35,7 +35,7 @@ SessionTreeNodeUtils.logMessage=Database connection closed
|
||||
SQLEditor.Actions.ChooseSession.ToolTip=Choose Connection
|
||||
DBTreeProvider.logMessage=PersistenceException:
|
||||
DBStructureComposite.exceptionMessage=This repository list should not be empty.
|
||||
IndexFolderNode.logMessage2=Could not create child nodes for
|
||||
IndexFolderNode.logMessage2=Could not create child nodes for
|
||||
IndexFolderNode.logMessage1=Could not load index names
|
||||
Images.PrimaryKeyIcon=icons/pkColumn.gif
|
||||
Progress.Dictionary.Cancelled=Operation cancelled by User
|
||||
@@ -45,10 +45,10 @@ DBTreeProvider.sourceName=Stored Queries
|
||||
DatabaseDetailView.Tab.ExportedKeys=Exported Keys
|
||||
DatabaseDetailView.Tab.RowCount=Row Count
|
||||
AddTablesComposite.textTables=Tables
|
||||
SessionTreeNode.logMessage6=Error while getting the alias name
|
||||
SessionTreeNode.logMessage5=Error while rollbacking
|
||||
SessionTreeNode.logMessage6=Error while getting the alias name
|
||||
SessionTreeNode.logMessage5=Error while rollbacking
|
||||
SessionTreeNode.logMessage4=Could not perform commit/rollback or catalog change.
|
||||
SessionTreeNode.logMessage3=Error while committing
|
||||
SessionTreeNode.logMessage3=Error while committing
|
||||
SessionTreeNode.logMessage2=Error while closing background database connection
|
||||
SessionTreeNode.logMessage1=Error while closing interactive database connection
|
||||
DatabaseDetailView.Tab.ColumnInfo.status=Columns for {0}.
|
||||
@@ -66,7 +66,7 @@ DB2ExplainPlanAction.logMessage1=Get SessionTreeNode failed
|
||||
db2.editor.actions.explain=Show DB2 Explain Plan
|
||||
SQLBuilderRepositoryNodeManager.exceptionMessage=RepositoryNode with folder info should not call this.
|
||||
DatabaseDetailView.Tab.ConnectionInfo=Connection Info
|
||||
CopyTableAction.logMessage=Error exporting to clipboard
|
||||
CopyTableAction.logMessage=Error exporting to clipboard
|
||||
Images.ForeignKeyIcon=icons/fk_rdbcolumn.gif
|
||||
Images.title=icons/sqlbuildertitle.png
|
||||
Images.RefreshIcon=icons/update.gif
|
||||
@@ -106,37 +106,37 @@ DatabaseDetailView.Tab.Unavailable=No detail information available for
|
||||
MultiPageSqlBuilderEditor.NoticeTitle.Text=Note
|
||||
Clear_2=Clear
|
||||
Clear_1=Clear
|
||||
TableFolderNode.logMessage=Could not load child nodes for
|
||||
TableFolderNode.logMessage=Could not load child nodes for
|
||||
SQLEditor.LimitRows.Error=Invalid row limit, value should be between 0 and 5000.
|
||||
Images.ExecSQLIcon=icons/run_exc.gif
|
||||
SQLEditor.Actions.Execute=Execute SQL
|
||||
SQLBuilderDialog.SaveAllQueries.Title=Save all queries
|
||||
ConnectionInfoTab.logMessage99=Error on getting supportsOrderByUnrelated
|
||||
ConnectionInfoTab.logMessage98=Error on getting supportsExpressionsInOrderBy
|
||||
ConnectionInfoTab.logMessage97=Error on getting supportsDifferentTableCorrelationNames
|
||||
ConnectionInfoTab.logMessage96=Error on getting supportsTableCorrelationNames
|
||||
ConnectionInfoTab.logMessage95=Error on getting supportsConvert
|
||||
ConnectionInfoTab.logMessage99=Error on getting supportsOrderByUnrelated
|
||||
ConnectionInfoTab.logMessage98=Error on getting supportsExpressionsInOrderBy
|
||||
ConnectionInfoTab.logMessage97=Error on getting supportsDifferentTableCorrelationNames
|
||||
ConnectionInfoTab.logMessage96=Error on getting supportsTableCorrelationNames
|
||||
ConnectionInfoTab.logMessage95=Error on getting supportsConvert
|
||||
Images.TableIcon=icons/table.gif
|
||||
ConnectionInfoTab.logMessage94=Error on getting nullPlusNonNullIsNull
|
||||
ConnectionInfoTab.logMessage94=Error on getting nullPlusNonNullIsNull
|
||||
Preferences=Preferences
|
||||
ConnectionInfoTab.logMessage93=Error on getting supportsColumnAliasing
|
||||
ConnectionInfoTab.logMessage93=Error on getting supportsColumnAliasing
|
||||
OpenSQLBuilderDialogProgress.exceptionMessage=Opening of SqlBuilderDialog cancelled
|
||||
ConnectionInfoTab.logMessage92=Error on getting supportsAlterTableWithDropColumn
|
||||
ConnectionInfoTab.logMessage91=Error on getting supportsAlterTableWithAddColumn
|
||||
ConnectionInfoTab.logMessage90=Error on getExtraNameCharacters
|
||||
ConnectionInfoTab.logMessage92=Error on getting supportsAlterTableWithDropColumn
|
||||
ConnectionInfoTab.logMessage91=Error on getting supportsAlterTableWithAddColumn
|
||||
ConnectionInfoTab.logMessage90=Error on getExtraNameCharacters
|
||||
Images.ExportIcon=icons/ExportData.gif
|
||||
DatabaseDetailView.Tab.ConnectionInfo.NullsSortedHigh=Nulls Are Sorted High
|
||||
DataSetTableActionGroup.logMessage1=Could not create menu action
|
||||
ConnectionInfoTab.logMessage89=Error on getSearchStringEscape
|
||||
ConnectionInfoTab.logMessage88=Error on getIdentifierQuoteString
|
||||
ConnectionInfoTab.logMessage87=Error on getting storesMixedCaseQuotedIdentifiers
|
||||
ConnectionInfoTab.logMessage86=Error on getting storesLowerCaseQuotedIdentifiers
|
||||
ConnectionInfoTab.logMessage85=Error on getting storesUpperCaseQuotedIdentifiers
|
||||
ConnectionInfoTab.logMessage84=Error on getting supportsMixedCaseQuotedIdentifiers
|
||||
ConnectionInfoTab.logMessage83=Error on getting storesMixedCaseIdentifiers
|
||||
ConnectionInfoTab.logMessage82=Error on getCatalogSeparator
|
||||
ConnectionInfoTab.logMessage81=Error on getting isCatalogAtStart
|
||||
ConnectionInfoTab.logMessage80=Error on getCatalogTerm
|
||||
ConnectionInfoTab.logMessage89=Error on getSearchStringEscape
|
||||
ConnectionInfoTab.logMessage88=Error on getIdentifierQuoteString
|
||||
ConnectionInfoTab.logMessage87=Error on getting storesMixedCaseQuotedIdentifiers
|
||||
ConnectionInfoTab.logMessage86=Error on getting storesLowerCaseQuotedIdentifiers
|
||||
ConnectionInfoTab.logMessage85=Error on getting storesUpperCaseQuotedIdentifiers
|
||||
ConnectionInfoTab.logMessage84=Error on getting supportsMixedCaseQuotedIdentifiers
|
||||
ConnectionInfoTab.logMessage83=Error on getting storesMixedCaseIdentifiers
|
||||
ConnectionInfoTab.logMessage82=Error on getCatalogSeparator
|
||||
ConnectionInfoTab.logMessage81=Error on getting isCatalogAtStart
|
||||
ConnectionInfoTab.logMessage80=Error on getCatalogTerm
|
||||
OpenFileAction.logTextErrorLoadingDoc=Error while loading document
|
||||
ConnectionInfoTab.property108=Stores Lower Case Identifiers
|
||||
ConnectionInfoTab.property107=Stores Upper Case Identifiers
|
||||
@@ -150,30 +150,30 @@ ConnectionInfoTab.property102=Supports Group By Beyond Select
|
||||
ConnectionInfoTab.property101=Supports Group By Unrelated
|
||||
ConnectionInfoTab.property100=Supports Group By
|
||||
SQLEditor.Actions.SaveSQL=Save as
|
||||
ConnectionInfoTab.logMessage79=Error on getProcedureTerm
|
||||
ConnectionInfoTab.logMessage78=Error on getSchemaTerm
|
||||
ConnectionInfoTab.logMessage77=Error on getting supportsLimitedOuterJoins
|
||||
ConnectionInfoTab.logMessage76=Error on getting supportsFullOuterJoins
|
||||
ConnectionInfoTab.logMessage75=Error on getting supportsOuterJoins
|
||||
ConnectionInfoTab.logMessage74=Error on getting supportsIntegrityEnhancementFacility
|
||||
ConnectionInfoTab.logMessage73=Error on getting supportsANSI92FullSQL
|
||||
ConnectionInfoTab.logMessage72=Error on getting supportsANSI92IntermediateSQL
|
||||
ConnectionInfoTab.logMessage71=Error on getting supportsANSI92EntryLevelSQL
|
||||
ConnectionInfoTab.logMessage70=Error on getting supportsExtendedSQLGrammar
|
||||
ConnectionInfoTab.logMessage79=Error on getProcedureTerm
|
||||
ConnectionInfoTab.logMessage78=Error on getSchemaTerm
|
||||
ConnectionInfoTab.logMessage77=Error on getting supportsLimitedOuterJoins
|
||||
ConnectionInfoTab.logMessage76=Error on getting supportsFullOuterJoins
|
||||
ConnectionInfoTab.logMessage75=Error on getting supportsOuterJoins
|
||||
ConnectionInfoTab.logMessage74=Error on getting supportsIntegrityEnhancementFacility
|
||||
ConnectionInfoTab.logMessage73=Error on getting supportsANSI92FullSQL
|
||||
ConnectionInfoTab.logMessage72=Error on getting supportsANSI92IntermediateSQL
|
||||
ConnectionInfoTab.logMessage71=Error on getting supportsANSI92EntryLevelSQL
|
||||
ConnectionInfoTab.logMessage70=Error on getting supportsExtendedSQLGrammar
|
||||
GUIModificationQueryAction.Error.Notice=Note
|
||||
DatabaseDetailView.Tab.ConnectionInfo.AutocommitMode=Autocommit Mode
|
||||
IndexNode.logMessage=Could not load column names
|
||||
ConnectionInfoTab.logMessage69=Error on getting supportsCoreSQLGrammar
|
||||
ConnectionInfoTab.logMessage69=Error on getting supportsCoreSQLGrammar
|
||||
SQLResultsView.Error.Title=Error while executing SQL
|
||||
ConnectionInfoTab.logMessage68=Error on getting supportsMinimumSQLGrammar
|
||||
ConnectionInfoTab.logMessage67=Error on getting supportsNonNullableColumns
|
||||
ConnectionInfoTab.logMessage66=Error on getting supportsMultipleTransactions
|
||||
ConnectionInfoTab.logMessage65=Error on getting supportsMultipleOpenResults
|
||||
ConnectionInfoTab.logMessage64=Error on getting supportsMultipleResultSets
|
||||
ConnectionInfoTab.logMessage63=Error on getting supportsLikeEscapeClause
|
||||
ConnectionInfoTab.logMessage62=Error on getting supportsUnionAll
|
||||
ConnectionInfoTab.logMessage61=Error on getting supportsUnion
|
||||
ConnectionInfoTab.logMessage60=Error on getting supportsCorrelatedSubqueries
|
||||
ConnectionInfoTab.logMessage68=Error on getting supportsMinimumSQLGrammar
|
||||
ConnectionInfoTab.logMessage67=Error on getting supportsNonNullableColumns
|
||||
ConnectionInfoTab.logMessage66=Error on getting supportsMultipleTransactions
|
||||
ConnectionInfoTab.logMessage65=Error on getting supportsMultipleOpenResults
|
||||
ConnectionInfoTab.logMessage64=Error on getting supportsMultipleResultSets
|
||||
ConnectionInfoTab.logMessage63=Error on getting supportsLikeEscapeClause
|
||||
ConnectionInfoTab.logMessage62=Error on getting supportsUnionAll
|
||||
ConnectionInfoTab.logMessage61=Error on getting supportsUnion
|
||||
ConnectionInfoTab.logMessage60=Error on getting supportsCorrelatedSubqueries
|
||||
MetadataRefreshAction.textSynchronize=Synchronize
|
||||
DatabaseDetailView.Tab.ConnectionInfo.UserName=User Name
|
||||
DB2ExplainPlanExecution.tableColumnText2=Cardinality
|
||||
@@ -183,84 +183,84 @@ Images.CopyIcon=icons/copy_edit.gif
|
||||
DBStructureComposite.TakeALongTime=It'll take a long time. Continue?
|
||||
Images.IndexIcon=icons/index.gif
|
||||
AbstractSQLExecution.Executing.Error=Error Executing SQL
|
||||
ConnectionInfoTab.logMessage59=Error on getting supportsSubqueriesInQuantifieds
|
||||
ConnectionInfoTab.logMessage58=Error on getting supportsSubqueriesInIns
|
||||
ConnectionInfoTab.logMessage57=Error on getting supportsSubqueriesInExists
|
||||
ConnectionInfoTab.logMessage56=Error on getting supportsSubqueriesInComparisons
|
||||
ConnectionInfoTab.logMessage59=Error on getting supportsSubqueriesInQuantifieds
|
||||
ConnectionInfoTab.logMessage58=Error on getting supportsSubqueriesInIns
|
||||
ConnectionInfoTab.logMessage57=Error on getting supportsSubqueriesInExists
|
||||
ConnectionInfoTab.logMessage56=Error on getting supportsSubqueriesInComparisons
|
||||
DatabaseDetailView.Tab.RowPrefix=row:
|
||||
ConnectionInfoTab.logMessage55=Error on getting supportsStoredProcedures
|
||||
ConnectionInfoTab.logMessage54=Error on getting supportsPositionedUpdate
|
||||
ConnectionInfoTab.logMessage53=Error on getting supportsPositionedDelete
|
||||
ConnectionInfoTab.logMessage52=Error on getting supportsCatalogsInPrivilegeDefinitions
|
||||
ConnectionInfoTab.logMessage51=Error on getting supportsCatalogsInIndexDefinitions
|
||||
ConnectionInfoTab.logMessage50=Error on getting supportsCatalogsInTableDefinitions
|
||||
ConnectionInfoTab.logMessage55=Error on getting supportsStoredProcedures
|
||||
ConnectionInfoTab.logMessage54=Error on getting supportsPositionedUpdate
|
||||
ConnectionInfoTab.logMessage53=Error on getting supportsPositionedDelete
|
||||
ConnectionInfoTab.logMessage52=Error on getting supportsCatalogsInPrivilegeDefinitions
|
||||
ConnectionInfoTab.logMessage51=Error on getting supportsCatalogsInIndexDefinitions
|
||||
ConnectionInfoTab.logMessage50=Error on getting supportsCatalogsInTableDefinitions
|
||||
DataSetTable.PopUp.Find=Scroll To Column: (ENTER: find next)
|
||||
SqlBuilderPreferencePage.AddQuotes=add quotes, when you generate sql statement
|
||||
ConnectionInfoTab.LogMessage25=Error on getting supportsOpenStatementsAcrossCommit
|
||||
ConnectionInfoTab.LogMessage25=Error on getting supportsOpenStatementsAcrossCommit
|
||||
ConnectionInfoTab.property9=Supports Data Manipulation Transactions Only
|
||||
ConnectionInfoTab.property8=Supports Data Definition and Data Manipulation Transactions
|
||||
ConnectionInfoTab.property7=Supports Transactions
|
||||
ConnectionInfoTab.property6=Default Transaction Isolation
|
||||
ConnectionInfoTab.property5=Max User Name Length
|
||||
ConnectionInfoTab.logMessage49=Error on getting supportsCatalogsInProcedureCalls
|
||||
ConnectionInfoTab.logMessage49=Error on getting supportsCatalogsInProcedureCalls
|
||||
ConnectionInfoTab.property4=Max Tables In Select
|
||||
ConnectionInfoTab.logMessage48=Error on getting supportsCatalogsInDataManipulation
|
||||
ConnectionInfoTab.logMessage48=Error on getting supportsCatalogsInDataManipulation
|
||||
ConnectionInfoTab.property3=Max Table Name Length
|
||||
ConnectionInfoTab.logMessage47=Error on getting supportsSchemasInPrivilegeDefinitions
|
||||
ConnectionInfoTab.logMessage47=Error on getting supportsSchemasInPrivilegeDefinitions
|
||||
ConnectionInfoTab.property2=Max Statements
|
||||
ConnectionInfoTab.logMessage46=Error on getting supportsSchemasInIndexDefinitions
|
||||
ConnectionInfoTab.logMessage46=Error on getting supportsSchemasInIndexDefinitions
|
||||
ConnectionInfoTab.property1=Max Statement Length
|
||||
ConnectionInfoTab.logMessage45=Error on getting supportsSchemasInTableDefinitions
|
||||
ConnectionInfoTab.logMessage44=Error on getting supportsSchemasInProcedureCalls
|
||||
ConnectionInfoTab.logMessage43=Error on getting supportsSchemasInDataManipulation
|
||||
ConnectionInfoTab.logMessage42=Error on getting doesMaxRowSizeIncludeBlobs
|
||||
CopyCellAction.logMessage=Error exporting cell to clipboard
|
||||
ConnectionInfoTab.logMessage41=Error on getMaxRowSize
|
||||
ConnectionInfoTab.logMessage40=Error on getMaxCatalogNameLength
|
||||
ConnectionInfoTab.logMessage45=Error on getting supportsSchemasInTableDefinitions
|
||||
ConnectionInfoTab.logMessage44=Error on getting supportsSchemasInProcedureCalls
|
||||
ConnectionInfoTab.logMessage43=Error on getting supportsSchemasInDataManipulation
|
||||
ConnectionInfoTab.logMessage42=Error on getting doesMaxRowSizeIncludeBlobs
|
||||
CopyCellAction.logMessage=Error exporting cell to clipboard
|
||||
ConnectionInfoTab.logMessage41=Error on getMaxRowSize
|
||||
ConnectionInfoTab.logMessage40=Error on getMaxCatalogNameLength
|
||||
Images.DefaultNodeImage=icons/app_obj.gif
|
||||
SqlBuilderPreferencePage.ActivedTimeoutSetting=Activate the timeout for database connection.
|
||||
DatabaseDetailView.Tab.RowCount.status=Row Count for {0}.
|
||||
SQLResultsView.Time.Postfix=ms.
|
||||
ConnectionInfoTab.logMessage39=Error on getMaxProcedureNameLength
|
||||
ConnectionInfoTab.logMessage38=Error on getMaxSchemaNameLength
|
||||
ConnectionInfoTab.logMessage39=Error on getMaxProcedureNameLength
|
||||
ConnectionInfoTab.logMessage38=Error on getMaxSchemaNameLength
|
||||
UnsignedWordRule.logMessage=Error while getting column names
|
||||
ConnectionInfoTab.logMessage37=Error on getMaxIndexLength
|
||||
ConnectionInfoTab.logMessage36=Error on getMaxCursorNameLength
|
||||
ConnectionInfoTab.logMessage35=Error on getMaxConnections
|
||||
ConnectionInfoTab.logMessage34=Error on getMaxColumnsInTable
|
||||
ConnectionInfoTab.logMessage37=Error on getMaxIndexLength
|
||||
ConnectionInfoTab.logMessage36=Error on getMaxCursorNameLength
|
||||
ConnectionInfoTab.logMessage35=Error on getMaxConnections
|
||||
ConnectionInfoTab.logMessage34=Error on getMaxColumnsInTable
|
||||
Images.OpenFolder=icons/openFolder.gif
|
||||
ConnectionInfoTab.logMessage33=Error on getMaxColumnsInSelect
|
||||
ConnectionInfoTab.logMessage32=Error on getMaxColumnsInOrderBy
|
||||
ConnectionInfoTab.logMessage31=Error on getMaxColumnsInIndex
|
||||
ConnectionInfoTab.logMessage30=Error on getMaxColumnsInGroupBy
|
||||
ConnectionInfoTab.logMessage33=Error on getMaxColumnsInSelect
|
||||
ConnectionInfoTab.logMessage32=Error on getMaxColumnsInOrderBy
|
||||
ConnectionInfoTab.logMessage31=Error on getMaxColumnsInIndex
|
||||
ConnectionInfoTab.logMessage30=Error on getMaxColumnsInGroupBy
|
||||
DatabaseDetailView.Tab.ConnectionInfo.NullsSortedLow=Nulls Are Sorted Low
|
||||
ErDiagramDialog.textGenerateSelectStatement=Generate Select Statement
|
||||
Images.RedIcon=icons/red.gif
|
||||
MultiPageSqlBuilderEditor.EditTab.Text=Edit
|
||||
ConnectionInfoTab.logMessage29=Error on getMaxColumnNameLength
|
||||
ConnectionInfoTab.logMessage28=Error on getMaxCharLiteralLength
|
||||
ConnectionInfoTab.logMessage27=Error on getMaxBinaryLiteralLength
|
||||
ConnectionInfoTab.logMessage26=Error on getting supportsOpenStatementsAcrossRollback
|
||||
ConnectionInfoTab.logMessage24=Error on getting supportsOpenCursorsAcrossRollback
|
||||
ConnectionInfoTab.logMessage23=Error on getting supportsOpenCursorsAcrossCommit
|
||||
ConnectionInfoTab.logMessage22=Error on getting isReadOnly
|
||||
ConnectionInfoTab.logMessage21=Error on getting supportsStatementPooling
|
||||
ConnectionInfoTab.logMessage20=Error on getting locatorsUpdateCopy
|
||||
CopyColumnNameAction.logMessage=Error exporting cell to clipboard
|
||||
ConnectionInfoTab.logMessage29=Error on getMaxColumnNameLength
|
||||
ConnectionInfoTab.logMessage28=Error on getMaxCharLiteralLength
|
||||
ConnectionInfoTab.logMessage27=Error on getMaxBinaryLiteralLength
|
||||
ConnectionInfoTab.logMessage26=Error on getting supportsOpenStatementsAcrossRollback
|
||||
ConnectionInfoTab.logMessage24=Error on getting supportsOpenCursorsAcrossRollback
|
||||
ConnectionInfoTab.logMessage23=Error on getting supportsOpenCursorsAcrossCommit
|
||||
ConnectionInfoTab.logMessage22=Error on getting isReadOnly
|
||||
ConnectionInfoTab.logMessage21=Error on getting supportsStatementPooling
|
||||
ConnectionInfoTab.logMessage20=Error on getting locatorsUpdateCopy
|
||||
CopyColumnNameAction.logMessage=Error exporting cell to clipboard
|
||||
DatabaseNode.logMessage=Error loading children
|
||||
Images.OpenFileIcon=icons/open.gif
|
||||
AbstractNode.logMessage=Could not load child nodes for {0}.
|
||||
EMFRepositoryNodeManager.Notice.title3=Note
|
||||
ConnectionInfoTab.logMessage19=Error on getSQLStateType
|
||||
ConnectionInfoTab.logMessage18=Error on getJDBCMajorVersion
|
||||
ConnectionInfoTab.logMessage17=Error on getJDBCMinorVersion
|
||||
ConnectionInfoTab.logMessage16=Error on getDatabaseMinorVersion
|
||||
ConnectionInfoTab.logMessage15=Error on getDatabaseMajorVersion
|
||||
ConnectionInfoTab.logMessage14=Error on getting supportsGetGeneratedKeys
|
||||
ConnectionInfoTab.logMessage13=Error on getting supportsNamedParameters
|
||||
ConnectionInfoTab.logMessage12=Error on getting supportsSavepoints
|
||||
ConnectionInfoTab.logMessage11=Error on getting supportsBatchUpdates
|
||||
ConnectionInfoTab.logMessage10=Error on getting dataDefinitionIgnoredInTransactions
|
||||
ConnectionInfoTab.logMessage19=Error on getSQLStateType
|
||||
ConnectionInfoTab.logMessage18=Error on getJDBCMajorVersion
|
||||
ConnectionInfoTab.logMessage17=Error on getJDBCMinorVersion
|
||||
ConnectionInfoTab.logMessage16=Error on getDatabaseMinorVersion
|
||||
ConnectionInfoTab.logMessage15=Error on getDatabaseMajorVersion
|
||||
ConnectionInfoTab.logMessage14=Error on getting supportsGetGeneratedKeys
|
||||
ConnectionInfoTab.logMessage13=Error on getting supportsNamedParameters
|
||||
ConnectionInfoTab.logMessage12=Error on getting supportsSavepoints
|
||||
ConnectionInfoTab.logMessage11=Error on getting supportsBatchUpdates
|
||||
ConnectionInfoTab.logMessage10=Error on getting dataDefinitionIgnoredInTransactions
|
||||
SQLEditor.Actions.SaveAs=Export as
|
||||
SqlBuilderPreferencePage.SystemSQL=System SQL Statement
|
||||
Images.GrayIcon=icons/gray.gif
|
||||
@@ -285,7 +285,7 @@ SQLEditor.Actions.DuplicateNameMessage=Item with the same name already exists.
|
||||
Images.ExportToClipBoardIcon=icons/copy_edit.gif
|
||||
DatabaseDetailView.Tab.ImportedKeys.status=Imported Keys for
|
||||
DataSetTableKeyListener.logMessage2=Error refreshing
|
||||
DataSetTableKeyListener.logMessage1=Error exporting cell to clipboard
|
||||
DataSetTableKeyListener.logMessage1=Error exporting cell to clipboard
|
||||
SQLEditor.Actions.SaveMessage=Save
|
||||
Images.Explain=icons/explain.gif
|
||||
AbstractSQLSourceTab.logMessage2=Error closing statement
|
||||
@@ -314,8 +314,8 @@ ConnectionInfoTab.property83=Stores Mixed Case Identifiers
|
||||
ConnectionInfoTab.property82=Catalog Separator
|
||||
ConnectionInfoTab.property81=Is Catalog at Start
|
||||
ConnectionInfoTab.property80=Catalog Term
|
||||
SortedList.exceptionMessage=Index is greater than size or below zero for remove
|
||||
ColumnFolderNode.logMessage=Could not create child nodes for
|
||||
SortedList.exceptionMessage=Index is greater than size or below zero for remove
|
||||
ColumnFolderNode.logMessage=Could not create child nodes for
|
||||
ConnectionInfoTab.property79=Procedure Term
|
||||
SqlBuilderPreferencePage.ConnectionTimeout=Connection timeout (seconds)
|
||||
ConnectionInfoTab.property78=Schema Term
|
||||
@@ -337,7 +337,7 @@ ConnectionInfoTab.property68=Supports Minimum SQL Grammar
|
||||
ConnectionInfoTab.property67=Supports Non Nullable Columns
|
||||
ConnectionInfoTab.property66=Supports Multiple Transactions
|
||||
SQLBuilderEditorComposite.assertMessage=This node cannot be null
|
||||
ConnectionInfoTab.property65=Supports Multiple Open Results
|
||||
ConnectionInfoTab.property65=Supports Multiple Open Results
|
||||
ConnectionInfoTab.property64=Supports Multiple Result Sets
|
||||
ConnectionInfoTab.property63=Supports Like Escape Clause
|
||||
ConnectionInfoTab.property62=Supports Union All
|
||||
@@ -348,7 +348,7 @@ ConnectionInfoTab.property60=Supports Correlated Subqueries
|
||||
DBStructureComposite.Property=Property
|
||||
Images.DefaultParentNodeIcon=icons/outline.gif
|
||||
SQLEditor.SaveAsDialog.Title=Export query as
|
||||
DataSetTable.invalidExcepitonMessage=Invalid columnLabel or columnTypes in DataSet
|
||||
DataSetTable.invalidExcepitonMessage=Invalid columnLabel or columnTypes in DataSet
|
||||
DataSetTable.Actions.Export.XLS=Export to .xls
|
||||
DataSetTable.Actions.Export.CSV=Export to .csv
|
||||
ConnectionInfoTab.property59=Supports Subqueries in Quantified Expressions
|
||||
@@ -381,7 +381,7 @@ ConnectionInfoTab.property40=Max Catalog Name Length
|
||||
oracle.editor.actions.explain.notFound.Title=Plan Table not found
|
||||
Images.ConnectionIcon=icons/connection.png
|
||||
DatabaseDetailView.Tab.ImportedKeys=Imported Keys
|
||||
SchemaNode.logMessage4=Could not load child nodes for
|
||||
SchemaNode.logMessage4=Could not load child nodes for
|
||||
SchemaNode.logMessage3=Loading all tables at once is not supported
|
||||
SchemaNode.logMessage2=Could not create child node
|
||||
SchemaNode.logMessage1=Could not create child node
|
||||
@@ -399,17 +399,17 @@ ConnectionInfoTab.property31=Max Columns In Index
|
||||
ConnectionInfoTab.property30=Max Columns In Group By
|
||||
SQLEditor.Actions.SaveAsToolTip=Export query as
|
||||
DataSetTable.Actions.CopyCell=Copy Cell
|
||||
ConnectionInfoTab.logMessage9=Error on getting dataDefinitionCausesTransactionCommit
|
||||
ConnectionInfoTab.logMessage8=Error on getting supportsDataManipulationTransactionsOnly
|
||||
ConnectionInfoTab.logMessage7=Error on getting supportsDataDefinitionAndDataManipulationTransactions
|
||||
ConnectionInfoTab.logMessage6=Error on getting supportsTransactions
|
||||
ConnectionInfoTab.logMessage5=Error on getMaxUserNameLength
|
||||
ConnectionInfoTab.logMessage9=Error on getting dataDefinitionCausesTransactionCommit
|
||||
ConnectionInfoTab.logMessage8=Error on getting supportsDataManipulationTransactionsOnly
|
||||
ConnectionInfoTab.logMessage7=Error on getting supportsDataDefinitionAndDataManipulationTransactions
|
||||
ConnectionInfoTab.logMessage6=Error on getting supportsTransactions
|
||||
ConnectionInfoTab.logMessage5=Error on getMaxUserNameLength
|
||||
TableNode.exceptionMessage=Only Table will call this.
|
||||
ConnectionInfoTab.logMessage4=Error on getMaxTablesInSelect
|
||||
ConnectionInfoTab.logMessage3=Error on getMaxTableNameLength
|
||||
ConnectionInfoTab.logMessage2=Error on getMaxStatements
|
||||
ConnectionInfoTab.logMessage1=Error on getMaxStatementLength
|
||||
DictionaryLoader.teseedOk=tested ok
|
||||
ConnectionInfoTab.logMessage4=Error on getMaxTablesInSelect
|
||||
ConnectionInfoTab.logMessage3=Error on getMaxTableNameLength
|
||||
ConnectionInfoTab.logMessage2=Error on getMaxStatements
|
||||
ConnectionInfoTab.logMessage1=Error on getMaxStatementLength
|
||||
DictionaryLoader.teseedOk=tested ok
|
||||
ConnectionInfoTab.property29=Max Column Name Length
|
||||
ConnectionInfoTab.property28=Max Char Literal Length
|
||||
ConnectionInfoTab.property27=Max Binary Literal Length
|
||||
@@ -469,7 +469,7 @@ Images.CatalogNodeIcon=icons/schema.gif
|
||||
db2.editor.actions.explain.notFound.Title=Plan Table not found
|
||||
DatabaseDetailView.Tab.ConnectionInfo.DriverName=Driver Name
|
||||
DatabaseDetailView.Tab.ConnectionInfo.NullsSortedEnd=Nulls Are Sorted At End
|
||||
CloseSQLResultTabAction.logMessageMissingImagePath=Missing image path for
|
||||
CloseSQLResultTabAction.logMessageMissingImagePath=Missing image path for
|
||||
DatabaseDetailView.Tab.ConnectionInfo.URL=URL
|
||||
DatabaseDetailView.Tab.ConnectionInfo.ProceduresCallable=All Procedures Are Callable
|
||||
OracleExplainPlanAction.logMessage5=Error while creating sql execution tab
|
||||
@@ -478,43 +478,43 @@ oracle.editor.actions.explain=Show Oracle Explain Plan
|
||||
OracleExplainPlanAction.logMessage3=Error while closing statement
|
||||
EMFRepositoryNodeManager.Notice.info=You must input one Sql Statement!
|
||||
OracleExplainPlanAction.logMessage2=Error while creating the plan table
|
||||
OracleExplainPlanAction.logMessage1=Failed to get SessionTreeNode
|
||||
OracleExplainPlanAction.logMessage1=Failed to get SessionTreeNode
|
||||
Images.ColumnNodeIcon=icons/columns.gif
|
||||
SQLBuilderDialog.SaveAllQueries.Info=Are you sure you want to save all queries?
|
||||
SQLResultsView.Executing=Executing...
|
||||
DBTreeActionGroup.logMessage=Could not create menu action
|
||||
ConnectionInfoTab.logMessage123=Error on getting storesLowerCaseIdentifiers
|
||||
ConnectionInfoTab.logMessage122=Error on getting storesUpperCaseIdentifiers
|
||||
ConnectionInfoTab.logMessage121=Error on getting supportsMixedCaseIdentifiers
|
||||
ConnectionInfoTab.logMessage120=Error on getting usesLocalFilePerTable
|
||||
ConnectionInfoTab.logMessage123=Error on getting storesLowerCaseIdentifiers
|
||||
ConnectionInfoTab.logMessage122=Error on getting storesUpperCaseIdentifiers
|
||||
ConnectionInfoTab.logMessage121=Error on getting supportsMixedCaseIdentifiers
|
||||
ConnectionInfoTab.logMessage120=Error on getting usesLocalFilePerTable
|
||||
SQLEditor.SQLPropertyDialog.Name=Name
|
||||
SqlBuilderPreferencePage.StandardSQL=Standard SQL Statement
|
||||
SQLEditor.LimitRows.ConfirmNoLimit.Message=Allowing a large number of rows may result in poor performance. Continue?
|
||||
ConnectionInfoTab.logMessage119=Error on getting usesLocalFiles
|
||||
ConnectionInfoTab.logMessage118=Error on getResultSetHoldability
|
||||
ConnectionInfoTab.logMessage119=Error on getting usesLocalFiles
|
||||
ConnectionInfoTab.logMessage118=Error on getResultSetHoldability
|
||||
DBStructureComposite.Repository=Repository
|
||||
ConnectionInfoTab.logMessage117=Error on getting nullsAreSortedAtEnd
|
||||
ConnectionInfoTab.logMessage116=Error on getting nullsAreSortedAtStart
|
||||
ConnectionInfoTab.logMessage116=Error on getting nullsAreSortedAtStart
|
||||
ConnectionInfoTab.logMessage115=Error on getting nullsAreSortedLow
|
||||
ConnectionInfoTab.logMessage114=Error on getting nullsAreSortedHigh
|
||||
ConnectionInfoTab.logMessage114=Error on getting nullsAreSortedHigh
|
||||
Images.DefaultNodeIcon=icons/defaultview_misc.gif
|
||||
ConnectionInfoTab.logMessage113=Error on getting allTablesAreSelectable
|
||||
ConnectionInfoTab.logMessage112=Error on getting allProceduresAreCallable
|
||||
ConnectionInfoTab.logMessage111=Error on getCommitOnClose
|
||||
ConnectionInfoTab.logMessage110=Error on getAutoCommit
|
||||
ConnectionInfoTab.logMessage113=Error on getting allTablesAreSelectable
|
||||
ConnectionInfoTab.logMessage112=Error on getting allProceduresAreCallable
|
||||
ConnectionInfoTab.logMessage111=Error on getCommitOnClose
|
||||
ConnectionInfoTab.logMessage110=Error on getAutoCommit
|
||||
DatabaseDetailView.Tab.Source=Source
|
||||
RefreshTable.Refresh_1=Refresh Table
|
||||
ConnectionInfoTab.logMessage109=Error on getURL
|
||||
ConnectionInfoTab.logMessage108=Error on getUserName
|
||||
ConnectionInfoTab.logMessage107=Error on getDriverVersion
|
||||
ConnectionInfoTab.logMessage106=Error on getDriverName
|
||||
ConnectionInfoTab.logMessage105=Error on getDriverMinorVersion
|
||||
ConnectionInfoTab.logMessage104=Error on getDriverMajorVersion
|
||||
ConnectionInfoTab.logMessage103=Error on getDatabaseProductName
|
||||
ConnectionInfoTab.logMessage109=Error on getURL
|
||||
ConnectionInfoTab.logMessage108=Error on getUserName
|
||||
ConnectionInfoTab.logMessage107=Error on getDriverVersion
|
||||
ConnectionInfoTab.logMessage106=Error on getDriverName
|
||||
ConnectionInfoTab.logMessage105=Error on getDriverMinorVersion
|
||||
ConnectionInfoTab.logMessage104=Error on getDriverMajorVersion
|
||||
ConnectionInfoTab.logMessage103=Error on getDatabaseProductName
|
||||
Progress.Dictionary.Title=Loading content assistant
|
||||
ConnectionInfoTab.logMessage102=Error on getting supportsGroupByBeyondSelect
|
||||
ConnectionInfoTab.logMessage101=Error on getting supportsGroupByUnrelated
|
||||
ConnectionInfoTab.logMessage100=Error on getting supportsGroupBy
|
||||
ConnectionInfoTab.logMessage102=Error on getting supportsGroupByBeyondSelect
|
||||
ConnectionInfoTab.logMessage101=Error on getting supportsGroupByUnrelated
|
||||
ConnectionInfoTab.logMessage100=Error on getting supportsGroupBy
|
||||
Image.sqlAliasIcon=icons/sql_alias.gif
|
||||
DBStructureComposite.DatabaseStructure=Database Structure
|
||||
OracleExplainPlanExecution.tableColumnText2=Cardinality
|
||||
|
||||
@@ -91,10 +91,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 +125,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) {
|
||||
|
||||
@@ -197,10 +197,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 +233,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 +260,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 +296,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();
|
||||
|
||||
@@ -435,7 +435,7 @@
|
||||
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()%>");
|
||||
|
||||
@@ -649,15 +649,13 @@
|
||||
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 is in order to keep the original context value
|
||||
if(context != null && context.isEmpty()) {
|
||||
defaultProps.load(inContext);
|
||||
context = new ContextProperties(defaultProps);
|
||||
}
|
||||
} finally {
|
||||
inContext.close();
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
@@ -60,10 +60,6 @@ if ((metadatas != null) && (metadatas.size() > 0)) { // metadata
|
||||
|
||||
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);
|
||||
%>
|
||||
@@ -244,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;
|
||||
@@ -270,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);
|
||||
@@ -290,119 +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 %>++;
|
||||
|
||||
<%if(hasDataOutput) {%>
|
||||
if (multi_output_is_allowed_<%=cid%>) {
|
||||
<%if(main!=null){%>
|
||||
<%=main.getName()%> = null;
|
||||
<%}%>
|
||||
|
||||
<%if(reject!=null){%>
|
||||
<%=reject.getName()%> = null;
|
||||
<%}%>
|
||||
}
|
||||
<%}%>
|
||||
for (; available_<%=cid%>; available_<%=cid%> = reader_<%=cid%>.advance()) {
|
||||
nb_line_<%=cid %>++;
|
||||
|
||||
try {
|
||||
Object data_<%=cid%> = reader_<%=cid%>.getCurrent();
|
||||
<%
|
||||
if (main != null) {
|
||||
%>
|
||||
|
||||
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");
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
//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());
|
||||
|
||||
//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
|
||||
<%if(hasDataOutput) {%>
|
||||
if (multi_output_is_allowed_<%=cid%>) {
|
||||
<%if(main!=null){%>
|
||||
<%=main.getName()%> = null;
|
||||
<%}%>
|
||||
|
||||
<%if(reject!=null){%>
|
||||
<%=reject.getName()%> = null;
|
||||
<%}%>
|
||||
}
|
||||
<%}%>
|
||||
|
||||
try {
|
||||
Object data_<%=cid%> = reader_<%=cid%>.getCurrent();
|
||||
<%
|
||||
if (main != null) {
|
||||
%>
|
||||
|
||||
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");
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
//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());
|
||||
|
||||
//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();
|
||||
writeOperation_<%=cid%>.initialize(container_<%=cid%>);
|
||||
writer_<%=cid%> = writeOperation_<%=cid%>.createWriter(container_<%=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")) {
|
||||
@@ -411,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){
|
||||
@@ -447,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(
|
||||
@@ -128,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));
|
||||
}
|
||||
<%
|
||||
}
|
||||
@@ -181,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__"));
|
||||
@@ -198,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){
|
||||
|
||||
@@ -437,20 +437,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")) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -55,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;
|
||||
@@ -206,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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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.1</version>
|
||||
<version>2.0.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>talend-copy</name>
|
||||
|
||||
@@ -15,10 +15,7 @@ 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;
|
||||
|
||||
/**
|
||||
* DOC Administrator class global comment. Detailled comment
|
||||
@@ -38,17 +35,14 @@ public class FileCopy {
|
||||
* @throws IOException : if IO pb.
|
||||
*/
|
||||
public static void copyFile(String srcFileName, String desFileName, boolean delSrc) throws IOException {
|
||||
final Path source = Paths.get(srcFileName);
|
||||
final Path destination = Paths.get(desFileName);
|
||||
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.
|
||||
FileTime lastModifiedTime = Files.getLastModifiedTime(source);
|
||||
Files.move(source, destination, StandardCopyOption.REPLACE_EXISTING);
|
||||
Files.setLastModifiedTime(destination,lastModifiedTime);
|
||||
Files.move(source.toPath(), destination.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
} else {
|
||||
Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
|
||||
Files.setLastModifiedTime(destination,Files.getLastModifiedTime(source));
|
||||
Files.copy(source.toPath(), destination.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -100,24 +100,6 @@ class FileCopyTest {
|
||||
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.
|
||||
*
|
||||
|
||||
@@ -3,13 +3,14 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.talend.components</groupId>
|
||||
<artifactId>components-soap</artifactId>
|
||||
<version>2.3-20200918</version>
|
||||
<version>2.2-20200730</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,14 +46,19 @@
|
||||
<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>
|
||||
@@ -62,7 +68,7 @@
|
||||
<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,66 +0,0 @@
|
||||
<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>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
<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>
|
||||
<groupId>org.talend.libraries</groupId>
|
||||
<artifactId>talend-mscrm</artifactId>
|
||||
<version>3.4-20201104-patch</version>
|
||||
<version>3.4-20191012</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>talend-mscrm</name>
|
||||
@@ -11,11 +11,9 @@
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<cxf.version>3.1.1</cxf.version>
|
||||
<odata.version>4.7.1</odata.version>
|
||||
<slf4j.version>1.7.12</slf4j.version>
|
||||
<jackson.version>2.10.1</jackson.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>
|
||||
<axis2.version>1.7.9</axis2.version>
|
||||
</properties>
|
||||
|
||||
<distributionManagement>
|
||||
@@ -45,7 +43,7 @@
|
||||
<dependency>
|
||||
<groupId>org.apache.axis2</groupId>
|
||||
<artifactId>axis2-xmlbeans</artifactId>
|
||||
<version>${axis2.version}</version>
|
||||
<version>1.7.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
@@ -65,7 +63,7 @@
|
||||
<dependency>
|
||||
<groupId>org.apache.axis2</groupId>
|
||||
<artifactId>axis2-transport-http</artifactId>
|
||||
<version>${axis2.version}</version>
|
||||
<version>1.7.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -111,22 +109,7 @@
|
||||
<dependency>
|
||||
<groupId>com.microsoft.azure</groupId>
|
||||
<artifactId>adal4j</artifactId>
|
||||
<version>1.6.4-20200824</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.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-annotations</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
<version>1.1.1-20191012</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
|
||||
@@ -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,32 +19,29 @@ 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.log4j.Logger;
|
||||
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.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.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
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;
|
||||
|
||||
// ============================================================================
|
||||
//
|
||||
@@ -68,17 +62,23 @@ import com.microsoft.schemas.xrm._2011.contracts.OrganizationServiceStub;
|
||||
*/
|
||||
public class MSCRMClient {
|
||||
|
||||
static Logger logger = Logger.getLogger(MSCRMClient.class.getName());
|
||||
static Logger logger = LoggerFactory.getLogger(MSCRMClient.class.getName());
|
||||
|
||||
/**
|
||||
* Microsoft account (e.g. youremail@live.com) or Microsoft Office 365 (Org ID e.g.
|
||||
* youremail@yourorg.onmicrosoft.com) User Name.
|
||||
*/
|
||||
private String username;
|
||||
|
||||
/**
|
||||
* Microsoft account or Microsoft Office 365 (Org ID) Password.
|
||||
*/
|
||||
private String password;
|
||||
|
||||
/**
|
||||
* Unique Name of the organization
|
||||
*/
|
||||
private String orgName;
|
||||
|
||||
/**
|
||||
* Unique Name of the organization
|
||||
*/
|
||||
private ClientConfiguration clientConfiguration;
|
||||
|
||||
/**
|
||||
* Suffix for the Flat WSDL
|
||||
@@ -87,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;
|
||||
|
||||
}
|
||||
@@ -181,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();
|
||||
|
||||
@@ -290,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;
|
||||
@@ -315,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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ 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
|
||||
@@ -69,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;
|
||||
|
||||
/*
|
||||
@@ -97,11 +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;
|
||||
|
||||
|
||||
ClientConfiguration(AuthStrategyEnum authStrategy) {
|
||||
this.authStrategy = authStrategy;
|
||||
@@ -232,27 +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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,18 +59,4 @@ public class ClientConfigurationFactory {
|
||||
return clientConfiguration;
|
||||
}
|
||||
|
||||
public final static ClientConfiguration buildOAuthPremiseClientConfiguration(String userName, String password, String authoryEndpoint,
|
||||
String serviceAPI, String clientId, String redirectUrl, String forcedResource) {
|
||||
ClientConfiguration clientConfiguration = new ClientConfiguration(AuthStrategyEnum.OAUTH_PREMISE);
|
||||
clientConfiguration.setUserName(userName);
|
||||
clientConfiguration.setPassword(password);
|
||||
clientConfiguration.setAuthoryEndpoint(authoryEndpoint);
|
||||
clientConfiguration.setClientId(clientId);
|
||||
clientConfiguration.setRedirectURL(redirectUrl);
|
||||
clientConfiguration.setServiceAPI(serviceAPI);
|
||||
clientConfiguration.setForceResource(forcedResource);
|
||||
|
||||
return clientConfiguration;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,6 +12,19 @@
|
||||
// ============================================================================
|
||||
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.HttpEntity;
|
||||
@@ -31,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;
|
||||
@@ -57,18 +69,6 @@ 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.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;
|
||||
|
||||
/**
|
||||
* Client for accessing Dynamics CRM Online using the Web API
|
||||
*
|
||||
@@ -155,6 +155,7 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
/**
|
||||
* Create EntitySet Iterator request
|
||||
*
|
||||
* @param entirySet entirySet the EntitySet name which you want to retrieve records
|
||||
* @param queryOption
|
||||
* @return EntitySet iterator request
|
||||
*/
|
||||
@@ -173,43 +174,17 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
uriBuilder.filter(queryOption.getFilter());
|
||||
}
|
||||
ODataEntitySetRequest<ClientEntitySet> request = odataClient.getRetrieveRequestFactory()
|
||||
.getEntitySetRequest(uriBuilder.build());
|
||||
.getEntitySetRequest(uriBuilder.build());
|
||||
|
||||
this.authStrategy.configureRequest(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);
|
||||
return entitySetRequest;
|
||||
}
|
||||
|
||||
public ODataEntitySetRequest<ClientEntitySet> createEndpointsNamesRequest(){
|
||||
URIBuilder uriBuilder = odataClient.newURIBuilder(serviceRootURL);
|
||||
ODataEntitySetRequest<ClientEntitySet> entitySetRequest = odataClient.getRetrieveRequestFactory().getEntitySetRequest(uriBuilder.build());
|
||||
this.authStrategy.configureRequest(entitySetRequest);
|
||||
return entitySetRequest;
|
||||
}
|
||||
|
||||
public ODataEntitySetRequest<ClientEntitySet> createRequest(URIBuilder uriBuilder) {
|
||||
ODataEntitySetRequest<ClientEntitySet> entitySetRequest = odataClient.getRetrieveRequestFactory().getEntitySetRequest(uriBuilder.build());
|
||||
this.authStrategy.configureRequest(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
|
||||
*
|
||||
@@ -243,6 +218,7 @@ 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
|
||||
@@ -257,52 +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 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 HttpResponse updateEntity(ClientEntity entity, String keySegment) throws ServiceUnavailableException {
|
||||
HttpResponse response = updateEntity(entity, keySegment, this.navigationLinksToNull);
|
||||
this.navigationLinksToNull.clear();
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 HttpResponse updateEntity(ClientEntity entity, String keySegment, List<String> navigationLinksToDelete) throws ServiceUnavailableException {
|
||||
URIBuilder updateURIBuilder = odataClient.newURIBuilder(serviceRootURL).appendEntitySetSegment(entitySet)
|
||||
.appendKeySegment(UUID.fromString(keySegment));
|
||||
.appendKeySegment(UUID.fromString(keySegment));
|
||||
HttpEntity httpEntity = convertToHttpEntity(entity);
|
||||
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 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);
|
||||
}
|
||||
}
|
||||
@@ -310,13 +261,14 @@ 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));
|
||||
.appendKeySegment(UUID.fromString(keySegment));
|
||||
|
||||
return createAndExecuteRequest(deleteURIBuilder.build(), null, HttpMethod.DELETE);
|
||||
}
|
||||
@@ -333,9 +285,9 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
*/
|
||||
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);
|
||||
}
|
||||
@@ -352,7 +304,7 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
uriBuilder.addQueryOption(QueryOption.SELECT, "EntitySetName,LogicalName");
|
||||
uriBuilder.filter("EntitySetName eq '" + entitySetName + "'");
|
||||
ODataEntitySetIteratorRequest<ClientEntitySet, ClientEntity> request = odataClient.getRetrieveRequestFactory()
|
||||
.getEntitySetIteratorRequest(uriBuilder.build());
|
||||
.getEntitySetIteratorRequest(uriBuilder.build());
|
||||
this.authStrategy.configureRequest(request);
|
||||
|
||||
ODataRetrieveResponse<ClientEntitySetIterator<ClientEntitySet, ClientEntity>> response = request.execute();
|
||||
@@ -432,43 +384,6 @@ public class DynamicsCRMClient implements IHttpClientFactoryObserver {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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(){
|
||||
return navigationLinksToNull.size();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,204 +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());
|
||||
|
||||
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,130 +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 HttpHeaders headers = resp.headers();
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -1,129 +0,0 @@
|
||||
package org.talend.ms.crm.odata.authentication.httpclienthelper;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public final class HttpResponse {
|
||||
private int status;
|
||||
private Map<String, List<String>> headers;
|
||||
private String body;
|
||||
|
||||
private Optional<String> code = null;//Optional.empty();
|
||||
|
||||
public static HttpResponse fromHttpUrlConnection(HttpURLConnection conn) throws IOException {
|
||||
final int status = conn.getResponseCode();
|
||||
final Map<String, List<String>> respHeaders = conn.getHeaderFields();
|
||||
|
||||
HttpResponse context = new HttpResponse(status);
|
||||
context.setHeaders(respHeaders);
|
||||
|
||||
try(BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"))){
|
||||
final String body = in.lines().collect(Collectors.joining("\n"));
|
||||
context.setBody(body);
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
private HttpResponse(int status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(int status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public Map<String, List<String>> getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
public void setHeaders(Map<String, List<String>> headers) {
|
||||
this.headers = headers;
|
||||
}
|
||||
|
||||
private Optional<List<String>> _getAllValuesHeader(String key) {
|
||||
if (this.getHeaders() == null || this.getHeaders().size() <= 0) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
if (!this.getHeaders().containsKey(key)) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
return Optional.ofNullable(this.getHeaders().get(key));
|
||||
}
|
||||
|
||||
public Optional<List<String>> getAllValuesHeader(String key) {
|
||||
String keyUpper = ("" + key.charAt(0)).toUpperCase() + key.substring(1);
|
||||
String keyLower = ("" + key.charAt(0)).toLowerCase() + key.substring(1);
|
||||
|
||||
Optional<List<String>> values = _getAllValuesHeader(keyUpper);
|
||||
if(!values.isPresent()){
|
||||
values = _getAllValuesHeader(keyLower);
|
||||
}
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
public Optional<String> getFirstValueHeader(String key) {
|
||||
final Optional<List<String>> values = getAllValuesHeader(key);
|
||||
if(!values.isPresent()){
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
final List<String> ss = values.get();
|
||||
if(ss.size() <= 0){
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
return Optional.ofNullable(ss.get(0));
|
||||
}
|
||||
|
||||
public String getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
public void setBody(String body) {
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract 'Code' parameter from the redirect url if exist.
|
||||
* @return An Optional with the code if any.
|
||||
*/
|
||||
private Optional<String> _extractCode(){
|
||||
final Optional<String> optLocation = this.getFirstValueHeader("Location");
|
||||
if (!optLocation.isPresent()) {
|
||||
return Optional.empty();
|
||||
}
|
||||
final String[] split = optLocation.get().split("&|\\?");
|
||||
final Optional<String> optCode = Arrays.stream(split).filter(e -> e.startsWith("code=")).findFirst();
|
||||
|
||||
if (optCode.isPresent()) {
|
||||
String code = optCode.get().substring(5);
|
||||
return Optional.ofNullable(code);
|
||||
}
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public Optional<String> extractCode(){
|
||||
if(code != null){
|
||||
return code;
|
||||
}
|
||||
|
||||
code = _extractCode();
|
||||
return code;
|
||||
}
|
||||
}
|
||||
@@ -1,106 +0,0 @@
|
||||
package org.talend.ms.crm.odata.authentication.httpclienthelper;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.Map;
|
||||
|
||||
public final class RequestHttpContext {
|
||||
|
||||
private String method;
|
||||
private String base;
|
||||
private Map<String, String> params;
|
||||
private Map<String, String> headers;
|
||||
private boolean followRedirects;
|
||||
private int connectionTimeout;
|
||||
private int readTimeout;
|
||||
private String bodyContent = "";
|
||||
|
||||
public RequestHttpContext(String method, String base, Map<String, String> params, Map<String, String> headers, boolean followRedirects, int connectionTimeout, int readTimeout) {
|
||||
this.method = method;
|
||||
this.base = base;
|
||||
this.params = params;
|
||||
this.headers = headers;
|
||||
this.followRedirects = followRedirects;
|
||||
this.connectionTimeout = connectionTimeout;
|
||||
this.readTimeout = readTimeout;
|
||||
}
|
||||
|
||||
public String getBodyContent() {
|
||||
return bodyContent;
|
||||
}
|
||||
|
||||
public void setBodyContent(Map<String, String> form) throws UnsupportedEncodingException {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
boolean first = true;
|
||||
for (Map.Entry<String, String> e : form.entrySet()) {
|
||||
if(!first){
|
||||
sb.append("&");
|
||||
}
|
||||
first = false;
|
||||
|
||||
sb.append(e.getKey()).append("=").append(HttpClient.encodeValue(e.getValue()));
|
||||
}
|
||||
|
||||
this.setBodyContent(sb.toString());
|
||||
}
|
||||
|
||||
public void setBodyContent(String bodyContent) {
|
||||
this.bodyContent = bodyContent;
|
||||
}
|
||||
|
||||
public String getMethod() {
|
||||
return method;
|
||||
}
|
||||
|
||||
public void setMethod(String method) {
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
public String getBase() {
|
||||
return base;
|
||||
}
|
||||
|
||||
public void setBase(String base) {
|
||||
this.base = base;
|
||||
}
|
||||
|
||||
public Map<String, String> getParams() {
|
||||
return params;
|
||||
}
|
||||
|
||||
public void setParams(Map<String, String> params) {
|
||||
this.params = params;
|
||||
}
|
||||
|
||||
public Map<String, String> getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
public void setHeaders(Map<String, String> headers) {
|
||||
this.headers = headers;
|
||||
}
|
||||
|
||||
public boolean isFollowRedirects() {
|
||||
return followRedirects;
|
||||
}
|
||||
|
||||
public void setFollowRedirects(boolean followRedirects) {
|
||||
this.followRedirects = followRedirects;
|
||||
}
|
||||
|
||||
public int getConnectionTimeout() {
|
||||
return connectionTimeout;
|
||||
}
|
||||
|
||||
public void setConnectionTimeout(int connectionTimeout) {
|
||||
this.connectionTimeout = connectionTimeout;
|
||||
}
|
||||
|
||||
public int getReadTimeout() {
|
||||
return readTimeout;
|
||||
}
|
||||
|
||||
public void setReadTimeout(int readTimeout) {
|
||||
this.readTimeout = readTimeout;
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
package org.talend.ms.crm.odata.authentication.httpclienthelper;
|
||||
|
||||
public final class Token {
|
||||
// Time to be sure to refresh the token at time
|
||||
private final static int EXPIRATION_SECURITY_GAP_SECOND = 60;
|
||||
|
||||
private String access_token;
|
||||
private String token_type;
|
||||
private Long expires_in;
|
||||
|
||||
public Token(){
|
||||
}
|
||||
|
||||
public String getAccess_token() {
|
||||
return access_token;
|
||||
}
|
||||
|
||||
public void setAccess_token(String access_token) {
|
||||
this.access_token = access_token;
|
||||
}
|
||||
|
||||
public String getToken_type() {
|
||||
return token_type;
|
||||
}
|
||||
|
||||
public void setToken_type(String token_type) {
|
||||
this.token_type = token_type;
|
||||
}
|
||||
|
||||
public Long getExpires_in() {
|
||||
return expires_in;
|
||||
}
|
||||
|
||||
public void setExpires_in(Long expires_in) {
|
||||
this.expires_in = expires_in;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
package org.talend.ms.crm.sdk;
|
||||
|
||||
public class Instance {
|
||||
|
||||
public String id;
|
||||
|
||||
public String uniqueName;
|
||||
|
||||
public String urlName;
|
||||
|
||||
public String friendlyName;
|
||||
|
||||
public String state;
|
||||
|
||||
public String version;
|
||||
|
||||
public String url;
|
||||
|
||||
public String apiUrl;
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getUniqueName() {
|
||||
return uniqueName;
|
||||
}
|
||||
|
||||
public void setUniqueName(String uniqueName) {
|
||||
this.uniqueName = uniqueName;
|
||||
}
|
||||
|
||||
public String getUrlName() {
|
||||
return urlName;
|
||||
}
|
||||
|
||||
public void setUrlName(String urlName) {
|
||||
this.urlName = urlName;
|
||||
}
|
||||
|
||||
public String getFriendlyName() {
|
||||
return friendlyName;
|
||||
}
|
||||
|
||||
public void setFriendlyName(String friendlyName) {
|
||||
this.friendlyName = friendlyName;
|
||||
}
|
||||
|
||||
public String getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public void setState(String state) {
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(String version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public void setUrl(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
public String getApiUrl() {
|
||||
return apiUrl;
|
||||
}
|
||||
|
||||
public void setApiUrl(String apiUrl) {
|
||||
this.apiUrl = apiUrl;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -11,7 +11,7 @@ import java.util.Locale;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import java.security.InvalidParameterException;
|
||||
import javax.activity.InvalidActivityException;
|
||||
import javax.wsdl.WSDLException;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
@@ -107,7 +107,7 @@ public final class OnlineAuthenticationPolicy {
|
||||
this.initialize(flatWsdlUrl, targetDocument);
|
||||
}
|
||||
|
||||
private void initialize(String url, String wsdl) throws URISyntaxException, InvalidParameterException {
|
||||
private void initialize(String url, String wsdl) throws URISyntaxException, InvalidActivityException {
|
||||
final String PolicyNodeContentRegexPatern = "(?i)(<wsp:All.*?>)(.+?)(</wsp:All>)";
|
||||
final String LiveIdentityProviderTrustRegexPatern = "(?i)(<ms-xrm:LiveTrust.*?>)(.+?)(</ms-xrm:LiveTrust>)";
|
||||
final String OrgIdentityProviderTrustRegexPatern = "(?i)(<ms-xrm:OrgTrust.*?>)(.+?)(</ms-xrm:OrgTrust>)";
|
||||
@@ -166,7 +166,7 @@ public final class OnlineAuthenticationPolicy {
|
||||
}
|
||||
}
|
||||
|
||||
throw new InvalidParameterException(
|
||||
throw new InvalidActivityException(
|
||||
String.format(Locale.getDefault(), "Unable to parse the authentication policy from the WSDL \"%s\".", url));
|
||||
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ public class OrganizationServiceStubWrapper extends OrganizationServiceStub {
|
||||
}
|
||||
|
||||
private void renewToken() throws Exception {
|
||||
orgStub = client.doGetOnlineConnection();
|
||||
orgStub = client.doGetOnlineConnection(discoveryServiceUrl);
|
||||
}
|
||||
|
||||
private void sleep() {
|
||||
|
||||
@@ -1,173 +0,0 @@
|
||||
package org.talend.ms.crm.odata;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import javax.naming.ServiceUnavailableException;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpHeaders;
|
||||
import org.apache.http.NameValuePair;
|
||||
import org.apache.http.client.entity.UrlEncodedFormEntity;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.entity.ByteArrayEntity;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.message.BasicNameValuePair;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.apache.olingo.client.api.ODataClient;
|
||||
import org.apache.olingo.client.api.domain.ClientEntity;
|
||||
import org.apache.olingo.client.api.http.HttpClientException;
|
||||
import org.apache.olingo.client.api.serialization.ODataSerializer;
|
||||
import org.apache.olingo.client.core.ODataClientFactory;
|
||||
import org.apache.olingo.commons.api.Constants;
|
||||
import org.talend.ms.crm.MSCRMClient;
|
||||
import org.talend.ms.crm.sdk.Instance;
|
||||
|
||||
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.aad.adal4j.AuthenticationContext;
|
||||
import com.microsoft.aad.adal4j.AuthenticationResult;
|
||||
|
||||
public class MSCRMClientTest {
|
||||
|
||||
private static String RESOURCE = "https://talendsupport.crm.dynamics.com/";
|
||||
|
||||
private final static String CLIENT_ID = "d6bf51bd-c127-4575-b4d4-893ae8db7723";
|
||||
|
||||
private final static String USERNAME = "dynamics@talend365.onmicrosoft.com";
|
||||
|
||||
private final static String PASSWORD = "R.)`:9>\\mrX3";
|
||||
|
||||
private final static String AUTHORITY = "https://login.windows.net/common/oauth2/authorize";
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
ClientConfiguration configuration = ClientConfigurationFactory
|
||||
.buildOAuthNativeClientConfiguration(CLIENT_ID,USERNAME,PASSWORD,AUTHORITY);
|
||||
configuration.setTimeout(6000);
|
||||
configuration.setReuseHttpClient(false);
|
||||
configuration.setMaxRetry(5,1000);
|
||||
MSCRMClient client = new MSCRMClient(configuration, "talendsupport", "https://globaldisco.crm.dynamics.com/api/discovery/v2.0/Instances(UniqueName='talendsupport')");
|
||||
client.getOnlineConnection();
|
||||
|
||||
}
|
||||
|
||||
public static String doGet(String url) throws Exception {
|
||||
|
||||
// System.out.println(getAccessToken() );
|
||||
HttpGet request = new HttpGet(url);
|
||||
|
||||
request.addHeader(HttpHeaders.AUTHORIZATION, "Bearer " + getAccessToken() );
|
||||
|
||||
try (CloseableHttpClient httpClient = HttpClients.createDefault();
|
||||
CloseableHttpResponse response = httpClient.execute(request)) {
|
||||
|
||||
// Get HttpResponse Status
|
||||
System.out.println(response.getProtocolVersion()); // HTTP/1.1
|
||||
System.out.println(response.getStatusLine().getStatusCode()); // 200
|
||||
System.out.println(response.getStatusLine().getReasonPhrase()); // OK
|
||||
System.out.println(response.getStatusLine().toString()); // HTTP/1.1 200 OK
|
||||
|
||||
HttpEntity entity = response.getEntity();
|
||||
String result = null;
|
||||
if (entity != null) {
|
||||
// return it as a String
|
||||
result = EntityUtils.toString(entity);
|
||||
// JsonArray jsonArray = JsonParser
|
||||
// .parseString(result)
|
||||
// .getAsJsonObject().get("value").getAsJsonArray();
|
||||
// Gson gson = new Gson();
|
||||
// Instance instance = gson.fromJson(jsonArray.get(0), Instance.class);
|
||||
// System.out.println(instance.apiUrl);
|
||||
|
||||
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);
|
||||
System.out.println(instance.getApiUrl());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected HttpEntity convertToHttpEntity(ClientEntity entity) {
|
||||
ByteArrayOutputStream output = new ByteArrayOutputStream();
|
||||
OutputStreamWriter writer = null;
|
||||
try {
|
||||
writer = new OutputStreamWriter(output, Constants.UTF8);
|
||||
ODataClient odataClient =ODataClientFactory.getClient();
|
||||
final ODataSerializer serializer = odataClient.getSerializer(org.apache.olingo.commons.api.format.ContentType.JSON);
|
||||
serializer.write(writer, odataClient.getBinder().getEntity(entity));
|
||||
HttpEntity httpEntity = new ByteArrayEntity(output.toByteArray(),
|
||||
org.apache.http.entity.ContentType.APPLICATION_JSON);
|
||||
return httpEntity;
|
||||
} catch (Exception e) {
|
||||
throw new HttpClientException(e);
|
||||
} finally {
|
||||
IOUtils.closeQuietly(writer);
|
||||
}
|
||||
}
|
||||
|
||||
private static String sendPOST(String url) throws IOException {
|
||||
|
||||
String result = "";
|
||||
HttpPost post = new HttpPost(url);
|
||||
|
||||
// add request parameters or form parameters
|
||||
List<NameValuePair> urlParameters = new ArrayList<>();
|
||||
urlParameters.add(new BasicNameValuePair("username", "abc"));
|
||||
urlParameters.add(new BasicNameValuePair("password", "123"));
|
||||
urlParameters.add(new BasicNameValuePair("custom", "secret"));
|
||||
|
||||
post.setEntity(new UrlEncodedFormEntity(urlParameters));
|
||||
|
||||
try (CloseableHttpClient httpClient = HttpClients.createDefault();
|
||||
CloseableHttpResponse response = httpClient.execute(post)) {
|
||||
|
||||
result = EntityUtils.toString(response.getEntity());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static String getAccessToken() throws ServiceUnavailableException {
|
||||
AuthenticationContext context = null;
|
||||
AuthenticationResult result = null;
|
||||
ExecutorService service = null;
|
||||
try {
|
||||
service = Executors.newFixedThreadPool(1);
|
||||
context = new AuthenticationContext("https://login.windows.net/common/oauth2/authorize", false, service);
|
||||
Future<AuthenticationResult> future = context.acquireToken("https://globaldisco.crm.dynamics.com/",
|
||||
CLIENT_ID, USERNAME, PASSWORD,
|
||||
null);
|
||||
result = future.get();
|
||||
System.out.println(result.getAccessToken());
|
||||
} catch (Exception e) {
|
||||
throw new ServiceUnavailableException(e.getMessage());
|
||||
} finally {
|
||||
service.shutdown();
|
||||
}
|
||||
return result.getAccessToken();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
<groupId>org.talend.components</groupId>
|
||||
<artifactId>talendExcel</artifactId>
|
||||
<version>1.8-20201113</version>
|
||||
<version>1.6-20200923</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>talendExcel</name>
|
||||
|
||||
@@ -161,8 +161,12 @@ public class ExcelTool {
|
||||
}
|
||||
|
||||
private void appendActionForFile(String fileName) throws Exception {
|
||||
InputStream inp = new FileInputStream(fileName);
|
||||
wb = WorkbookFactory.create(inp, password);
|
||||
if (password == null) {
|
||||
InputStream inp = new FileInputStream(fileName);
|
||||
wb = WorkbookFactory.create(inp);
|
||||
} else {
|
||||
wb = readEncryptedFile(fileName);
|
||||
}
|
||||
sheet = wb.getSheet(sheetName);
|
||||
if (sheet != null) {
|
||||
if (appendSheet) {
|
||||
@@ -187,10 +191,27 @@ public class ExcelTool {
|
||||
}
|
||||
|
||||
private void initPreXlsx(String fileName) throws Exception {
|
||||
InputStream preIns = new FileInputStream(fileName);
|
||||
preWb = WorkbookFactory.create(preIns, password);
|
||||
if(password == null) {
|
||||
InputStream preIns = new FileInputStream(fileName);
|
||||
preWb = WorkbookFactory.create(preIns);
|
||||
} else {
|
||||
preWb = readEncryptedFile(fileName);
|
||||
}
|
||||
preSheet = preWb.getSheet(sheetName);
|
||||
}
|
||||
|
||||
private Workbook readEncryptedFile(String fileName)
|
||||
throws IOException, GeneralSecurityException {
|
||||
InputStream inp = new FileInputStream(fileName);
|
||||
POIFSFileSystem fs = new POIFSFileSystem(inp);
|
||||
EncryptionInfo info = new EncryptionInfo(fs);
|
||||
Decryptor decryptor = Decryptor.getInstance(info);
|
||||
if (!decryptor.verifyPassword(password)) {
|
||||
throw new GeneralSecurityException("Error: Incorrect password!");
|
||||
}
|
||||
InputStream dataStream = decryptor.getDataStream(fs);
|
||||
return WorkbookFactory.create(dataStream);
|
||||
}
|
||||
|
||||
public void setFont(String fontName) {
|
||||
if (StringUtils.isNotEmpty(fontName)) {
|
||||
@@ -331,9 +352,6 @@ public class ExcelTool {
|
||||
try {
|
||||
wb.write(outputStream);
|
||||
wb.close();
|
||||
if(preWb != null){
|
||||
preWb.close();
|
||||
}
|
||||
} finally {
|
||||
if (outputStream != null) {
|
||||
outputStream.close();
|
||||
@@ -366,9 +384,6 @@ public class ExcelTool {
|
||||
}
|
||||
} finally {
|
||||
wb.close();
|
||||
if(preWb != null){
|
||||
preWb.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,21 +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>talendzip</artifactId>
|
||||
<version>1.1-20201120</version>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>8</source>
|
||||
<target>8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<version>1.0-20190917</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
|
||||
@@ -2,7 +2,6 @@ package com.talend.compress.zip;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import net.lingala.zip4j.core.ZipFile;
|
||||
import net.lingala.zip4j.model.FileHeader;
|
||||
@@ -45,8 +44,6 @@ public class Unzip {
|
||||
this.useZip4jDecryption = useZip4jDecryption;
|
||||
}
|
||||
|
||||
public void setEncording(String encording){this.encording = encording;}
|
||||
|
||||
private boolean needPassword = false;
|
||||
private boolean useZip4jDecryption = false;
|
||||
|
||||
@@ -58,8 +55,6 @@ public class Unzip {
|
||||
|
||||
private String sourceZip;
|
||||
private String targetDir;
|
||||
private String encording;
|
||||
|
||||
|
||||
public Unzip(String sourceZip, String targetDir) {
|
||||
this.sourceZip = sourceZip;
|
||||
@@ -97,9 +92,6 @@ public class Unzip {
|
||||
}
|
||||
|
||||
ZipFile zipFile = new ZipFile(sourceZip);
|
||||
if(encording != null){
|
||||
zipFile.setFileNameCharset(encording);
|
||||
}
|
||||
|
||||
if (checkArchive) {
|
||||
if (!zipFile.isValidZipFile()) {
|
||||
@@ -160,8 +152,9 @@ public class Unzip {
|
||||
is = new javax.crypto.CipherInputStream(is,
|
||||
org.talend.archive.IntegrityUtil.createCipher(
|
||||
javax.crypto.Cipher.DECRYPT_MODE, password));
|
||||
|
||||
org.apache.commons.compress.archivers.zip.ZipArchiveInputStream input = new org.apache.commons.compress.archivers.zip.ZipArchiveInputStream(
|
||||
new java.io.BufferedInputStream(is),Optional.ofNullable(encording).orElse("UTF8"));
|
||||
new java.io.BufferedInputStream(is));
|
||||
org.apache.commons.compress.archivers.zip.ZipArchiveEntry entry;
|
||||
|
||||
while ((entry = input.getNextZipEntry()) != null) {
|
||||
@@ -197,7 +190,7 @@ public class Unzip {
|
||||
org.apache.commons.compress.archivers.zip.ZipFile zip = null;
|
||||
try {
|
||||
zip = new org.apache.commons.compress.archivers.zip.ZipFile(
|
||||
sourceZip,Optional.ofNullable(encording).orElse("UTF8"));
|
||||
sourceZip);
|
||||
java.util.Enumeration enuFiles = zip.getEntries();
|
||||
java.io.InputStream is = null;
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ REGION.ITEM.CN_NORTH_1=China (Beijing)
|
||||
REGION.ITEM.AP_SOUTHEAST_1=Asia Pacific (Singapore)
|
||||
REGION.ITEM.AP_SOUTHEAST_2=Asia Pacific (Sydney)
|
||||
REGION.ITEM.AP_NORTHEAST_1=Asia Pacific (Tokyo)
|
||||
REGION.ITEM.SA_EAST_1=South America (Sao Paulo)
|
||||
REGION.ITEM.SA_EAST_1=South America (S\u00E3o Paulo)
|
||||
CLUSTER_ID.NAME=Cluster id
|
||||
ENABLE_LOG.NAME=Enable log
|
||||
ENABLE_KEY_PAIR.NAME=Use EC2 key pair
|
||||
@@ -36,3 +36,36 @@ ARN.NAME=Role ARN
|
||||
ROLE_SESSION_NAME.NAME=Role session name
|
||||
SESSION_DURATION.NAME=Session duration
|
||||
SET_STS_ENDPOINT.NAME=STS Endpoint
|
||||
ASSUME_ROLE_CONFIG.NAME=Assume Role Configuration
|
||||
EXTERNALID.NAME=External Id
|
||||
SERIALNUMBER.NAME=Serial number
|
||||
TOKENCODE.NAME=Token code
|
||||
POLICY_TABLE.NAME=IAM Policy ARNs
|
||||
POLICY_TABLE.ITEM.POLICY_ARN=Policy ARN
|
||||
POLICY.NAME=Policy
|
||||
TAGS.NAME=Tags
|
||||
TAGS.ITEM.TAG_KEY=Key
|
||||
TAGS.ITEM.TAG_VALUE=Value
|
||||
TAGS.ITEM.TAG_TRANSITIVE=Transitive
|
||||
SIGNING_REGION.NAME=Signing region
|
||||
SIGNING_REGION.ITEM.DEFAULT=DEFAULT
|
||||
SIGNING_REGION.ITEM.GovCloud=AWS GovCloud (US)
|
||||
SIGNING_REGION.ITEM.US_EAST_1=US Standard
|
||||
SIGNING_REGION.ITEM.US_WEST_1=US West (N. California)
|
||||
SIGNING_REGION.ITEM.US_WEST_2=US West (Oregon)
|
||||
SIGNING_REGION.ITEM.US_EAST_2=US East (Ohio)
|
||||
SIGNING_REGION.ITEM.SA_EAST_1=South America (S\u00E3o Paulo)
|
||||
SIGNING_REGION.ITEM.EU_WEST_1=EU (Ireland)
|
||||
SIGNING_REGION.ITEM.EU_CENTRAL_1=EU (Frankfurt)
|
||||
SIGNING_REGION.ITEM.EU_WEST_2=EU (London)
|
||||
SIGNING_REGION.ITEM.EU_WEST_3=EU (Paris)
|
||||
SIGNING_REGION.ITEM.EU_NORTH_1=EU (Stockholm)
|
||||
SIGNING_REGION.ITEM.CN_NORTH_1=China (Beijing)
|
||||
SIGNING_REGION.ITEM.CN_NORTHWEST_1=China (Ningxia)
|
||||
SIGNING_REGION.ITEM.AP_EAST_1=Asia Pacific (Hong Kong)
|
||||
SIGNING_REGION.ITEM.AP_SOUTHEAST_1=Asia Pacific (Singapore)
|
||||
SIGNING_REGION.ITEM.AP_SOUTHEAST_2=Asia Pacific (Sydney)
|
||||
SIGNING_REGION.ITEM.AP_NORTHEAST_1=Asia Pacific (Tokyo)
|
||||
SIGNING_REGION.ITEM.AP_NORTHEAST_2=Asia Pacific (Seoul)
|
||||
SIGNING_REGION.ITEM.AP_SOUTH_1=Asia Pacific (Mumbai)
|
||||
SIGNING_REGION.ITEM.CA_CENTRAL_1=Canada (Central)
|
||||
|
||||
@@ -17,7 +17,7 @@ REGION.ITEM.CN_NORTH_1=Chine (P\u00E9kin)
|
||||
REGION.ITEM.AP_SOUTHEAST_1=Asie Pacifique (Singapour)
|
||||
REGION.ITEM.AP_SOUTHEAST_2=Asie Pacifique (Sydney)
|
||||
REGION.ITEM.AP_NORTHEAST_1=Asie Pacifique (Tokyo)
|
||||
REGION.ITEM.SA_EAST_1=South America (Sao Paulo)
|
||||
REGION.ITEM.SA_EAST_1=Am\u00E9rique du Sud (S\u00E3o Paulo)
|
||||
CLUSTER_ID.NAME=iD du cluster
|
||||
ENABLE_LOG.NAME=Activer le log
|
||||
ENABLE_KEY_PAIR.NAME=Utiliser la paire de cl\u00E9s EC2
|
||||
|
||||
@@ -19,7 +19,7 @@ REGION.ITEM.CN_NORTH_1=China (Beijing)
|
||||
REGION.ITEM.AP_SOUTHEAST_1=Asia Pacific (Singapore)
|
||||
REGION.ITEM.AP_SOUTHEAST_2=Asia Pacific (Sydney)
|
||||
REGION.ITEM.AP_NORTHEAST_1=Asia Pacific (Tokyo)
|
||||
REGION.ITEM.SA_EAST_1=South America (Sao Paulo)
|
||||
REGION.ITEM.SA_EAST_1=South America (S\u00E3o Paulo)
|
||||
CLUSTER_NAME.NAME=Cluster name
|
||||
CLUSTER_VERSION.NAME=Cluster version
|
||||
CLUSTER_VERSION.ITEM.AMI3_10_0=AMI 3.10.0
|
||||
@@ -189,3 +189,40 @@ CUSTOMIZE_APPLICATION_TABLE.ITEM.NAME.ITEM.ZEPPELIN-SANDBOX=Zeppelin-Sandbox
|
||||
CUSTOMIZE_APPLICATION_TABLE.ITEM.NAME.ITEM.ZOOKEEPER-SANDBOX=ZooKeeper-Sandbox
|
||||
CUSTOMIZE_APPLICATION_TABLE.ITEM.NAME.ITEM.OOZIE-SANDBOX=Oozie-Sandbox
|
||||
CLUSTER_VERSION.ITEM.EMR5_15_0=EMR 5.15.0
|
||||
ASSUME_ROLE_CONFIG.NAME=Assume Role Configuration
|
||||
EXTERNALID.NAME=External Id
|
||||
SERIALNUMBER.NAME=Serial number
|
||||
TOKENCODE.NAME=Token code
|
||||
POLICY_TABLE.NAME=IAM Policy ARNs
|
||||
POLICY_TABLE.ITEM.POLICY_ARN=Policy ARN
|
||||
POLICY.NAME=Policy
|
||||
TAGS.NAME=Tags
|
||||
TAGS.ITEM.TAG_KEY=Key
|
||||
TAGS.ITEM.TAG_VALUE=Value
|
||||
TAGS.ITEM.TAG_TRANSITIVE=Transitive
|
||||
SIGNING_REGION.NAME=Signing region
|
||||
SIGNING_REGION.ITEM.DEFAULT=DEFAULT
|
||||
SIGNING_REGION.ITEM.GovCloud=AWS GovCloud (US)
|
||||
SIGNING_REGION.ITEM.US_EAST_1=US Standard
|
||||
SIGNING_REGION.ITEM.US_WEST_1=US West (N. California)
|
||||
SIGNING_REGION.ITEM.US_WEST_2=US West (Oregon)
|
||||
SIGNING_REGION.ITEM.US_EAST_2=US East (Ohio)
|
||||
SIGNING_REGION.ITEM.SA_EAST_1=South America (S\u00E3o Paulo)
|
||||
SIGNING_REGION.ITEM.EU_WEST_1=EU (Ireland)
|
||||
SIGNING_REGION.ITEM.EU_CENTRAL_1=EU (Frankfurt)
|
||||
SIGNING_REGION.ITEM.EU_WEST_2=EU (London)
|
||||
SIGNING_REGION.ITEM.EU_WEST_3=EU (Paris)
|
||||
SIGNING_REGION.ITEM.EU_NORTH_1=EU (Stockholm)
|
||||
SIGNING_REGION.ITEM.CN_NORTH_1=China (Beijing)
|
||||
SIGNING_REGION.ITEM.CN_NORTHWEST_1=China (Ningxia)
|
||||
SIGNING_REGION.ITEM.AP_EAST_1=Asia Pacific (Hong Kong)
|
||||
SIGNING_REGION.ITEM.AP_SOUTHEAST_1=Asia Pacific (Singapore)
|
||||
SIGNING_REGION.ITEM.AP_SOUTHEAST_2=Asia Pacific (Sydney)
|
||||
SIGNING_REGION.ITEM.AP_NORTHEAST_1=Asia Pacific (Tokyo)
|
||||
SIGNING_REGION.ITEM.AP_NORTHEAST_2=Asia Pacific (Seoul)
|
||||
SIGNING_REGION.ITEM.AP_SOUTH_1=Asia Pacific (Mumbai)
|
||||
SIGNING_REGION.ITEM.CA_CENTRAL_1=Canada (Central)
|
||||
CLUSTER_VERSION.ITEM.EMR5_29_0=EMR 5.29.0
|
||||
SLAVE_INSTANCE_COUNT.NAME=Slave instance count
|
||||
PROPERTY_JSON.NAME=Properties in JSON
|
||||
USE_MULTIPLE_MASTER_NODES.NAME=Use multiple master nodes
|
||||
|
||||
@@ -18,7 +18,7 @@ REGION.ITEM.CN_NORTH_1=Chine (P\u00E9kin)
|
||||
REGION.ITEM.AP_SOUTHEAST_1=Asie Pacifique (Singapour)
|
||||
REGION.ITEM.AP_SOUTHEAST_2=Asie Pacifique (Sydney)
|
||||
REGION.ITEM.AP_NORTHEAST_1=Asie Pacifique (Tokyo)
|
||||
REGION.ITEM.SA_EAST_1=South America (Sao Paulo)
|
||||
REGION.ITEM.SA_EAST_1=Am\u00E9rique du Sud (S\u00E3o Paulo)
|
||||
CLUSTER_NAME.NAME=Nom du cluster
|
||||
CLUSTER_VERSION.NAME=Version du cluster
|
||||
CLUSTER_VERSION.ITEM.AMI3_10_0=AMI 3.10.0
|
||||
@@ -173,3 +173,4 @@ CUSTOMIZE_APPLICATION_TABLE.ITEM.NAME.ITEM.SQOOP-SANDBOX=Sqoop-Sandbox
|
||||
CUSTOMIZE_APPLICATION_TABLE.ITEM.NAME.ITEM.ZEPPELIN-SANDBOX=Zeppelin-Sandbox
|
||||
CUSTOMIZE_APPLICATION_TABLE.ITEM.NAME.ITEM.ZOOKEEPER-SANDBOX=ZooKeeper-Sandbox
|
||||
CUSTOMIZE_APPLICATION_TABLE.ITEM.NAME.ITEM.OOZIE-SANDBOX=Oozie-Sandbox
|
||||
CLUSTER_VERSION.ITEM.EMR5_15_0=EMR 5.15.0
|
||||
|
||||
@@ -19,7 +19,7 @@ REGION.ITEM.CN_NORTH_1=China (Beijing)
|
||||
REGION.ITEM.AP_SOUTHEAST_1=Asia Pacific (Singapore)
|
||||
REGION.ITEM.AP_SOUTHEAST_2=Asia Pacific (Sydney)
|
||||
REGION.ITEM.AP_NORTHEAST_1=Asia Pacific (Tokyo)
|
||||
REGION.ITEM.SA_EAST_1=South America (Sao Paulo)
|
||||
REGION.ITEM.SA_EAST_1=South America (S\u00E3o Paulo)
|
||||
CLUSTER_ID.NAME=Cluster id
|
||||
GROUP_ID.NAME=Group id
|
||||
GROUP_NAME.NAME=Group name
|
||||
@@ -75,3 +75,36 @@ ARN.NAME=Role ARN
|
||||
ROLE_SESSION_NAME.NAME=Role session name
|
||||
SESSION_DURATION.NAME=Session duration
|
||||
SET_STS_ENDPOINT.NAME=STS Endpoint
|
||||
ASSUME_ROLE_CONFIG.NAME=Assume Role Configuration
|
||||
EXTERNALID.NAME=External Id
|
||||
SERIALNUMBER.NAME=Serial number
|
||||
TOKENCODE.NAME=Token code
|
||||
POLICY_TABLE.NAME=IAM Policy ARNs
|
||||
POLICY_TABLE.ITEM.POLICY_ARN=Policy ARN
|
||||
POLICY.NAME=Policy
|
||||
TAGS.NAME=Tags
|
||||
TAGS.ITEM.TAG_KEY=Key
|
||||
TAGS.ITEM.TAG_VALUE=Value
|
||||
TAGS.ITEM.TAG_TRANSITIVE=Transitive
|
||||
SIGNING_REGION.NAME=Signing region
|
||||
SIGNING_REGION.ITEM.DEFAULT=DEFAULT
|
||||
SIGNING_REGION.ITEM.GovCloud=AWS GovCloud (US)
|
||||
SIGNING_REGION.ITEM.US_EAST_1=US Standard
|
||||
SIGNING_REGION.ITEM.US_WEST_1=US West (N. California)
|
||||
SIGNING_REGION.ITEM.US_WEST_2=US West (Oregon)
|
||||
SIGNING_REGION.ITEM.US_EAST_2=US East (Ohio)
|
||||
SIGNING_REGION.ITEM.SA_EAST_1=South America (S\u00E3o Paulo)
|
||||
SIGNING_REGION.ITEM.EU_WEST_1=EU (Ireland)
|
||||
SIGNING_REGION.ITEM.EU_CENTRAL_1=EU (Frankfurt)
|
||||
SIGNING_REGION.ITEM.EU_WEST_2=EU (London)
|
||||
SIGNING_REGION.ITEM.EU_WEST_3=EU (Paris)
|
||||
SIGNING_REGION.ITEM.EU_NORTH_1=EU (Stockholm)
|
||||
SIGNING_REGION.ITEM.CN_NORTH_1=China (Beijing)
|
||||
SIGNING_REGION.ITEM.CN_NORTHWEST_1=China (Ningxia)
|
||||
SIGNING_REGION.ITEM.AP_EAST_1=Asia Pacific (Hong Kong)
|
||||
SIGNING_REGION.ITEM.AP_SOUTHEAST_1=Asia Pacific (Singapore)
|
||||
SIGNING_REGION.ITEM.AP_SOUTHEAST_2=Asia Pacific (Sydney)
|
||||
SIGNING_REGION.ITEM.AP_NORTHEAST_1=Asia Pacific (Tokyo)
|
||||
SIGNING_REGION.ITEM.AP_NORTHEAST_2=Asia Pacific (Seoul)
|
||||
SIGNING_REGION.ITEM.AP_SOUTH_1=Asia Pacific (Mumbai)
|
||||
SIGNING_REGION.ITEM.CA_CENTRAL_1=Canada (Central)
|
||||
|
||||
@@ -18,7 +18,7 @@ REGION.ITEM.CN_NORTH_1=Chine (P\u00E9kin)
|
||||
REGION.ITEM.AP_SOUTHEAST_1=Asie Pacifique (Singapour)
|
||||
REGION.ITEM.AP_SOUTHEAST_2=Asie Pacifique (Sydney)
|
||||
REGION.ITEM.AP_NORTHEAST_1=Asie Pacifique (Tokyo)
|
||||
REGION.ITEM.SA_EAST_1=South America (Sao Paulo)
|
||||
REGION.ITEM.SA_EAST_1=Am\u00E9rique du Sud (S\u00E3o Paulo)
|
||||
CLUSTER_ID.NAME=iD du cluster
|
||||
GROUP_ID.NAME=ID du groupe
|
||||
GROUP_NAME.NAME=Nom du groupe
|
||||
|
||||
@@ -105,3 +105,5 @@ USE_TIMESTAMP_FOR_DATE_TYPE.NAME=Utiliser la date et l'heure comme type de date
|
||||
DB_VERSION.ITEM.ORACLE_12=Oracle 12-7
|
||||
NB_LINE_REJECTED.NAME=Nombre de lignes rejet\u00E9es
|
||||
DBNAME.NAME=Base de donn\u00E9es
|
||||
USE_ALTERNATE_SCHEMA.NAME=Utiliser un sch\u00E9ma alternatif
|
||||
ALTERNATE_SCHEMA.NAME=Sch\u00E9ma
|
||||
|
||||
@@ -54,11 +54,11 @@ for(IConnection conn : outgoingConns) {
|
||||
<%
|
||||
}
|
||||
}
|
||||
log4jCodeGenerateUtil.query(node);
|
||||
%>
|
||||
query_<%=cid %> = <%=dbquery%>;
|
||||
whetherReject_<%=cid%> = false;
|
||||
<%
|
||||
log4jCodeGenerateUtil.query(node, "query_" + cid);
|
||||
List<IMetadataTable> metadatas = node.getMetadataList();
|
||||
if ((metadatas!=null)&&(metadatas.size()>0)) {
|
||||
IMetadataTable metadata = metadatas.get(0);
|
||||
@@ -131,7 +131,7 @@ try {
|
||||
<%
|
||||
}
|
||||
}
|
||||
log4jCodeGenerateUtil.logInfo(node,"info",cid+" - Execute the query: '\" + query_" + cid + " + \"' has finished.");
|
||||
log4jCodeGenerateUtil.logInfo(node,"info",cid+" - Execute the query: '\" + "+dbquery +" + \"' has finished.");
|
||||
%>
|
||||
<% //feature 0010425
|
||||
if(usePrepareStatement){
|
||||
|
||||
@@ -21,7 +21,7 @@ REGION.ITEM.CN_NORTH_1=China (Beijing)
|
||||
REGION.ITEM.AP_SOUTHEAST_1=Asia Pacific (Singapore)
|
||||
REGION.ITEM.AP_SOUTHEAST_2=Asia Pacific (Sydney)
|
||||
REGION.ITEM.AP_NORTHEAST_1=Asia Pacific (Tokyo)
|
||||
REGION.ITEM.SA_EAST_1=South America (Sao Paulo)
|
||||
REGION.ITEM.SA_EAST_1=South America (S\u00E3o Paulo)
|
||||
CREATE_SNAPSHOT_WHEN_DELETE_CLUSTER.NAME=Create snapshot
|
||||
SNAPSHOT_ID.NAME=Snapshot id
|
||||
CLUSTER_ID.NAME=Cluster id
|
||||
@@ -55,3 +55,40 @@ ARN.NAME=Role ARN
|
||||
ROLE_SESSION_NAME.NAME=Role session name
|
||||
SESSION_DURATION.NAME=Session duration
|
||||
SET_STS_ENDPOINT.NAME=STS Endpoint
|
||||
ASSUME_ROLE_CONFIG.NAME=Assume Role Configuration
|
||||
EXTERNALID.NAME=External Id
|
||||
SERIALNUMBER.NAME=Serial number
|
||||
TOKENCODE.NAME=Token code
|
||||
POLICY_TABLE.NAME=IAM Policy ARNs
|
||||
POLICY_TABLE.ITEM.POLICY_ARN=Policy ARN
|
||||
POLICY.NAME=Policy
|
||||
TAGS.NAME=Tags
|
||||
TAGS.ITEM.TAG_KEY=Key
|
||||
TAGS.ITEM.TAG_VALUE=Value
|
||||
TAGS.ITEM.TAG_TRANSITIVE=Transitive
|
||||
SIGNING_REGION.NAME=Signing region
|
||||
SIGNING_REGION.ITEM.DEFAULT=DEFAULT
|
||||
SIGNING_REGION.ITEM.GovCloud=AWS GovCloud (US)
|
||||
SIGNING_REGION.ITEM.US_EAST_1=US Standard
|
||||
SIGNING_REGION.ITEM.US_WEST_1=US West (N. California)
|
||||
SIGNING_REGION.ITEM.US_WEST_2=US West (Oregon)
|
||||
SIGNING_REGION.ITEM.US_EAST_2=US East (Ohio)
|
||||
SIGNING_REGION.ITEM.SA_EAST_1=South America (S\u00E3o Paulo)
|
||||
SIGNING_REGION.ITEM.EU_WEST_1=EU (Ireland)
|
||||
SIGNING_REGION.ITEM.EU_CENTRAL_1=EU (Frankfurt)
|
||||
SIGNING_REGION.ITEM.EU_WEST_2=EU (London)
|
||||
SIGNING_REGION.ITEM.EU_WEST_3=EU (Paris)
|
||||
SIGNING_REGION.ITEM.EU_NORTH_1=EU (Stockholm)
|
||||
SIGNING_REGION.ITEM.CN_NORTH_1=China (Beijing)
|
||||
SIGNING_REGION.ITEM.CN_NORTHWEST_1=China (Ningxia)
|
||||
SIGNING_REGION.ITEM.AP_EAST_1=Asia Pacific (Hong Kong)
|
||||
SIGNING_REGION.ITEM.AP_SOUTHEAST_1=Asia Pacific (Singapore)
|
||||
SIGNING_REGION.ITEM.AP_SOUTHEAST_2=Asia Pacific (Sydney)
|
||||
SIGNING_REGION.ITEM.AP_NORTHEAST_1=Asia Pacific (Tokyo)
|
||||
SIGNING_REGION.ITEM.AP_NORTHEAST_2=Asia Pacific (Seoul)
|
||||
SIGNING_REGION.ITEM.AP_SOUTH_1=Asia Pacific (Mumbai)
|
||||
SIGNING_REGION.ITEM.CA_CENTRAL_1=Canada (Central)
|
||||
ACTION.ITEM.PAUSE_CLUSTER=Pause cluster
|
||||
ACTION.ITEM.RESUME_CLUSTER=Resume cluster
|
||||
NODE_TYPE.ITEM.ra3.4xlarge=ra3.4xlarge
|
||||
NODE_TYPE.ITEM.ra3.16xlarge=ra3.16xlarge
|
||||
|
||||
@@ -20,7 +20,7 @@ REGION.ITEM.CN_NORTH_1=Chine (P\u00E9kin)
|
||||
REGION.ITEM.AP_SOUTHEAST_1=Asie Pacifique (Singapour)
|
||||
REGION.ITEM.AP_SOUTHEAST_2=Asie Pacifique (Sydney)
|
||||
REGION.ITEM.AP_NORTHEAST_1=Asie Pacifique (Tokyo)
|
||||
REGION.ITEM.SA_EAST_1=South America (Sao Paulo)
|
||||
REGION.ITEM.SA_EAST_1=Am\u00E9rique du Sud (S\u00E3o Paulo)
|
||||
CREATE_SNAPSHOT_WHEN_DELETE_CLUSTER.NAME=Cr\u00E9er un snapshot
|
||||
SNAPSHOT_ID.NAME=ID du Snapshot
|
||||
CLUSTER_ID.NAME=iD du cluster
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
<IMPORTS>
|
||||
<IMPORT
|
||||
NAME="Talen File Enhanced"
|
||||
MODULE="talend_file_enhanced-1.1.jar" MVN="mvn:org.talend.components.lib/talend_file_enhanced/1.1" UrlPath="platform:/plugin/org.talend.libraries.custom/lib/talend_file_enhanced-1.1.jar"
|
||||
MODULE="talend_file_enhanced-1.0.jar" MVN="mvn:org.talend.components.lib/talend_file_enhanced/1.0" UrlPath="platform:/plugin/org.talend.libraries.custom/lib/talend_file_enhanced-1.0.jar"
|
||||
REQUIRED="true"
|
||||
/>
|
||||
</IMPORTS>
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
<DEFAULT>false</DEFAULT>
|
||||
</PARAMETER>
|
||||
|
||||
<PARAMETER NAME="DATE_PATTERN" GROUP="LOAD_DETAILS" FIELD="TEXT" NUM_ROW="15" SHOW_IF="isShow[DATE_FORMAT] AND (DATE_FORMAT == 'true')">
|
||||
<PARAMETER NAME="DATE_PATTERN" GROUP="LOAD_DETAILS" FIELD="TEXT" NUM_ROW="15" SHOW_IF="isShow[(DATE_FORMAT] AND (DATE_FORMAT == 'true')">
|
||||
<DEFAULT>"yyyy-MM-dd"</DEFAULT>
|
||||
</PARAMETER>
|
||||
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
ACCOUNT_NAME.NAME=Account Name
|
||||
AZURE_CONNECTION.NAME=Azure Storage Connection
|
||||
AZURE_LOCATION.NAME=Azure Storage Location
|
||||
AZURE_STORAGE.ITEM.ADLS=Data Lake Storage Gen1
|
||||
AZURE_STORAGE.ITEM.ADLS_GEN2=Data Lake Storage Gen2
|
||||
AZURE_STORAGE.ITEM.BLOB=Blob Storage
|
||||
AZURE_STORAGE.NAME=Azure Storage
|
||||
CLIENT_ID.NAME=Client Id
|
||||
COMPRESS.NAME=Compressed by
|
||||
COMPRESSION_ORC.ITEM.DEFAULT=Default
|
||||
COMPRESSION_ORC.ITEM.SNAPPY=Snappy
|
||||
COMPRESSION_PARQUET.ITEM.GZIP=GZip
|
||||
COMPRESSION_PARQUET.ITEM.SNAPPY=Snappy
|
||||
COMPRESSION_RC.ITEM.DEFAULT=Default
|
||||
COMPRESSION_TEXT.ITEM.DEFAULT=Default
|
||||
COMPRESSION_TEXT.ITEM.GZIP=GZip
|
||||
CONNECTION.NAME=Component List
|
||||
CONTAINER.NAME=Container
|
||||
DATE_FORMAT.ITEM.NONE=None
|
||||
DATE_FORMAT.ITEM.PATTERN=Pattern
|
||||
DATE_FORMAT.NAME=Date format
|
||||
DBNAME.NAME=Database
|
||||
DBTABLE.NAME=Table Name
|
||||
DB_CONFIG.NAME=Database settings
|
||||
DB_SCHEMA.NAME=Schema
|
||||
DIE_ON_ERROR.NAME=Die on error
|
||||
DISTRIBUTION.ITEM.HASH=Hash
|
||||
DISTRIBUTION.ITEM.REPLICATE=Replicate
|
||||
DISTRIBUTION.ITEM.ROUND_ROBIN=Round Robin
|
||||
DISTRIBUTION.NAME=Distribution Option
|
||||
DISTRIBUTION_COLUMN_NAME.NAME=Distribution Column Name
|
||||
DRIVER.NAME=JDBC Provider
|
||||
DRIVER.ITEM.MSSQL_PROP=Microsoft
|
||||
DW_TABLE_PROPERTIES.NAME=Synapse Analytics table properties
|
||||
ENABLE_SSL.NAME=Secure transfer required
|
||||
ENDPOINT.NAME=OAuth 2.0 token endpoint
|
||||
EXT_TABLE_OPTIONS.NAME=Data import reject options
|
||||
FIELDSEPARATOR.NAME=Field separator
|
||||
FILENAME.NAME=Filepath at local
|
||||
HELP=org.talend.help.tAzureSynapseBulkExec
|
||||
HOST.NAME=Host
|
||||
IMPORT_TYPE.ITEM.DELIMITED_TEXT=Delimited Text
|
||||
IMPORT_TYPE.ITEM.HIVE_ORC=Hive ORC
|
||||
IMPORT_TYPE.ITEM.HIVE_RCFILE=Hive RCFile
|
||||
IMPORT_TYPE.ITEM.PARQUET=Parquet
|
||||
IMPORT_TYPE.NAME=File format
|
||||
INDEX_COLUMNS.NAME=Index column(s)
|
||||
LOAD_DETAILS.NAME=Load Parameters
|
||||
LONG_NAME=Load data into Azure Synapse Analytics with PolyBase
|
||||
MAPPING.NAME=Mapping
|
||||
NB_LINE_INSERTED.NAME=Number of lines inserted
|
||||
PARTITION.NAME=Partition
|
||||
PARTITION_COLUMN_NAME.NAME=Partition column name
|
||||
PARTITION_COLUMN_NAME_RANGE.ITEM.LEFT=Left
|
||||
PARTITION_COLUMN_NAME_RANGE.ITEM.RIGHT=Right
|
||||
PARTITION_COLUMN_NAME_RANGE.NAME=Range
|
||||
PARTITION_VALUES.NAME=Partition For Values
|
||||
PASS.NAME=Password
|
||||
PORT.NAME=Port
|
||||
PRINCIPAL_KEY.NAME=Authentication key
|
||||
PROPERTIES.NAME=Additional JDBC Parameters
|
||||
PROPERTY.NAME=Property Type
|
||||
QUERY.NAME=Query
|
||||
REJECT.LINK=Rejects
|
||||
REJECT.MENU=Rejects
|
||||
REJECT_SAMPLE_VALUE.NAME=Reject sample value
|
||||
REJECT_TYPE.ITEM.Percentage=Percentage
|
||||
REJECT_TYPE.ITEM.Value=Value
|
||||
REJECT_TYPE.NAME=Reject type
|
||||
REJECT_VALUE.NAME=Reject value
|
||||
ROWSEPARATOR.NAME=Row separator
|
||||
SCHEMA_FLOW.NAME=Schema
|
||||
SECRET_KEY.NAME=Access key
|
||||
SERDE_METHOD.ITEM.COLUMNAR=Columnar
|
||||
SERDE_METHOD.ITEM.LAZY=Lazy Binary
|
||||
SERDE_METHOD.NAME=Serde Method
|
||||
SQL_SYNTAX.NAME=Sql Syntax
|
||||
STRING_QUOTE.NAME=String Quote
|
||||
TABLE.NAME=Table
|
||||
TABLE_ACTION.ITEM.CLEAR=Clear table
|
||||
TABLE_ACTION.ITEM.CREATE=Create table
|
||||
TABLE_ACTION.ITEM.CREATE_IF_NOT_EXISTS=Create table if not exists
|
||||
TABLE_ACTION.ITEM.DROP_CREATE=Drop and create table
|
||||
TABLE_ACTION.ITEM.DROP_IF_EXISTS_AND_CREATE=Drop table if exists and create
|
||||
TABLE_ACTION.ITEM.NONE=None
|
||||
TABLE_ACTION.ITEM.TRUNCATE=Truncate table
|
||||
TABLE_ACTION.NAME=Action on table
|
||||
TABLE_OPTION.ITEM.CLUSTERED_COLUMNSTORE_INDEX=Clustered Columnstore Index
|
||||
TABLE_OPTION.ITEM.CLUSTERED_INDEX=Clustered Index
|
||||
TABLE_OPTION.ITEM.HEAP=Heap
|
||||
TABLE_OPTION.NAME=Table Option
|
||||
TYPE.NAME=Database Driver
|
||||
USER.NAME=Username
|
||||
USE_EXISTING_CONNECTION.NAME=Use an existing connection
|
||||
USE_STRING_DELIMITER.NAME=Enclosed by
|
||||
USE_TYPE_DEFAULT.ITEM.FALSE=False
|
||||
USE_TYPE_DEFAULT.ITEM.TRUE=True
|
||||
USE_TYPE_DEFAULT.NAME=Use type default
|
||||
ACTIVE_DIR_AUTH.NAME=Authenticate using Azure Active Directory
|
||||
LOAD_METHOD.NAME=Load method
|
||||
LOAD_METHOD.ITEM.POLYBASE=PolyBase
|
||||
LOAD_METHOD.ITEM.COPY=Copy
|
||||
AUTH_METHOD.NAME=Authentication method
|
||||
AUTH_METHOD.ITEM.SAS=Shared Access Signatures
|
||||
AUTH_METHOD.ITEM.KEY=Storage account key
|
||||
AUTH_METHOD.ITEM.AAD=Azure Active Directory
|
||||
SAS_TOKEN.NAME=SAS token
|
||||
ENDPOINT_SUFFIX.NAME=Endpoint suffix
|
||||
EXTERNAL_LOCATIONS.NAME=External paths
|
||||
EXTERNAL_LOCATIONS.ITEM.EXTERNAL_LOCATION=Path
|
||||
SPECIFY_FIELDS_MAPPING.NAME=Specify map to source data fields
|
||||
COLUMN_MAP_FIELD.ITEM.FIELD_INDEX=Source field index
|
||||
FILE_TYPE.NAME=File type
|
||||
FILE_TYPE.ITEM.CSV=CSV
|
||||
FILE_TYPE.ITEM.ORC=ORC
|
||||
FILE_TYPE.ITEM.PARQUET=PARQUET
|
||||
FIRST_ROW.NAME=First row
|
||||
FIELD_QUOTE.NAME=Field quote
|
||||
FIELD_TERMINATOR.NAME=Field terminator
|
||||
ROW_TERMINATOR.NAME=Row terminator
|
||||
COPY_CSV_DATE_FORMAT.NAME=Date format
|
||||
COPY_CSV_DATE_FORMAT.ITEM.SESSION_DATEFORMAT=Session date format
|
||||
COPY_CSV_DATE_FORMAT.ITEM.MDY=mdy
|
||||
COPY_CSV_DATE_FORMAT.ITEM.DMY=dmy
|
||||
COPY_CSV_DATE_FORMAT.ITEM.YMD=ymd
|
||||
COPY_CSV_DATE_FORMAT.ITEM.YDM=ydm
|
||||
COPY_CSV_DATE_FORMAT.ITEM.MYD=myd
|
||||
COPY_CSV_DATE_FORMAT.ITEM.DYM=dym
|
||||
ENCODING.NAME=Encoding
|
||||
ENCODING.ITEM.UTF8=UTF8
|
||||
ENCODING.ITEM.UTF16=UTF16
|
||||
IDENTITY_INSERT.NAME=Identity insert
|
||||
MAX_ERRORS.NAME=Max errors
|
||||
ERROR_FILE.NAME=Error file location
|
||||
@@ -0,0 +1,4 @@
|
||||
AZURE_STORAGE.ITEM.ADLS=Data Lake Storage Gen1
|
||||
AZURE_STORAGE.ITEM.ADLS_GEN2=Data Lake Storage Gen2
|
||||
ENABLE_SSL.NAME=Transfert s\u00E9curis\u00E9 requis
|
||||
HELP=org.talend.help.tAzureSynapseBulkExec
|
||||
@@ -0,0 +1,4 @@
|
||||
AZURE_STORAGE.ITEM.ADLS=Data Lake Storage Gen1
|
||||
AZURE_STORAGE.ITEM.ADLS_GEN2=Data Lake Storage Gen2
|
||||
ENABLE_SSL.NAME=\u30BB\u30AD\u30E5\u30A2\u306A\u8EE2\u9001\u304C\u5FC5\u8981
|
||||
HELP=org.talend.help.tAzureSynapseBulkExec
|
||||
@@ -0,0 +1,3 @@
|
||||
HELP=org.talend.help.tAzureSynapseClose
|
||||
LONG_NAME=Close a selected MSSql connection.
|
||||
CONNECTION.NAME=Component List
|
||||
@@ -0,0 +1 @@
|
||||
HELP=org.talend.help.tAzureSynapseClose
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user