From f04ab389718a88d59316bd59edab0ac730f54809 Mon Sep 17 00:00:00 2001 From: CHERRO Date: Tue, 22 Aug 2023 14:07:25 -0300 Subject: [PATCH] DHFPROD-10546: Remove Spark connector code from DHF repo --- CODEOWNERS | 2 - Jenkinsfile | 12 +- .../hub/central/schemas/ExternalMetadata.java | 73 - marklogic-data-hub-spark-connector/.gitignore | 2 - .../LICENSE.txt | 80 - marklogic-data-hub-spark-connector/NOTICE.txt | 8841 ----------------- marklogic-data-hub-spark-connector/README.md | 33 - .../build.gradle | 97 - .../gradle.properties | 8 - .../spark-test-project/.gitignore | 2 - .../spark-test-project/README.md | 64 - .../spark-test-project/build.gradle | 46 - .../spark-test-project/gradle.properties | 9 - .../gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - .../spark-test-project/gradlew | 185 - .../spark-test-project/gradlew.bat | 104 - .../spark-test-project/settings.gradle | 2 - .../main/java/org/example/ExampleSupport.java | 52 - .../org/example/ReadCustomersFromFinal.java | 49 - .../StreamingWriteCustomersToStaging.java | 70 - .../org/example/WriteCustomersToStaging.java | 56 - .../src/main/resources/data/customers.csv | 6 - .../src/main/resources/log4j.properties | 18 - .../hub/spark/dataservices/SparkService.java | 195 - .../spark/sql/sources/v2/DefaultSource.java | 66 - .../spark/sql/sources/v2/ModuleWriter.java | 54 - .../hub/spark/sql/sources/v2/Util.java | 22 - .../v2/reader/HubDataSourceReader.java | 226 - .../sources/v2/reader/HubInputPartition.java | 32 - .../v2/reader/HubInputPartitionReader.java | 141 - .../sql/sources/v2/reader/JsonRowParser.java | 38 - .../writer/AtLeastOneWriteFailedMessage.java | 10 - .../v2/writer/HubDataSourceWriter.java | 304 - .../sql/sources/v2/writer/HubDataWriter.java | 124 - .../v2/writer/HubDataWriterFactory.java | 53 - .../v2/AbstractSparkConnectorTest.java | 280 - .../sources/v2/BuildHubClientConfigTest.java | 61 - .../hub/spark/sql/sources/v2/Options.java | 246 - .../v2/reader/AbstractSparkReadTest.java | 121 - .../sources/v2/reader/ParseJsonRowTest.java | 40 - .../v2/reader/ReadAllDataTypesTest.java | 90 - .../v2/reader/ReadArraysAndMapsTest.java | 160 - ...adModulesWrittenToModulesDatabaseTest.java | 35 - .../v2/reader/ReadSimpleCustomersTest.java | 86 - .../v2/reader/ReadViaSerializedPlanTest.java | 88 - .../reader/ReadWithCustomEndpointsTest.java | 65 - .../ReadWithCustomOptimizationlevelTest.java | 60 - .../ReadWithCustomPartitionCountTest.java | 38 - .../reader/ReadWithCustomSparkSchemaTest.java | 77 - .../reader/ReadWithSelectedColumnsTest.java | 57 - .../v2/writer/HandleAbortedWriterTest.java | 44 - .../v2/writer/HandleFailedWriteTest.java | 79 - .../v2/writer/VerifyUserIsAuthorizedTest.java | 32 - .../sql/sources/v2/writer/WriteDataTest.java | 186 - .../WriteDataViaCustomEndpointTest.java | 92 - .../v2/writer/WriteDataWithOptionsTest.java | 68 - .../writer/WriteDataWithUriTemplateTest.java | 75 - .../WriteJobWithCustomEndpointsTest.java | 86 - .../sources/v2/writer/WriteJobsDataTest.java | 108 - .../custom-ingestion-endpoint/endpoint.api | 32 - .../custom-ingestion-endpoint/endpoint.sjs | 37 - .../custom-job-endpoints/finalizeWrite.api | 14 - .../custom-job-endpoints/finalizeWrite.sjs | 37 - .../custom-job-endpoints/initializeWrite.api | 15 - .../custom-job-endpoints/initializeWrite.sjs | 41 - .../custom-read-endpoints/customReadRows.api | 23 - .../custom-read-endpoints/customReadRows.sjs | 32 - .../custom-read-endpoints/initializeRead.api | 15 - .../custom-read-endpoints/initializeRead.sjs | 49 - .../resources/entityInstances/User/user1.json | 33 - .../test/resources/junit-platform.properties | 2 - .../src/test/resources/log4j.properties | 18 - .../CustomerIdLessThanFive.json | 31 - .../GroupAndOrderByCustomerId.json | 62 - .../test/resources/tde-views/Customer.tdex | 98 - .../src/test/resources/tde-views/User.tdex | 265 - marklogic-data-hub/build.gradle | 6 - .../finalizeWrite.api | 16 - .../finalizeWrite.sjs | 36 - .../initializeRead.api | 17 - .../initializeRead.sjs | 120 - .../initializeWrite.api | 17 - .../initializeWrite.sjs | 45 - .../partition-lib.xqy | 87 - .../readLib.sjs | 275 - .../readRows.api | 25 - .../readRows.sjs | 49 - .../service.json | 5 - .../writeLib.sjs | 149 - .../writeRecords.api | 22 - .../writeRecords.sjs | 43 - .../marklogic/hub/flow/TemporalWriteTest.java | 39 - .../lib/ingestionService.mjs | 10 - .../partitionLib/getPartitionBatchTest.mjs | 52 - .../partitionLib/makePartitionsTest.mjs | 51 - .../writeLib/convertPropertyValueToString.mjs | 59 - .../writeRecords/ingestOnlySourceName.mjs | 21 - .../writeRecords/ingestOnlySourceType.mjs | 21 - .../ingestWithAllWorkUnitParams.mjs | 40 - .../ingestWithOnlyCollections.mjs | 21 - .../writeRecords/ingestWithOnlyUriPrefix.mjs | 24 - .../writeRecords/ingestionWithNullParams.mjs | 39 - .../writeRecords/setup.xqy | 3 - settings.gradle | 1 - specs/models/Job.schema.json | 4 - 106 files changed, 5 insertions(+), 15451 deletions(-) delete mode 100644 marklogic-data-hub-central/src/main/java/com/marklogic/hub/central/schemas/ExternalMetadata.java delete mode 100644 marklogic-data-hub-spark-connector/.gitignore delete mode 100644 marklogic-data-hub-spark-connector/LICENSE.txt delete mode 100644 marklogic-data-hub-spark-connector/NOTICE.txt delete mode 100644 marklogic-data-hub-spark-connector/README.md delete mode 100644 marklogic-data-hub-spark-connector/build.gradle delete mode 100644 marklogic-data-hub-spark-connector/gradle.properties delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/.gitignore delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/README.md delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/build.gradle delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/gradle.properties delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/gradle/wrapper/gradle-wrapper.jar delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/gradle/wrapper/gradle-wrapper.properties delete mode 100755 marklogic-data-hub-spark-connector/spark-test-project/gradlew delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/gradlew.bat delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/settings.gradle delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/ExampleSupport.java delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/ReadCustomersFromFinal.java delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/StreamingWriteCustomersToStaging.java delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/WriteCustomersToStaging.java delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/src/main/resources/data/customers.csv delete mode 100644 marklogic-data-hub-spark-connector/spark-test-project/src/main/resources/log4j.properties delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/dataservices/SparkService.java delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/DefaultSource.java delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/ModuleWriter.java delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/Util.java delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubDataSourceReader.java delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubInputPartition.java delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubInputPartitionReader.java delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/JsonRowParser.java delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/AtLeastOneWriteFailedMessage.java delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataSourceWriter.java delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataWriter.java delete mode 100644 marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataWriterFactory.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/AbstractSparkConnectorTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/BuildHubClientConfigTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/Options.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/AbstractSparkReadTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ParseJsonRowTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadAllDataTypesTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadArraysAndMapsTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadModulesWrittenToModulesDatabaseTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadSimpleCustomersTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadViaSerializedPlanTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomEndpointsTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomOptimizationlevelTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomPartitionCountTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomSparkSchemaTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithSelectedColumnsTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/HandleAbortedWriterTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/HandleFailedWriteTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/VerifyUserIsAuthorizedTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataViaCustomEndpointTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataWithOptionsTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataWithUriTemplateTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteJobWithCustomEndpointsTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteJobsDataTest.java delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/custom-ingestion-endpoint/endpoint.api delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/custom-ingestion-endpoint/endpoint.sjs delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/finalizeWrite.api delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/finalizeWrite.sjs delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/initializeWrite.api delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/initializeWrite.sjs delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/customReadRows.api delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/customReadRows.sjs delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/initializeRead.api delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/initializeRead.sjs delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/entityInstances/User/user1.json delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/junit-platform.properties delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/log4j.properties delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/serialized-plans/CustomerIdLessThanFive.json delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/serialized-plans/GroupAndOrderByCustomerId.json delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/tde-views/Customer.tdex delete mode 100644 marklogic-data-hub-spark-connector/src/test/resources/tde-views/User.tdex delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/finalizeWrite.api delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/finalizeWrite.sjs delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeRead.api delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeRead.sjs delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeWrite.api delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeWrite.sjs delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/partition-lib.xqy delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readLib.sjs delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readRows.api delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readRows.sjs delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/service.json delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeLib.sjs delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeRecords.api delete mode 100644 marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeRecords.sjs delete mode 100644 marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/lib/ingestionService.mjs delete mode 100644 marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/partitionLib/getPartitionBatchTest.mjs delete mode 100644 marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/partitionLib/makePartitionsTest.mjs delete mode 100644 marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeLib/convertPropertyValueToString.mjs delete mode 100644 marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestOnlySourceName.mjs delete mode 100644 marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestOnlySourceType.mjs delete mode 100644 marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithAllWorkUnitParams.mjs delete mode 100644 marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithOnlyCollections.mjs delete mode 100644 marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithOnlyUriPrefix.mjs delete mode 100644 marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestionWithNullParams.mjs delete mode 100644 marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/setup.xqy diff --git a/CODEOWNERS b/CODEOWNERS index fdeea900b7..745f45172a 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -10,6 +10,4 @@ marklogic-data-hub-central/src/* @ryanjdew @rahulvudutala marklogic-data-hub-central/ui/* @wooldridge @briantang @Sanjeevani19 @rahulvudutala @aniamy -marklogic-data-hub-spark-connector/* @anu3990 @SameeraPriyathamTadikonda - specs/* @ryanjdew diff --git a/Jenkinsfile b/Jenkinsfile index 22b11eb857..a458f0d248 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -34,7 +34,7 @@ def dhflinuxTests(String mlVersion,String type){ props = readProperties file:'data-hub/pipeline.properties'; copyRPM type,mlVersion def dockerhost=setupMLDockerCluster 3 - sh 'docker exec -u builder -i '+dockerhost+' /bin/sh -c "su -builder;export JAVA_HOME=`eval echo "$JAVA_HOME_DIR"`;export GRADLE_USER_HOME=$WORKSPACE$GRADLE_DIR;export M2_HOME=$MAVEN_HOME/bin;export PATH=$JAVA_HOME/bin:$GRADLE_USER_HOME:$PATH:$MAVEN_HOME/bin;cd $WORKSPACE/data-hub;rm -rf $GRADLE_USER_HOME/caches;./gradlew clean;set +e;./gradlew marklogic-data-hub:bootstrapAndTest -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew marklogic-data-hub-central:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/ |& tee console.log;sleep 10s;./gradlew ml-data-hub:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew marklogic-data-hub-spark-connector:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew installer-for-dhs:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew marklogic-data-hub-client-jar:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew ml-data-hub:testFullCycle -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;"' + sh 'docker exec -u builder -i '+dockerhost+' /bin/sh -c "su -builder;export JAVA_HOME=`eval echo "$JAVA_HOME_DIR"`;export GRADLE_USER_HOME=$WORKSPACE$GRADLE_DIR;export M2_HOME=$MAVEN_HOME/bin;export PATH=$JAVA_HOME/bin:$GRADLE_USER_HOME:$PATH:$MAVEN_HOME/bin;cd $WORKSPACE/data-hub;rm -rf $GRADLE_USER_HOME/caches;./gradlew clean;set +e;./gradlew marklogic-data-hub:bootstrapAndTest -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew marklogic-data-hub-central:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/ |& tee console.log;sleep 10s;./gradlew ml-data-hub:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew installer-for-dhs:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew marklogic-data-hub-client-jar:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew ml-data-hub:testFullCycle -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;"' junit '**/TEST-*.xml' def output=readFile 'data-hub/console.log' def result=false; @@ -107,7 +107,6 @@ def dhfWinTests(String mlVersion, String type){ bat 'set PATH=C:\\Program Files\\OpenJDK\\jdk-8.0.262.10-hotspot\\bin;$PATH & cd data-hub & gradlew.bat marklogic-data-hub:bootstrapAndTest || exit /b 0' bat 'set PATH=C:\\Program Files\\OpenJDK\\jdk-8.0.262.10-hotspot\\bin;$PATH & cd data-hub & gradlew.bat marklogic-data-hub-central:test || exit /b 0' bat 'set PATH=C:\\Program Files\\OpenJDK\\jdk-8.0.262.10-hotspot\\bin;$PATH & cd data-hub & gradlew.bat ml-data-hub:test || exit /b 0' - bat 'set PATH=C:\\Program Files\\OpenJDK\\jdk-8.0.262.10-hotspot\\bin;$PATH & cd data-hub & gradlew.bat marklogic-data-hub-spark-connector:test || exit /b 0' junit '**/TEST-*.xml' } } @@ -131,7 +130,6 @@ script{ bat 'set PATH=C:\\Program Files\\OpenJDK\\jdk-8.0.262.10-hotspot\\bin;$PATH & cd data-hub & gradlew.bat marklogic-data-hub:bootstrapAndTest || exit /b 0' bat 'set PATH=C:\\Program Files\\OpenJDK\\jdk-8.0.262.10-hotspot\\bin;$PATH & cd data-hub & gradlew.bat marklogic-data-hub-central:test || exit /b 0' bat 'set PATH=C:\\Program Files\\OpenJDK\\jdk-8.0.262.10-hotspot\\bin;$PATH & cd data-hub & gradlew.bat ml-data-hub:test || exit /b 0' - bat 'set PATH=C:\\Program Files\\OpenJDK\\jdk-8.0.262.10-hotspot\\bin;$PATH & cd data-hub & gradlew.bat marklogic-data-hub-spark-connector:test || exit /b 0' junit '**/TEST-*.xml' } } @@ -240,9 +238,9 @@ void UnitTest(){ props = readProperties file:'data-hub/pipeline.properties'; copyRPM 'Release','10.0-10' setUpML '$WORKSPACE/xdmp/src/Mark*.rpm' - sh 'export JAVA_HOME=`eval echo "$JAVA_HOME_DIR"`;export GRADLE_USER_HOME=$WORKSPACE$GRADLE_DIR;export M2_HOME=$MAVEN_HOME/bin;export PATH=$JAVA_HOME/bin:$GRADLE_USER_HOME:$PATH:$MAVEN_HOME/bin;cd $WORKSPACE/data-hub;rm -rf $GRADLE_USER_HOME/caches;./gradlew clean;./gradlew marklogic-data-hub:bootstrap -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew marklogic-data-hub-central:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew ml-data-hub:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew marklogic-data-hub-spark-connector:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew installer-for-dhs:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew marklogic-data-hub-client-jar:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/' + sh 'export JAVA_HOME=`eval echo "$JAVA_HOME_DIR"`;export GRADLE_USER_HOME=$WORKSPACE$GRADLE_DIR;export M2_HOME=$MAVEN_HOME/bin;export PATH=$JAVA_HOME/bin:$GRADLE_USER_HOME:$PATH:$MAVEN_HOME/bin;cd $WORKSPACE/data-hub;rm -rf $GRADLE_USER_HOME/caches;./gradlew clean;./gradlew marklogic-data-hub:bootstrap -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew marklogic-data-hub-central:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew ml-data-hub:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew installer-for-dhs:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew marklogic-data-hub-client-jar:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/' junit '**/TEST-*.xml' - jacoco classPattern: 'data-hub/marklogic-data-hub-central/build/classes/java/main/com/marklogic/hub/central,data-hub/marklogic-data-hub-spark-connector/build/classes/java/main/com/marklogic/hub/spark,data-hub/marklogic-data-hub/build/classes/java/main/com/marklogic/hub',exclusionPattern: '**/*Test*.class' + jacoco classPattern: 'data-hub/marklogic-data-hub-central/build/classes/java/main/com/marklogic/hub/central,data-hub/marklogic-data-hub/build/classes/java/main/com/marklogic/hub',exclusionPattern: '**/*Test*.class' if(env.CHANGE_TITLE){ JIRA_ID=env.CHANGE_TITLE.split(':')[0] jiraAddComment comment: 'Jenkins Unit Test Results For PR Available', failOnError: false, idOrKey: JIRA_ID, site: 'JIRA' @@ -334,7 +332,7 @@ void BuildDatahub(){ } println(BRANCH_NAME) sh 'export JAVA_HOME=`eval echo "$JAVA_HOME_DIR"`;export GRADLE_USER_HOME=$WORKSPACE$GRADLE_DIR;export M2_HOME=$MAVEN_HOME/bin;export PATH=$JAVA_HOME/bin:$GRADLE_USER_HOME:$PATH:$MAVEN_HOME/bin;cd $WORKSPACE/data-hub;rm -rf $GRADLE_USER_HOME/caches;./gradlew clean;./gradlew build -x test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/ --parallel;' - archiveArtifacts artifacts: 'data-hub/marklogic-data-hub/build/libs/* , data-hub/ml-data-hub-plugin/build/libs/* , data-hub/marklogic-data-hub-central/build/libs/* , data-hub/marklogic-data-hub-central/build/**/*.rpm , data-hub/marklogic-data-hub-spark-connector/build/libs/* , data-hub/installer-for-dhs/build/libs/marklogic* , data-hub/marklogic-data-hub-client-jar/build/libs/*client.jar ', onlyIfSuccessful: true + archiveArtifacts artifacts: 'data-hub/marklogic-data-hub/build/libs/* , data-hub/ml-data-hub-plugin/build/libs/* , data-hub/marklogic-data-hub-central/build/libs/* , data-hub/marklogic-data-hub-central/build/**/*.rpm , data-hub/installer-for-dhs/build/libs/marklogic* , data-hub/marklogic-data-hub-client-jar/build/libs/*client.jar ', onlyIfSuccessful: true } @@ -697,7 +695,7 @@ void singleNodeTestOnLinux(String type,String mlVersion){ props = readProperties file:'data-hub/pipeline.properties'; copyRPM type,mlVersion setUpML '$WORKSPACE/xdmp/src/Mark*.rpm' - sh 'export JAVA_HOME="$JAVA_HOME_DIR";export M2_HOME="$MAVEN_HOME";export PATH="$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH";cd $WORKSPACE/data-hub;./gradlew -g ./cache-build clean;set +e;./gradlew -g ./cache-build marklogic-data-hub:bootstrapAndTest -Dorg.gradle.jvmargs=-Xmx1g -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew -g ./cache-build ml-data-hub:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew -g ./cache-build web:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew -g ./cache-build marklogic-data-hub-central:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/ |& tee console.log;sleep 10s;./gradlew -g ./cache-build marklogic-data-hub-spark-connector:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew -g ./cache-build marklogic-data-hub-spark-connector:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;' + sh 'export JAVA_HOME="$JAVA_HOME_DIR";export M2_HOME="$MAVEN_HOME";export PATH="$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH";cd $WORKSPACE/data-hub;./gradlew -g ./cache-build clean;set +e;./gradlew -g ./cache-build marklogic-data-hub:bootstrapAndTest -Dorg.gradle.jvmargs=-Xmx1g -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew -g ./cache-build ml-data-hub:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew -g ./cache-build web:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/;sleep 10s;./gradlew -g ./cache-build marklogic-data-hub-central:test -i --stacktrace -PnodeDistributionBaseUrl=http://node-mirror.eng.marklogic.com:8080/ |& tee console.log;sleep 10s;' junit '**/TEST-*.xml' def output=readFile 'data-hub/console.log' def result=false; diff --git a/marklogic-data-hub-central/src/main/java/com/marklogic/hub/central/schemas/ExternalMetadata.java b/marklogic-data-hub-central/src/main/java/com/marklogic/hub/central/schemas/ExternalMetadata.java deleted file mode 100644 index 9da973fb98..0000000000 --- a/marklogic-data-hub-central/src/main/java/com/marklogic/hub/central/schemas/ExternalMetadata.java +++ /dev/null @@ -1,73 +0,0 @@ - -package com.marklogic.hub.central.schemas; - -import java.util.HashMap; -import java.util.Map; -import javax.annotation.Generated; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - - -/** - * Captures metadata related to Spark when a document is ingested via the Data Hub Spark connector - * - */ -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonPropertyOrder({ - -}) -@Generated("jsonschema2pojo") -public class ExternalMetadata { - - @JsonIgnore - private Map additionalProperties = new HashMap(); - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - @JsonAnySetter - public void setAdditionalProperty(String name, Object value) { - this.additionalProperties.put(name, value); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(ExternalMetadata.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); - sb.append("additionalProperties"); - sb.append('='); - sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); - sb.append(','); - if (sb.charAt((sb.length()- 1)) == ',') { - sb.setCharAt((sb.length()- 1), ']'); - } else { - sb.append(']'); - } - return sb.toString(); - } - - @Override - public int hashCode() { - int result = 1; - result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); - return result; - } - - @Override - public boolean equals(Object other) { - if (other == this) { - return true; - } - if ((other instanceof ExternalMetadata) == false) { - return false; - } - ExternalMetadata rhs = ((ExternalMetadata) other); - return ((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))); - } - -} diff --git a/marklogic-data-hub-spark-connector/.gitignore b/marklogic-data-hub-spark-connector/.gitignore deleted file mode 100644 index 6f8ee8d982..0000000000 --- a/marklogic-data-hub-spark-connector/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Ignore this directory; files will be copied to it from the core project via a Gradle task -src/main/resources/marklogic-data-hub-spark-connector diff --git a/marklogic-data-hub-spark-connector/LICENSE.txt b/marklogic-data-hub-spark-connector/LICENSE.txt deleted file mode 100644 index c748542efe..0000000000 --- a/marklogic-data-hub-spark-connector/LICENSE.txt +++ /dev/null @@ -1,80 +0,0 @@ -Copyright © 2021 MarkLogic Corporation. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - -(b) You must cause any modified files to carry prominent notices stating that You changed the files; and - -(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - -You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. \ No newline at end of file diff --git a/marklogic-data-hub-spark-connector/NOTICE.txt b/marklogic-data-hub-spark-connector/NOTICE.txt deleted file mode 100644 index dbff19ff04..0000000000 --- a/marklogic-data-hub-spark-connector/NOTICE.txt +++ /dev/null @@ -1,8841 +0,0 @@ -MarkLogic® Data Hub and supporting products - -Copyright © 2021 MarkLogic Corporation. MarkLogic and the MarkLogic logo are trademarks or registered trademarks of MarkLogic Corporation in the United States and other countries. All other trademarks are the property of their respective owners. - -This project is licensed under the Apache License, Version 2.0 (the "License"); you may not use this project except in compliance with the License. You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -To the extent required by the applicable open source license, a complete machine-readable copy of the source code corresponding to such code is available upon request. This offer is valid to anyone in receipt of this information and shall expire three years following the date of the final distribution of this product version by MarkLogic. To obtain such source code, send an email to legal@marklogic.com. Please specify the product and version for which you are requesting source code. - -The following software may be included in this project (last updated January 22, 2021): - - -  -@angular-mdl/core 6.0.1 -Attribution Statements -http://mseemann.io/angular2-mdl/ - -Copyright Statements -Copyright (c) 2014-2016 Google, Inc. http://angular.io - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/mseemann/angular2-mdl -@angular-mdl/popover 6.0.0 -Attribution Statements -https://www.npmjs.com/package/@angular-mdl/popover - -Copyright Statements -Copyright (c) 2016 Michael Seemann - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/mseemann/angular2-mdl-ext -@angular-mdl/select 6.0.0 -Attribution Statements -https://www.npmjs.com/package/@angular-mdl/select - -Copyright Statements -Copyright (c) 2016 Michael Seemann - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/mseemann/angular2-mdl-ext -@angular/core 6.0.2 -Attribution Statements -https://angular.io/ - -Copyright Statements -Copyright (C) 2018, angular - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/angular/angular -@angular/core 6.1.10 -Attribution Statements -https://angular.io/ - -Copyright Statements -Copyright (C) 2018, angular - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/angular/angular -@ngrx/core 1.2.0 -Attribution Statements -https://github.com/ngrx/core - -Copyright Statements -Copyright (c) 2016 Brandon Roberts, Mike Ryan, Rob Wormald - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/ngrx/core -@ngrx/effects 6.1.2 -Attribution Statements -https://github.com/ngrx/effects - -Copyright Statements -Copyright (C) 2018, NgRx - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/ngrx/effects -@ngrx/router-store 6.1.2 -Attribution Statements -https://github.com/ngrx/router-store - -Copyright Statements -Copyright (C) 2018, NgRx - -License Text (http://spdx.org/licenses/MIT) -MIT License - -Copyright (c) 2018 NgRx - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -Source materials are available for download at: https://github.com/ngrx/platform -@ngrx/store 6.1.2 -Attribution Statements -https://github.com/ngrx/store - -Copyright Statements -Copyright (C) 2018, NgRx - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/ngrx/platform -ag-Grid 16.0.0 -Attribution Statements -https://www.ag-grid.com/ - -Copyright Statements -Copyright (C) 2017, Niall Crosby - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/ag-grid/ag-grid -ag-Grid Angular Component 16.0.0 -Attribution Statements -https://www.ag-grid.com/ - -Copyright Statements -Copyright (c) 2015-2016 AG GRID LTD - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/ag-grid/ag-grid-angular -ajv 6.12.4 -Attribution Statements -https://github.com/ajv-validator/ajv - -Copyright Statements -Copyright (c) 2015-2017 Evgeny Poberezkin - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/ajv-validator/ajv -Angular 7.3.0 -Attribution Statements -https://angular.io/ - -Copyright Statements -Copyright (c) 2014-2017 Google, Inc. http://angular.io - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/angular/angular -Angular CLI 7.3.1 -Attribution Statements -https://cli.angular.io/ - -Copyright Statements -Copyright (c) 2017 Google, Inc. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/angular/angular-cli -Angular Material 7.3.1 -Attribution Statements -https://material.angular.io/ - -Copyright Statements -Copyright (c) 2019 Google LLC. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/angular/components -angular-highcharts 6.2.6 -Attribution Statements -https://github.com/cebor/angular-highcharts - -Copyright Statements -Copyright (c) 2017 Felix Itzenplitz - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/cebor/angular-highcharts -Apache Avro™ 1.8.1 -Attribution Statements -http://avro.apache.org - -NUnit license acknowledgement: - -| Portions Copyright © 2002-2012 Charlie Poole or Copyright © 2002-2004 James -| W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright © 2000-2002 -| Philip A. Craig - -Based upon the representations of upstream licensors, it is understood that -portions of the mapreduce API included in the Java implementation are licensed -from various contributors under one or more contributor license agreements to -Odiago, Inc. and were then contributed by Odiago to Apache Avro, which has now -made them available under the Apache 2.0 license. The original file header text -is: - -| Licensed to Odiago, Inc. under one or more contributor license -| agreements. See the NOTICE file distributed with this work for -| additional information regarding copyright ownership. Odiago, Inc. -| licenses this file to you under the Apache License, Version 2.0 -| (the "License"); you may not use this file except in compliance -| with the License. You may obtain a copy of the License at -| -| http://www.apache.org/licenses/LICENSE-2.0 -| -| Unless required by applicable law or agreed to in writing, software -| distributed under the License is distributed on an "AS IS" BASIS, -| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -| implied. See the License for the specific language governing -| permissions and limitations under the License. - -The Odiago NOTICE at the time of the contribution: - -| This product includes software developed by Odiago, Inc. -| (http://www.wibidata.com). - -Apache Ivy includes the following in its NOTICE file: - -| Apache Ivy -| Copyright 2007-2010 The Apache Software Foundation -| -| This product includes software developed by -| The Apache Software Foundation (http://www.apache.org/). -| -| Portions of Ivy were originally developed by -| Jayasoft SARL (http://www.jayasoft.fr/) -| and are licensed to the Apache Software Foundation under the -| "Software Grant License Agreement" -| -| SSH and SFTP support is provided by the JCraft JSch package, -| which is open source software, available under -| the terms of a BSD style license. -| The original software and related information is available -| at http://www.jcraft.com/jsch/. - -Apache Log4Net includes the following in its NOTICE file: - -| Apache log4net -| Copyright 2004-2015 The Apache Software Foundation -| -| This product includes software developed at -| The Apache Software Foundation (http://www.apache.org/). - -Copyright Statements -Copyright (C) 2017, The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/apache/avro -Apache Commons BeanUtils™ 1.9.4 -Attribution Statements -https://commons.apache.org/proper/commons-beanutils/ - -Copyright Statements -Copyright (C) 2019, Robert Burrell Donkin, Tim O'Brien, Benedikt Ritter, Stian Soiland-Reyes, David Eric Pugh, Morgan James Delagrange, Yoav Shapira, Martin van den Bemt, Craig McClanahan, Gary Gregory, Geir Magnusson Jr., Stephen Colebourne, Scott Sanders, Niall Pemberton, Rob Tompkins, James Strachan, James Carman, John E. Conlon, The Apache Software Foundation, Dion Gillard, Rodney Waldhoff, Simon Kitching - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://commons.apache.org/proper/commons-beanutils/ -Apache Commons CLI™ 1.2 -Attribution Statements -http://commons.apache.org/proper/commons-cli/ - -Copyright Statements -Copyright 2001-2019 The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://mvnrepository.com/artifact/commons-cli/commons-cli/1.2 -Apache Commons Codec™ 1.4 -Attribution Statements -http://commons.apache.org/proper/commons-codec/ - -src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java -contains test data from http://aspell.net/test/orig/batch0.tab. -Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org) - -The content of package org.apache.commons.codec.language.bm has been translated -from the original php source code available at http://stevemorse.org/phoneticinfo.htm -with permission from the original authors. -Original source copyright: -Copyright (c) 2008 Alexander Beider & Stephen P. Morse. - -Copyright Statements -Copyright 2002-2016 The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://mvnrepository.com/artifact/commons-codec/commons-codec/1.4 -Apache Commons Collections™ 3.2.1 -Attribution Statements -https://commons.apache.org/proper/commons-collections/ - -Copyright Statements -Copyright 2001-2018 The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://mvnrepository.com/artifact/commons-collections/commons-collections -Apache Commons Configuration™ 1.6 -Attribution Statements -https://commons.apache.org/proper/commons-configuration/ - -Copyright Statements -Copyright 2001-2019 The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://mvnrepository.com/artifact/commons-configuration/commons-configuration/1.6 -Apache Commons CSV™ 1.5 -Attribution Statements -http://commons.apache.org/proper/commons-csv/ - -Modifications copyright © 2017 MarkLogic Corporation. -September 2017 MarkLogic modified the parser to include the byte count of the original data read. - -Apache Commons CSV may include the following software under license: -Apache Commons IO 2.5 (Apache-2.0) - Copyright 2002-2016 The Apache Software Foundation -Apache Commons Lang 3.6 (Apache-2.0) - Copyright (C) 2017, The Apache Software Foundation -H2 Database Engine (EPL-1.0) - Copyright 2004-2018 H2 Group. -JUnit 4.12 (EPL-1.0) - Copyright © 2002-2017 JUnit. All Rights Reserved. - -Copyright Statements -Copyright (C) 2017, Henri Yandell, Yonik Seeley, Rob Tompkins, Benedikt Ritter, Martin van den Bemt, The Apache Software Foundation, Gary Gregory, Emmanuel Bourg - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/apache/commons-csv -Apache Commons IO™ 2.6 -Attribution Statements -http://commons.apache.org/proper/commons-io/ - -Apache Commons IO may include the following software under license: -JUnit 4.10 (EPL-2.0) - Copyright 2015-2019 the original author or authors. - -Copyright Statements -Copyright 2002-2016 The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://git-wip-us.apache.org/repos/asf?p=commons-io.git -Apache Commons Lang™ 3.5 -Attribution Statements -http://commons.apache.org/proper/commons-lang/ - -This product includes software from the Spring Framework, -under the Apache License 2.0 (see: StringUtils.containsWhitespace()) - -Apache Commons Lang may include the following software under license: -JUnit 3.8.1 (EPL-2.0) - Copyright 2015-2019 the original author or authors. - -Copyright Statements -Copyright (C) 2017, The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/apache/commons-lang -Apache Commons Lang™ 3.7 -Attribution Statements -http://commons.apache.org/proper/commons-lang/ - -This product includes software from the Spring Framework, -under the Apache License 2.0 (see: StringUtils.containsWhitespace()) - -Apache Commons Lang may include the following software under license: -JUnit 3.8.1 (EPL-2.0) - Copyright 2015-2019 the original author or authors. - -Copyright Statements -Copyright (C) 2017, The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/apache/commons-lang -Apache Commons Logging™ 1.1.3 -Attribution Statements -http://commons.apache.org/proper/commons-logging/ - -Apache Commons Logging may include the following software under license: -Apache Avalon 4.1.5 Apache-2.0) - Copyright 2004 Apache Software Foundation. -LogKit 1.0.1 (ISC) - Copyright (c) 2015 - 2016, Justin Pawela & The LogKit Project (http://www.logkit.info/) -Servlet API 2.3 - © Oracle - -Copyright Statements -Copyright 2003-2016 The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://mvnrepository.com/artifact/commons-logging/commons-logging/1.1.3 -Apache Commons Modeler 2.0.1 -Attribution Statements -http://commons.apache.org/dormant/commons-modeler/ - -Copyright Statements -© 2002-2008 The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: http://commons.apache.org/dormant/commons-modeler/downloads.html -Apache Commons Text™ 1.1 -Attribution Statements -http://commons.apache.org/proper/commons-text/ - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). - -Copyright Statements -Copyright 2001-2018 The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache Licnese 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/apache/commons-text -Apache HTrace 3.2.0 -Attribution Statements -http://incubator.apache.org/projects/htrace.html - -The HTrace Owl logo is from http://www.clker.com/clipart-13653.html. It is -public domain. - -D3 v3.4.11, a javascript library for manipulating data, used by htrace-hbase -is available under the BSD License: - - Copyright (c) 2010-2014, Michael Bostock - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * The name Michael Bostock may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The following libraries are all available under these terms of the MIT license - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - -underscore 1.7.0, a javascript library of functional programming helpers. -Copyright (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative -Reporters & Editors - -jquery 2.1.4, a javascript library. -Copyright 2014 jQuery Foundation and other contributors, https://jquery.org/ - -backbone 1.1.2, a javascript library. -Copyright (c) 2010-2014 Jeremy Ashkenas, DocumentCloud. - -moment.js 2.10.3, a front end time conversion project. -Copyright (c) 2011-2015 Tim Wood, Iskren Chernev, Moment.js contributors. - -CMP v10 is an implementation of the MessagePack serialization format in C. -Copyright (c) 2014 Charles Gunyon - -Copyright Statements -Copyright (C) The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://git-wip-us.apache.org/repos/asf?p=incubator-htrace.git -Apache HttpComponents™ HttpClient 4.3.5 -Attribution Statements -https://hc.apache.org/httpcomponents-client-ga/index.html - -Apache HttpComponents HttpClient may include the following software under license: -Apache Commons Codec (Apache-2.0) - Copyright 2002-2016 The Apache Software Foundation -Apache Commons Logging (Apache-2.0) - Copyright 2003-2016 The Apache Software Foundation -Apache HttpComponents HttpCore (Apache-2.0) - Copyright 1999-2018 The Apache Software Foundation -JUnit (EPL-2.0) - Copyright 2015-2019 the original author or authors. -Mockito (MIT) - Copyright (c) 2007 Mockito contributors - -Copyright Statements -Copyright (C) 2017, The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/apache/httpcomponents-client -Apache HttpComponents™ HttpClient 4.5.3 -Attribution Statements -https://hc.apache.org/httpcomponents-client-ga/index.html - -Apache HttpComponents HttpClient may include the following software under license: -Apache Commons Codec (Apache-2.0) - Copyright 2002-2016 The Apache Software Foundation -Apache Commons Logging (Apache-2.0) - Copyright 2003-2016 The Apache Software Foundation -Apache HttpComponents HttpCore (Apache-2.0) - Copyright 1999-2018 The Apache Software Foundation -JUnit (EPL-2.0) - Copyright 2015-2019 the original author or authors. -Mockito (MIT) - Copyright (c) 2007 Mockito contributors - -Copyright Statements -Copyright (C) 2017, The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/apache/httpcomponents-client -Apache Jena ARQ 2.13.0 -Attribution Statements -http://jena.apache.org/ - -Portions of this software were originally based on the following: - - Copyright 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP - - Copyright 2010, 2011 Epimorphics Ltd. - - Copyright 2010 Talis Systems Ltd. -These have been licensed to the Apache Software Foundation under a software grant. - -Apache Jena ARQ depends on JSONLD Java -https://github.com/jsonld-java/jsonld-java -Copyright (c) 2012, Deutsche Forschungszentrum für Künstliche Intelligenz GmbH -Copyright (c) 2012-2017, JSONLD-Java contributors -All rights reserved. -Made available under the BSD 3-clause "New" or "Revised" License. -https://spdx.org/licenses/BSD-3-Clause.html - -Copyright Statements -Copyright 2011-2017 The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/apache/jena/tree/master/jena-arq -Apache Jena Core 2.13.0 -Attribution Statements -http://jena.apache.org/ - -Portions of this software were originally based on the following: - - Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP - - Copyright 2010, 2011 Epimorphics Ltd. - - Copyright 2010, 2011 Talis Systems Ltd. -These have been licensed to the Apache Software Foundation under a software grant. - -This product includes software developed by -PluggedIn Software under a BSD license. - -The following files contain code contributed by Plugged In Software: - -src/main/java/org/apache/jena/rdfxml/xmlinput/ExtendedHandler.java -src/main/java/org/apache/jena/rdfxml/xmlinput/XMLHandler.java -src/main/java/org/apache/jena/rdfxml/xmlinput/ARP.java - - (c) Copyright 2003, Plugged In Software - - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Copyright Statements -Copyright 2011-2017 The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/apache/jena/tree/master/jena-core -Apache Jena IRI 1.1.2 -Attribution Statements -http://jena.apache.org/ - -Portions of this software were originally based on the following: - - Copyright 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP - - Copyright 2010, 2011 Epimorphics Ltd. - - Copyright 2010, 2011 Talis Systems Ltd. -These have been licensed to the Apache Software Foundation under a software grant. - -Copyright Statements -Copyright 2011-2017 The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/apache/jena/tree/master/jena-iri -Apache Log4j 2™ 2.11 -Attribution Statements -https://logging.apache.org/log4j/2.x/ - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). - -ResolverUtil.java -Copyright 2005-2006 Tim Fennell - -Dumbster SMTP test server -Copyright 2004 Jason Paul Kitchen - -TypeUtil.java -Copyright 2002-2012 Ramnivas Laddad, Juergen Hoeller, Chris Beams - -picocli (http://picocli.info) -Copyright 2017 Remko Popma - -Copyright Statements -Copyright (C) 2018, The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/apache/logging-log4j2 -Apache Thrift™ 0.13.0 -Attribution Statements -http://thrift.apache.org - -Copyright Statements -Copyright (C) 2020, The Apache Software Foundation, Apache Thrift Developers - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: http://thrift.apache.org/download -Apache XML Commons APIs (xml-apis) 1.4.01 -Attribution Statements -http://xml.apache.org/commons/components/external/ - - Portions of this software were originally based on the following: - - software copyright (c) 1999, IBM Corporation., http://www.ibm.com. - - software copyright (c) 1999, Sun Microsystems., http://www.sun.com. - - software copyright (c) 2000 World Wide Web Consortium, http://www.w3.org - -Copyright Statements -Copyright 2001-2003,2006 The Apache Software Foundation. - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: http://svn.apache.org/viewvc/xml/commons/ -Apache ZooKeeper™ 3.4.5 -Attribution Statements -http://zookeeper.apache.org/releases.html - -Copyright Statements -Copyright © 2008 The Apache Software Foundation. - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: http://maven.ibiblio.org/maven2/org/apache/zookeeper/zookeeper -Apache™ Hadoop® 2.6.2 -Attribution Statements -http://hadoop.apache.org/ - -This product includes software developed by The Apache Software -Foundation (http://www.apache.org/). - -The binary distribution of this product bundles binaries of -org.iq80.leveldb:leveldb-api (https://github.com/dain/leveldb), which has the -following notices: -* Copyright 2011 Dain Sundstrom -* Copyright 2011 FuseSource Corp. http://fusesource.com - -The binary distribution of this product bundles binaries of -AWS SDK for Java - Bundle 1.11.134, -AWS Java SDK for AWS KMS 1.11.134, -AWS Java SDK for Amazon S3 1.11.134, -AWS Java SDK for AWS STS 1.11.134, -JMES Path Query library 1.0, -which has the following notices: - * This software includes third party software subject to the following - copyrights: - XML parsing and utility functions from JetS3t - Copyright - 2006-2009 James Murty. - JSON parsing and utility functions from JSON.org - - Copyright 2002 JSON.org. - PKCS#1 PEM encoded private key parsing and utility - functions from oauth.googlecode.com - Copyright 1998-2010 AOL Inc. - -The binary distribution of this product bundles binaries of -Gson 2.2.4, -which has the following notices: - - The Netty Project - ================= - -Please visit the Netty web site for more information: - - * http://netty.io/ - -Copyright 2014 The Netty Project - -The Netty Project licenses this file to you under the Apache License, -version 2.0 (the "License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at: - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. - -Also, please refer to each LICENSE..txt file, which is located in -the 'license' directory of the distribution file, for the license terms of the -components that this product depends on. - -------------------------------------------------------------------------------- -This product contains the extensions to Java Collections Framework which has -been derived from the works by JSR-166 EG, Doug Lea, and Jason T. Greene: - - * LICENSE: - * license/LICENSE.jsr166y.txt (Public Domain) - * HOMEPAGE: - * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/ - * http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/ - -This product contains a modified version of Robert Harder's Public Domain -Base64 Encoder and Decoder, which can be obtained at: - - * LICENSE: - * license/LICENSE.base64.txt (Public Domain) - * HOMEPAGE: - * http://iharder.sourceforge.net/current/java/base64/ - -This product contains a modified portion of 'Webbit', an event based -WebSocket and HTTP server, which can be obtained at: - - * LICENSE: - * license/LICENSE.webbit.txt (BSD License) - * HOMEPAGE: - * https://github.com/joewalnes/webbit - -This product contains a modified portion of 'SLF4J', a simple logging -facade for Java, which can be obtained at: - - * LICENSE: - * license/LICENSE.slf4j.txt (MIT License) - * HOMEPAGE: - * http://www.slf4j.org/ - -This product contains a modified portion of 'ArrayDeque', written by Josh -Bloch of Google, Inc: - - * LICENSE: - * license/LICENSE.deque.txt (Public Domain) - -This product contains a modified portion of 'Apache Harmony', an open source -Java SE, which can be obtained at: - - * LICENSE: - * license/LICENSE.harmony.txt (Apache License 2.0) - * HOMEPAGE: - * http://archive.apache.org/dist/harmony/ - -This product contains a modified version of Roland Kuhn's ASL2 -AbstractNodeQueue, which is based on Dmitriy Vyukov's non-intrusive MPSC queue. -It can be obtained at: - - * LICENSE: - * license/LICENSE.abstractnodequeue.txt (Public Domain) - * HOMEPAGE: - * https://github.com/akka/akka/blob/wip-2.2.3-for-scala-2.11/akka-actor/src/main/java/akka/dispatch/AbstractNodeQueue.java - -This product contains a modified portion of 'jbzip2', a Java bzip2 compression -and decompression library written by Matthew J. Francis. It can be obtained at: - - * LICENSE: - * license/LICENSE.jbzip2.txt (MIT License) - * HOMEPAGE: - * https://code.google.com/p/jbzip2/ - -This product contains a modified portion of 'libdivsufsort', a C API library to construct -the suffix array and the Burrows-Wheeler transformed string for any input string of -a constant-size alphabet written by Yuta Mori. It can be obtained at: - - * LICENSE: - * license/LICENSE.libdivsufsort.txt (MIT License) - * HOMEPAGE: - * https://code.google.com/p/libdivsufsort/ - -This product contains a modified portion of Nitsan Wakart's 'JCTools', Java Concurrency Tools for the JVM, - which can be obtained at: - - * LICENSE: - * license/LICENSE.jctools.txt (ASL2 License) - * HOMEPAGE: - * https://github.com/JCTools/JCTools - -This product optionally depends on 'JZlib', a re-implementation of zlib in -pure Java, which can be obtained at: - - * LICENSE: - * license/LICENSE.jzlib.txt (BSD style License) - * HOMEPAGE: - * http://www.jcraft.com/jzlib/ - -This product optionally depends on 'Compress-LZF', a Java library for encoding and -decoding data in LZF format, written by Tatu Saloranta. It can be obtained at: - - * LICENSE: - * license/LICENSE.compress-lzf.txt (Apache License 2.0) - * HOMEPAGE: - * https://github.com/ning/compress - -This product optionally depends on 'lz4', a LZ4 Java compression -and decompression library written by Adrien Grand. It can be obtained at: - - * LICENSE: - * license/LICENSE.lz4.txt (Apache License 2.0) - * HOMEPAGE: - * https://github.com/jpountz/lz4-java - -This product optionally depends on 'lzma-java', a LZMA Java compression -and decompression library, which can be obtained at: - - * LICENSE: - * license/LICENSE.lzma-java.txt (Apache License 2.0) - * HOMEPAGE: - * https://github.com/jponge/lzma-java - -This product contains a modified portion of 'jfastlz', a Java port of FastLZ compression -and decompression library written by William Kinney. It can be obtained at: - - * LICENSE: - * license/LICENSE.jfastlz.txt (MIT License) - * HOMEPAGE: - * https://code.google.com/p/jfastlz/ - -This product contains a modified portion of and optionally depends on 'Protocol Buffers', Google's data -interchange format, which can be obtained at: - - * LICENSE: - * license/LICENSE.protobuf.txt (New BSD License) - * HOMEPAGE: - * http://code.google.com/p/protobuf/ - -This product optionally depends on 'Bouncy Castle Crypto APIs' to generate -a temporary self-signed X.509 certificate when the JVM does not provide the -equivalent functionality. It can be obtained at: - - * LICENSE: - * license/LICENSE.bouncycastle.txt (MIT License) - * HOMEPAGE: - * http://www.bouncycastle.org/ - -This product optionally depends on 'Snappy', a compression library produced -by Google Inc, which can be obtained at: - - * LICENSE: - * license/LICENSE.snappy.txt (New BSD License) - * HOMEPAGE: - * http://code.google.com/p/snappy/ - -This product optionally depends on 'JBoss Marshalling', an alternative Java -serialization API, which can be obtained at: - - * LICENSE: - * license/LICENSE.jboss-marshalling.txt (GNU LGPL 2.1) - * HOMEPAGE: - * http://www.jboss.org/jbossmarshalling - -This product optionally depends on 'Caliper', Google's micro- -benchmarking framework, which can be obtained at: - - * LICENSE: - * license/LICENSE.caliper.txt (Apache License 2.0) - * HOMEPAGE: - * http://code.google.com/p/caliper/ - -This product optionally depends on 'Apache Commons Logging', a logging -framework, which can be obtained at: - - * LICENSE: - * license/LICENSE.commons-logging.txt (Apache License 2.0) - * HOMEPAGE: - * http://commons.apache.org/logging/ - -This product optionally depends on 'Apache Log4J', a logging framework, which -can be obtained at: - - * LICENSE: - * license/LICENSE.log4j.txt (Apache License 2.0) - * HOMEPAGE: - * http://logging.apache.org/log4j/ - -This product optionally depends on 'Aalto XML', an ultra-high performance -non-blocking XML processor, which can be obtained at: - - * LICENSE: - * license/LICENSE.aalto-xml.txt (Apache License 2.0) - * HOMEPAGE: - * http://wiki.fasterxml.com/AaltoHome - -This product contains a modified version of 'HPACK', a Java implementation of -the HTTP/2 HPACK algorithm written by Twitter. It can be obtained at: - - * LICENSE: - * license/LICENSE.hpack.txt (Apache License 2.0) - * HOMEPAGE: - * https://github.com/twitter/hpack - -This product contains a modified portion of 'Apache Commons Lang', a Java library -provides utilities for the java.lang API, which can be obtained at: - - * LICENSE: - * license/LICENSE.commons-lang.txt (Apache License 2.0) - * HOMEPAGE: - * https://commons.apache.org/proper/commons-lang/ - -This product contains a modified portion of 'JDOM 1.1', which can be obtained at: - - * LICENSE: - * https://github.com/hunterhacker/jdom/blob/jdom-1.1/core/LICENSE.txt - * HOMEPAGE: - * http://www.jdom.org/ - -The binary distribution of this product bundles binaries of -Commons Codec 1.4, -which has the following notices: - * src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.javacontains test data from http://aspell.net/test/orig/batch0.tab.Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org) - =============================================================================== - The content of package org.apache.commons.codec.language.bm has been translated - from the original php source code available at http://stevemorse.org/phoneticinfo.htm - with permission from the original authors. - Original source copyright:Copyright (c) 2008 Alexander Beider & Stephen P. Morse. - -The binary distribution of this product bundles binaries of -Commons Lang 2.6, -which has the following notices: - * This product includes software from the Spring Framework,under the Apache License 2.0 (see: StringUtils.containsWhitespace()) - -The binary distribution of this product bundles binaries of -Apache Log4j 1.2.17, -which has the following notices: - * ResolverUtil.java - Copyright 2005-2006 Tim Fennell - Dumbster SMTP test server - Copyright 2004 Jason Paul Kitchen - TypeUtil.java - Copyright 2002-2012 Ramnivas Laddad, Juergen Hoeller, Chris Beams - -The binary distribution of this product bundles binaries of -"Java Concurrency in Practice" book annotations 1.0, -which has the following notices: - * Copyright (c) 2005 Brian Goetz and Tim Peierls Released under the Creative - Commons Attribution License (http://creativecommons.org/licenses/by/2.5) - Official home: http://www.jcip.net Any republication or derived work - distributed in source code form must include this copyright and license - notice. - -The binary distribution of this product bundles binaries of -Jetty :: Http Utility 9.3.19., -Jetty :: IO Utility 9.3.19., -Jetty :: Security 9.3.19., -Jetty :: Server Core 9.3.19., -Jetty :: Servlet Handling 9.3.19., -Jetty :: Utilities 9.3.19., -Jetty :: Utilities :: Ajax, -Jetty :: Webapp Application Support 9.3.19., -Jetty :: XML utilities 9.3.19., -which has the following notices: - * ============================================================== - Jetty Web Container - Copyright 1995-2016 Mort Bay Consulting Pty Ltd. - ============================================================== - - The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd - unless otherwise noted. - - Jetty is dual licensed under both - - * The Apache 2.0 License - http://www.apache.org/licenses/LICENSE-2.0.html - - and - - * The Eclipse Public 1.0 License - http://www.eclipse.org/legal/epl-v10.html - - Jetty may be distributed under either license. - - ------ - Eclipse - - The following artifacts are EPL. - * org.eclipse.jetty.orbit:org.eclipse.jdt.core - - The following artifacts are EPL and ASL2. - * org.eclipse.jetty.orbit:javax.security.auth.message - - - The following artifacts are EPL and CDDL 1.0. - * org.eclipse.jetty.orbit:javax.mail.glassfish - - - ------ - Oracle - - The following artifacts are CDDL + GPLv2 with classpath exception. - https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html - - * javax.servlet:javax.servlet-api - * javax.annotation:javax.annotation-api - * javax.transaction:javax.transaction-api - * javax.websocket:javax.websocket-api - - ------ - Oracle OpenJDK - - If ALPN is used to negotiate HTTP/2 connections, then the following - artifacts may be included in the distribution or downloaded when ALPN - module is selected. - - * java.sun.security.ssl - - These artifacts replace/modify OpenJDK classes. The modififications - are hosted at github and both modified and original are under GPL v2 with - classpath exceptions. - http://openjdk.java.net/legal/gplv2+ce.html - - - ------ - OW2 - - The following artifacts are licensed by the OW2 Foundation according to the - terms of http://asm.ow2.org/license.html - - org.ow2.asm:asm-commons - org.ow2.asm:asm - - - ------ - Apache - - The following artifacts are ASL2 licensed. - - org.apache.taglibs:taglibs-standard-spec - org.apache.taglibs:taglibs-standard-impl - - - ------ - MortBay - - The following artifacts are ASL2 licensed. Based on selected classes from - following Apache Tomcat jars, all ASL2 licensed. - - org.mortbay.jasper:apache-jsp - org.apache.tomcat:tomcat-jasper - org.apache.tomcat:tomcat-juli - org.apache.tomcat:tomcat-jsp-api - org.apache.tomcat:tomcat-el-api - org.apache.tomcat:tomcat-jasper-el - org.apache.tomcat:tomcat-api - org.apache.tomcat:tomcat-util-scan - org.apache.tomcat:tomcat-util - - org.mortbay.jasper:apache-el - org.apache.tomcat:tomcat-jasper-el - org.apache.tomcat:tomcat-el-api - - - ------ - Mortbay - - The following artifacts are CDDL + GPLv2 with classpath exception. - - https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html - - org.eclipse.jetty.toolchain:jetty-schemas - - ------ - Assorted - - The UnixCrypt.java code implements the one way cryptography used by - Unix systems for simple password protection. Copyright 1996 Aki Yoshida, - modified April 2001 by Iris Van den Broeke, Daniel Deville. - Permission to use, copy, modify and distribute UnixCrypt - for non-commercial or commercial purposes and without fee is - granted provided that the copyright notice appears in all copies./ - -The binary distribution of this product bundles binaries of -Snappy for Java 1.0.4.1, -which has the following notices: - * This product includes software developed by Google - Snappy: http://code.google.com/p/snappy/ (New BSD License) - - This product includes software developed by Apache - PureJavaCrc32C from apache-hadoop-common http://hadoop.apache.org/ - (Apache 2.0 license) - - This library containd statically linked libstdc++. This inclusion is allowed by - "GCC RUntime Library Exception" - http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html - - == Contributors == - * Tatu Saloranta - * Providing benchmark suite - * Alec Wysoker - * Performance and memory usage improvement - -The binary distribution of this product bundles binaries of -Xerces2 Java Parser 2.9.1, -which has the following notices: - * ========================================================================= - == NOTICE file corresponding to section 4(d) of the Apache License, == - == Version 2.0, in this case for the Apache Xerces Java distribution. == - ========================================================================= - - Apache Xerces Java - Copyright 1999-2007 The Apache Software Foundation - - This product includes software developed at - The Apache Software Foundation (http://www.apache.org/). - - Portions of this software were originally based on the following: - - software copyright (c) 1999, IBM Corporation., http://www.ibm.com. - - software copyright (c) 1999, Sun Microsystems., http://www.sun.com. - - voluntary contributions made by Paul Eng on behalf of the - Apache Software Foundation that were originally developed at iClick, Inc., - software copyright (c) 1999. - -The binary distribution of this product bundles binaries of -Logback Classic Module 1.1.2, -Logback Core Module 1.1.2, -which has the following notices: - * Logback: the reliable, generic, fast and flexible logging framework. - Copyright (C) 1999-2012, QOS.ch. All rights reserved. - -The binary distribution of this product bundles binaries of -Apache HBase - Annotations 1.2.6, -Apache HBase - Client 1.2.6, -Apache HBase - Common 1.2.6, -Apache HBase - Hadoop Compatibility 1.2.6, -Apache HBase - Hadoop Two Compatibility 1.2.6, -Apache HBase - Prefix Tree 1.2.6, -Apache HBase - Procedure 1.2.6, -Apache HBase - Protocol 1.2.6, -Apache HBase - Server 1.2.6, -which has the following notices: - * Apache HBase - Copyright 2007-2015 The Apache Software Foundation - - This product includes software developed at - The Apache Software Foundation (http://www.apache.org/). - - -- - This product incorporates portions of the 'Hadoop' project - - Copyright 2007-2009 The Apache Software Foundation - - Licensed under the Apache License v2.0 - -- - Our Orca logo we got here: http://www.vectorfree.com/jumping-orca - It is licensed Creative Commons Attribution 3.0. - See https://creativecommons.org/licenses/by/3.0/us/ - We changed the logo by stripping the colored background, inverting - it and then rotating it some. - - Later we found that vectorfree.com image is not properly licensed. - The original is owned by vectorportal.com. The original was - relicensed so we could use it as Creative Commons Attribution 3.0. - The license is bundled with the download available here: - http://www.vectorportal.com/subcategory/205/KILLER-WHALE-FREE-VECTOR.eps/ifile/9136/detailtest.asp - -- - This product includes portions of the Bootstrap project v3.0.0 - - Copyright 2013 Twitter, Inc. - - Licensed under the Apache License v2.0 - - This product uses the Glyphicons Halflings icon set. - - http://glyphicons.com/ - - Copyright Jan Kova?ík - - Licensed under the Apache License v2.0 as a part of the Bootstrap project. - - -- - This product includes portions of the Guava project v14, specifically - 'hbase-common/src/main/java/org/apache/hadoop/hbase/io/LimitInputStream.java' - - Copyright (C) 2007 The Guava Authors - - Licensed under the Apache License, Version 2.0 - -The binary distribution of this product bundles binaries of -Phoenix Core 4.7.0, -which has the following notices: - Apache Phoenix - Copyright 2013-2016 The Apache Software Foundation - - This product includes software developed by The Apache Software - Foundation (http://www.apache.org/). - - This also includes: - - The phoenix-spark module has been adapted from the phoenix-spark library - distributed under the terms of the Apache 2 license. Original source copyright: - Copyright 2014 Simply Measured, Inc. - Copyright 2015 Interset Software Inc. - - The file bin/daemon.py is based on the file of the same name in python-daemon 2.0.5 - (https://pypi.python.org/pypi/python-daemon/). Original source copyright: - # Copyright © 2008–2015 Ben Finney - # Copyright © 2007–2008 Robert Niederreiter, Jens Klein - # Copyright © 2004–2005 Chad J. Schroeder - # Copyright © 2003 Clark Evans - # Copyright © 2002 Noah Spurrier - # Copyright © 2001 Jürgen Hermann - -The binary distribution of this product bundles binaries of -Plexus Cipher: encryption/decryption Component 1.4, -which has the following notices: - * The code in this component contains a class - Base64 taken from http://juliusdavies.ca/svn/not-yet-commons-ssl/tags/commons-ssl-0.3.10/src/java/org/apache/commons/ssl/Base64.java - which is Apache license: http://www.apache.org/licenses/LICENSE-2.0 - - The PBE key processing routine PBECipher.createCipher() is adopted from http://juliusdavies.ca/svn/not-yet-commons-ssl/tags/commons-ssl-0.3.10/src/java/org/apache/commons/ssl/OpenSSL.java - which is also Apache APL-2.0 license: http://www.apache.org/licenses/LICENSE-2.0 - -The binary distribution of this product bundles binaries of -software.amazon.ion:ion-java 1.0.1, -which has the following notices: - * Amazon Ion Java Copyright 2007-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - -The binary distribution of this product bundles binaries of -joda-time:joda-time:2.9.9 -which has the following notices: - * ============================================================================= - = NOTICE file corresponding to section 4d of the Apache License Version 2.0 = - ============================================================================= - This product includes software developed by - Joda.org (http://www.joda.org/). - -The binary distribution of this product bundles binaries of -Ehcache 3.3.1, -which has the following notices: - * Ehcache V3 Copyright 2014-2016 Terracotta, Inc. - -The binary distribution of this product bundles binaries of -snakeyaml (https://bitbucket.org/asomov/snakeyaml), -which has the following notices: - * Copyright (c) 2008, http://www.snakeyaml.org - -The binary distribution of this product bundles binaries of -swagger-annotations (https://github.com/swagger-api/swagger-core), -which has the following notices: - * Copyright 2016 SmartBear Software - -Copyright Statements -Copyright (C) 2017, The Apache Software Foundation - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -APACHE HADOOP SUBCOMPONENTS: - -The Apache Hadoop project contains subcomponents with separate copyright -notices and license terms. Your use of the source code for the these -subcomponents is subject to the terms and conditions of the following -licenses. - -For the org.apache.hadoop.util.bloom.* classes: - -/** - * - * Copyright (c) 2005, European Commission project OneLab under contract - * 034819 (http://www.one-lab.org) - * All rights reserved. - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the distribution. - * - Neither the name of the University Catholique de Louvain - UCL - * nor the names of its contributors may be used to endorse or - * promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -For portions of the native implementation of slicing-by-8 CRC calculation -in src/main/native/src/org/apache/hadoop/util: - -Copyright (c) 2008,2009,2010 Massachusetts Institute of Technology. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of the Massachusetts Institute of Technology nor - the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -Other portions are under the same license from Intel: -http://sourceforge.net/projects/slicing-by-8/ -/*++ - * - * Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved - * - * This software program is licensed subject to the BSD License, - * available at http://www.opensource.org/licenses/bsd-license.html - * - * Abstract: The main routine - * - --*/ - -For src/main/native/src/org/apache/hadoop/io/compress/lz4/{lz4.h,lz4.c,lz4hc.h,lz4hc.c}, - -/* - LZ4 - Fast LZ compression algorithm - Header File - Copyright (C) 2011-2014, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - You can contact the author at : - - LZ4 source repository : http://code.google.com/p/lz4/ - - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c -*/ - - -For hadoop-common-project/hadoop-common/src/main/native/gtest ---------------------------------------------------------------------- -Copyright 2008, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The binary distribution of this product bundles these dependencies under the -following license: -re2j 1.1 ---------------------------------------------------------------------- -(GO license) -This is a work derived from Russ Cox's RE2 in Go, whose license -http://golang.org/LICENSE is as follows: - -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -For hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/fuse-dfs/util/tree.h ---------------------------------------------------------------------- -Copyright 2002 Niels Provos -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The binary distribution of this product bundles binaries of leveldbjni -(https://github.com/fusesource/leveldbjni), which is available under the -following license: - -Copyright (c) 2011 FuseSource Corp. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of FuseSource Corp. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -For hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/compat/{fstatat|openat|unlinkat}.h: - -Copyright (c) 2012 The FreeBSD Foundation -All rights reserved. - -This software was developed by Pawel Jakub Dawidek under sponsorship from -the FreeBSD Foundation. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. - -============= - -The binary distribution of this product bundles binaries of leveldb -(http://code.google.com/p/leveldb/), which is available under the following -license: - -Copyright (c) 2011 The LevelDB Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The binary distribution of this product bundles binaries of snappy -(http://code.google.com/p/snappy/), which is available under the following -license: - -Copyright 2011, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -For: -hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/dataTables.bootstrap.js -hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/dataTables.bootstrap.css -hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/jquery.dataTables.min.js -hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-1.9.4/ --------------------------------------------------------------------------------- -Copyright (C) 2008-2016, SpryMedia Ltd. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -For: -hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/dust-full-2.0.0.min.js -hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/dust-helpers-1.1.1.min.js --------------------------------------------------------------------------------- - -Copyright (c) 2010 Aleksander Williams - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -For: -hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/moment.min.js --------------------------------------------------------------------------------- - -Copyright (c) 2011-2016 Tim Wood, Iskren Chernev, Moment.js contributors - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -The binary distribution of this product bundles these dependencies under the -following license: -hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/bootstrap-3.0.2 -hadoop-tools/hadoop-sls/src/main/html/js/thirdparty/bootstrap.min.js -hadoop-tools/hadoop-sls/src/main/html/css/bootstrap.min.css -hadoop-tools/hadoop-sls/src/main/html/css/bootstrap-responsive.min.css -bootstrap v3.3.6 -broccoli-asset-rev v2.4.2 -broccoli-funnel v1.0.1 -datatables v1.10.8 -em-helpers v0.5.13 -em-table v0.1.6 -ember v2.2.0 -ember-array-contains-helper v1.0.2 -ember-bootstrap v0.5.1 -ember-cli v1.13.13 -ember-cli-app-version v1.0.0 -ember-cli-babel v5.1.6 -ember-cli-content-security-policy v0.4.0 -ember-cli-dependency-checker v1.2.0 -ember-cli-htmlbars v1.0.2 -ember-cli-htmlbars-inline-precompile v0.3.1 -ember-cli-ic-ajax v0.2.1 -ember-cli-inject-live-reload v1.4.0 -ember-cli-jquery-ui v0.0.20 -ember-cli-qunit v1.2.1 -ember-cli-release v0.2.8 -ember-cli-shims v0.0.6 -ember-cli-sri v1.2.1 -ember-cli-test-loader v0.2.1 -ember-cli-uglify v1.2.0 -ember-d3 v0.1.0 -ember-data v2.1.0 -ember-disable-proxy-controllers v1.0.1 -ember-export-application-global v1.0.5 -ember-load-initializers v0.1.7 -ember-qunit v0.4.16 -ember-qunit-notifications v0.1.0 -ember-resolver v2.0.3 -ember-spin-spinner v0.2.3 -ember-truth-helpers v1.2.0 -jquery v2.1.4 -jquery-ui v1.11.4 -loader.js v3.3.0 -momentjs v2.10.6 -qunit v1.19.0 -select2 v4.0.0 -snippet-ss v1.11.0 -spin.js v2.3.2 -Azure Data Lake Store - Java client SDK 2.0.11 -JCodings 1.0.8 -Joni 2.1.2 -Mockito 1.8.5 -JUL to SLF4J bridge 1.7.25 -SLF4J API Module 1.7.25 -SLF4J LOG4J-12 Binding 1.7.25 --------------------------------------------------------------------------------- - -The MIT License (MIT) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -For: -hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/jquery-1.10.2.min.js -hadoop-tools/hadoop-sls/src/main/html/js/thirdparty/jquery.js -hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jquery -Apache HBase - Server which contains JQuery minified javascript library version 1.8.3 -Microsoft JDBC Driver for SQLServer - version 6.2.1.jre7 --------------------------------------------------------------------------------- - -MIT License - -Copyright (c) 2003-2017 Optimatika - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -For: -oj! Algorithms - version 43.0 --------------------------------------------------------------------------------- - -Copyright 2005, 2012, 2013 jQuery Foundation and other contributors, https://jquery.org/ - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/jquery/jquery - -The following license applies to all parts of this software except as -documented below: - -==== - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -==== - -All files located in the node_modules and external directories are -externally maintained libraries used by this software which have their -own licenses; we recommend you read them, as their terms may differ from -the terms above. - -For: -hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jt/jquery.jstree.js --------------------------------------------------------------------------------- - -Copyright (c) 2014 Ivan Bozhanov - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For: -hadoop-tools/hadoop-sls/src/main/html/js/thirdparty/d3.v3.js --------------------------------------------------------------------------------- - -D3 is available under a 3-clause BSD license. For details, see: -hadoop-tools/hadoop-sls/src/main/html/js/thirdparty/d3-LICENSE - -The binary distribution of this product bundles these dependencies under the -following license: -HSQLDB Database 2.3.4 --------------------------------------------------------------------------------- -(HSQL License) -"COPYRIGHTS AND LICENSES (based on BSD License) - -For work developed by the HSQL Development Group: - -Copyright (c) 2001-2016, The HSQL Development Group -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -Neither the name of the HSQL Development Group nor the names of its -contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -For work originally developed by the Hypersonic SQL Group: - -Copyright (c) 1995-2000 by the Hypersonic SQL Group. -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -Neither the name of the Hypersonic SQL Group nor the names of its -contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many individuals on behalf of the -Hypersonic SQL Group." - -The binary distribution of this product bundles these dependencies under the -following license: -Java Servlet API 3.1.0 -servlet-api 2.5 -jsp-api 2.1 -jsr311-api 1.1.1 -Glassfish Jasper 6.1.14 -Servlet Specification 2.5 API 6.1.14 --------------------------------------------------------------------------------- -(CDDL 1.0) -COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 -1. Definitions. - -1.1. Contributor means each individual or entity -that creates or contributes to the creation of -Modifications. - -1.2. Contributor Version means the combination of the -Original Software, prior Modifications used by a Contributor (if any), and the -Modifications made by that particular Contributor. - -1.3. Covered -Software means (a) the Original Software, or (b) Modifications, or (c) the -combination of files containing Original Software with files containing -Modifications, in each case including portions -thereof. - -1.4. Executable means the Covered Software in any form other -than Source Code. - -1.5. Initial Developer means the individual or entity -that first makes Original Software available under this -License. - -1.6. Larger Work means a work which combines Covered Software or -portions thereof with code not governed by the terms of this -License. - -1.7. License means this document. - -1.8. Licensable means -having the right to grant, to the maximum extent possible, whether at the time -of the initial grant or subsequently acquired, any and all of the rights -conveyed herein. - -1.9. Modifications means the Source Code and Executable -form of any of the following: -A. Any file that results from an addition to, -deletion from or modification of the contents of a file containing Original -Software or previous Modifications; -B. Any new file that contains any part of the Original Software -or previous Modification; or -C. Any new file that is contributed or otherwise made available -under the terms of this License. - -1.10. Original Software means the Source Code and Executable form of -computer software code that is originally released under this License. - -1.11. Patent Claims means any patent claim(s), now owned or -hereafter acquired, including without limitation, method, process, and apparatus -claims, in any patent Licensable by grantor. - -1.12. Source Code means (a) the common form of computer software code in which -modifications are made and (b) associated documentation included in or -with such code. - -1.13. You (or Your) means an individual or a legal entity exercising rights -under, and complying with all of the terms of, this License. For legal entities, -You includes any entity which controls, is controlled by, or is under common control -with You. For purposes of this definition, control means (a) the power, direct -or indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (b) ownership of more than fifty percent (50%) of the -outstanding shares or beneficial ownership of such entity. - -2. License Grants. - -2.1. The Initial Developer Grant. Conditioned upon Your compliance -with Section 3.1 below and subject to third party intellectual property claims, -the Initial Developer hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than -patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, -display, perform, sublicense and distribute the Original Software (or portions -thereof), with or without Modifications, and/or as part of a Larger Work; -and - -(b) under Patent Claims infringed by the making, using or selling of -Original Software, to make, have made, use, practice, sell, and offer for sale, -and/or otherwise dispose of the Original Software (or portions -thereof); - -(c) The licenses granted in Sections 2.1(a) and (b) are -effective on the date Initial Developer first distributes or otherwise makes the -Original Software available to a third party under the terms of this -License; - -(d) Notwithstanding Section 2.1(b) above, no patent license is -granted: (1) for code that You delete from the Original Software, or (2) for -infringements caused by: (i) the modification of the Original Software, or -(ii) the combination of the Original Software with other software or -devices. - -2.2. Contributor Grant. Conditioned upon Your compliance with -Section 3.1 below and subject to third party intellectual property claims, each -Contributor hereby grants You a world-wide, royalty-free, non-exclusive -license: - -(a) under intellectual property rights (other than patent or -trademark) Licensable by Contributor to use, reproduce, modify, display, -perform, sublicense and distribute the Modifications created by such Contributor -(or portions thereof), either on an unmodified basis, with other Modifications, -as Covered Software and/or as part of a Larger Work; and - -(b) under Patent -Claims infringed by the making, using, or selling of Modifications made by that -Contributor either alone and/or in combination with its Contributor Version (or -portions of such combination), to make, use, sell, offer for sale, have made, -and/or otherwise dispose of: (1) Modifications made by that Contributor (or -portions thereof); and (2) the combination of Modifications made by that -Contributor with its Contributor Version (or portions of such -combination). - -(c) The licenses granted in Sections 2.2(a) and 2.2(b) are -effective on the date Contributor first distributes or otherwise makes the -Modifications available to a third party. - -(d) Notwithstanding Section 2.2(b) -above, no patent license is granted: (1) for any code that Contributor has -deleted from the Contributor Version; (2) for infringements caused by: -(i) third party modifications of Contributor Version, or (ii) the combination -of Modifications made by that Contributor with other software (except as part of -the Contributor Version) or other devices; or (3) under Patent Claims infringed -by Covered Software in the absence of Modifications made by that -Contributor. - -3. Distribution Obligations. - -3.1. Availability of Source -Code. Any Covered Software that You distribute or otherwise make available in -Executable form must also be made available in Source Code form and that Source -Code form must be distributed only under the terms of this License. You must -include a copy of this License with every copy of the Source Code form of the -Covered Software You distribute or otherwise make available. You must inform -recipients of any such Covered Software in Executable form as to how they can -obtain such Covered Software in Source Code form in a reasonable manner on or -through a medium customarily used for software exchange. - -3.2. -Modifications. The Modifications that You create or to which You contribute are -governed by the terms of this License. You represent that You believe Your -Modifications are Your original creation(s) and/or You have sufficient rights to -grant the rights conveyed by this License. - -3.3. Required Notices. You must -include a notice in each of Your Modifications that identifies You as the -Contributor of the Modification. You may not remove or alter any copyright, -patent or trademark notices contained within the Covered Software, or any -notices of licensing or any descriptive text giving attribution to any -Contributor or the Initial Developer. - -3.4. Application of Additional Terms. -You may not offer or impose any terms on any Covered Software in Source Code -form that alters or restricts the applicable version of this License or the -recipients rights hereunder. You may choose to offer, and to charge a fee for, -warranty, support, indemnity or liability obligations to one or more recipients -of Covered Software. However, you may do so only on Your own behalf, and not on -behalf of the Initial Developer or any Contributor. You must make it absolutely -clear that any such warranty, support, indemnity or liability obligation is -offered by You alone, and You hereby agree to indemnify the Initial Developer -and every Contributor for any liability incurred by the Initial Developer or -such Contributor as a result of warranty, support, indemnity or liability terms -You offer. - -3.5. Distribution of Executable Versions. You may distribute the -Executable form of the Covered Software under the terms of this License or under -the terms of a license of Your choice, which may contain terms different from -this License, provided that You are in compliance with the terms of this License -and that the license for the Executable form does not attempt to limit or alter -the recipients rights in the Source Code form from the rights set forth in this -License. If You distribute the Covered Software in Executable form under a -different license, You must make it absolutely clear that any terms which differ -from this License are offered by You alone, not by the Initial Developer or -Contributor. You hereby agree to indemnify the Initial Developer and every -Contributor for any liability incurred by the Initial Developer or such -Contributor as a result of any such terms You offer. - -3.6. Larger Works. You -may create a Larger Work by combining Covered Software with other code not -governed by the terms of this License and distribute the Larger Work as a single -product. In such a case, You must make sure the requirements of this License are -fulfilled for the Covered Software. - -4. Versions of the License. - -4.1. -New Versions. Sun Microsystems, Inc. is the initial license steward and may -publish revised and/or new versions of this License from time to time. Each -version will be given a distinguishing version number. Except as provided in -Section 4.3, no one other than the license steward has the right to modify this -License. - -4.2. Effect of New Versions. You may always continue to use, -distribute or otherwise make the Covered Software available under the terms of -the version of the License under which You originally received the Covered -Software. If the Initial Developer includes a notice in the Original Software -prohibiting it from being distributed or otherwise made available under any -subsequent version of the License, You must distribute and make the Covered -Software available under the terms of the version of the License under which You -originally received the Covered Software. Otherwise, You may also choose to use, -distribute or otherwise make the Covered Software available under the terms of -any subsequent version of the License published by the license -steward. - -4.3. Modified Versions. When You are an Initial Developer and You -want to create a new license for Your Original Software, You may create and use -a modified version of this License if You: (a) rename the license and remove -any references to the name of the license steward (except to note that the -license differs from this License); and (b) otherwise make it clear that the -license contains terms which differ from this License. - -5. DISCLAIMER OF WARRANTY. - -COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, -WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT -LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, -MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY -COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER -OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR -CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS -LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER -THIS DISCLAIMER. - -6. TERMINATION. - -6.1. This License and the rights -granted hereunder will terminate automatically if You fail to comply with terms -herein and fail to cure such breach within 30 days of becoming aware of the -breach. Provisions which, by their nature, must remain in effect beyond the -termination of this License shall survive. - -6.2. If You assert a patent -infringement claim (excluding declaratory judgment actions) against Initial -Developer or a Contributor (the Initial Developer or Contributor against whom -You assert such claim is referred to as Participant) alleging that the -Participant Software (meaning the Contributor Version where the Participant is a -Contributor or the Original Software where the Participant is the Initial -Developer) directly or indirectly infringes any patent, then any and all rights -granted directly or indirectly to You by such Participant, the Initial Developer -(if the Initial Developer is not the Participant) and all Contributors under -Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from -Participant terminate prospectively and automatically at the expiration of such -60 day notice period, unless if within such 60 day period You withdraw Your -claim with respect to the Participant Software against such Participant either -unilaterally or pursuant to a written agreement with Participant. - -6.3. In -the event of termination under Sections 6.1 or 6.2 above, all end user licenses -that have been validly granted by You or any distributor hereunder prior to -termination (excluding licenses granted to You by any distributor) shall survive -termination. - -7. LIMITATION OF LIABILITY. -UNDER NO CIRCUMSTANCES AND UNDER -NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, -SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF -COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY -PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY -CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF -GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER -COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE -POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO -LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTYS NEGLIGENCE TO -THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT -ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO -THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - -8. U.S. GOVERNMENT END USERS. - -The Covered Software is a commercial item, as that term is defined in -48 C.F.R. 2.101 (Oct. 1995), consisting of commercial computer software (as -that term is defined at 48 C.F.R. 252.227-7014(a)(1)) and commercial computer -software documentation as such terms are used in 48 C.F.R. 12.212 (Sept. -1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through -227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software -with only those rights set forth herein. This U.S. Government Rights clause is -in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision -that addresses Government rights in computer software under this -License. - -9. MISCELLANEOUS. -This License represents the complete agreement -concerning subject matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent necessary to -make it enforceable. This License shall be governed by the law of the -jurisdiction specified in a notice contained within the Original Software -(except to the extent applicable law, if any, provides otherwise), excluding -such jurisdictions conflict-of-law provisions. Any litigation relating to this -License shall be subject to the jurisdiction of the courts located in the -jurisdiction and venue specified in a notice contained within the Original -Software, with the losing party responsible for costs, including, without -limitation, court costs and reasonable attorneys fees and expenses. The -application of the United Nations Convention on Contracts for the International -Sale of Goods is expressly excluded. Any law or regulation which provides that -the language of a contract shall be construed against the drafter shall not -apply to this License. You agree that You alone are responsible for compliance -with the United States export administration regulations (and the export control -laws and regulation of any other countries) when You use, distribute or -otherwise make available any Covered Software. - -10. RESPONSIBILITY FOR CLAIMS. -As between Initial Developer and the Contributors, each party is -responsible for claims and damages arising, directly or indirectly, out of its -utilization of rights under this License and You agree to work with Initial -Developer and Contributors to distribute such responsibility on an equitable -basis. Nothing herein is intended or shall be deemed to constitute any admission -of liability. - -The binary distribution of this product bundles these dependencies under the -following license: -jersey-client 1.19 -jersey-core 1.19 -jersey-grizzly2 1.19 -jersey-grizzly2-servlet 1.19 -jersey-json 1.19 -jersey-server 1.19 -jersey-servlet 1.19 -jersey-guice 1.19 -Jersey Test Framework - Grizzly 2 Module 1.19 -JAXB RI 2.2.3 -Java Architecture for XML Binding 2.2.11 -grizzly-framework 2.2.21 -grizzly-http 2.2.21 -grizzly-http-server 2.2.21 -grizzly-http-servlet 2.2.21 -grizzly-rcm 2.2.21 --------------------------------------------------------------------------------- -(CDDL 1.1) -COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)Version 1.1 - -1. Definitions. - -1.1. “Contributor” means each individual or entity that creates or -contributes to the creation of Modifications. -1.2. “Contributor Version” means the combination of the Original Software, -prior Modifications used by a Contributor (if any), and the Modifications made -by that particular Contributor. -1.3. “Covered Software” means (a) the Original Software, or (b) -Modifications, or (c) the combination of files containing Original Software with -files containing Modifications, in each case including portions thereof. -1.4. “Executable” means the Covered Software in any form other than Source -Code. -1.5. “Initial Developer” means the individual or entity that first makes -Original Software available under this License. -1.6. “Larger Work” means a work which combines Covered Software or portions -thereof with code not governed by the terms of this License. -1.7. “License” means this document. -1.8. “Licensable” means having the right to grant, to the maximum extent -possible, whether at the time of the initial grant or subsequently acquired, any -and all of the rights conveyed herein. -1.9. “Modifications” means the Source Code and Executable form of any of the -following: -A. Any file that results from an addition to, deletion from or modification of -the contents of a file containing Original Software or previous Modifications; -B. Any new file that contains any part of the Original Software or previous -Modification; or -C. Any new file that is contributed or otherwise made available under the terms -of this License. -1.10. “Original Software” means the Source Code and Executable form of -computer software code that is originally released under this License. -1.11. “Patent Claims” means any patent claim(s), now owned or hereafter -acquired, including without limitation, method, process, and apparatus claims, -in any patent Licensable by grantor. -1.12. “Source Code” means (a) the common form of computer software code in -which modifications are made and (b) associated documentation included in or -with such code. -1.13. “You” (or “Your”) means an individual or a legal entity exercising -rights under, and complying with all of the terms of, this License. For legal -entities, “You” includes any entity which controls, is controlled by, or is -under common control with You. For purposes of this definition, “control” -means (a) the power, direct or indirect, to cause the direction or management of -such entity, whether by contract or otherwise, or (b) ownership of more than -fifty percent (50%) of the outstanding shares or beneficial ownership of such -entity. - -2. License Grants. - -2.1. The Initial Developer Grant. - -Conditioned upon Your compliance with Section 3.1 below and subject to -third party intellectual property claims, the Initial Developer hereby grants -You a world-wide, royalty-free, non-exclusive license: -(a) under intellectual -property rights (other than patent or trademark) Licensable by Initial -Developer, to use, reproduce, modify, display, perform, sublicense and -distribute the Original Software (or portions thereof), with or without -Modifications, and/or as part of a Larger Work; and -(b) under Patent Claims -infringed by the making, using or selling of Original Software, to make, have -made, use, practice, sell, and offer for sale, and/or otherwise dispose of the -Original Software (or portions thereof). -(c) The licenses granted in Sections -2.1(a) and (b) are effective on the date Initial Developer first distributes or -otherwise makes the Original Software available to a third party under the terms -of this License. -(d) Notwithstanding Section 2.1(b) above, no patent license is -granted: (1) for code that You delete from the Original Software, or (2) for -infringements caused by: (i) the modification of the Original Software, or (ii) -the combination of the Original Software with other software or devices. - -2.2. Contributor Grant. - -Conditioned upon Your compliance with Section 3.1 below and -subject to third party intellectual property claims, each Contributor hereby -grants You a world-wide, royalty-free, non-exclusive license: -(a) under -intellectual property rights (other than patent or trademark) Licensable by -Contributor to use, reproduce, modify, display, perform, sublicense and -distribute the Modifications created by such Contributor (or portions thereof), -either on an unmodified basis, with other Modifications, as Covered Software -and/or as part of a Larger Work; and -(b) under Patent Claims infringed by the -making, using, or selling of Modifications made by that Contributor either alone -and/or in combination with its Contributor Version (or portions of such -combination), to make, use, sell, offer for sale, have made, and/or otherwise -dispose of: (1) Modifications made by that Contributor (or portions thereof); -and (2) the combination of Modifications made by that Contributor with its -Contributor Version (or portions of such combination). -(c) The licenses granted -in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first -distributes or otherwise makes the Modifications available to a third -party. -(d) Notwithstanding Section 2.2(b) above, no patent license is granted: -(1) for any code that Contributor has deleted from the Contributor Version; (2) -for infringements caused by: (i) third party modifications of Contributor -Version, or (ii) the combination of Modifications made by that Contributor with -other software (except as part of the Contributor Version) or other devices; or -(3) under Patent Claims infringed by Covered Software in the absence of -Modifications made by that Contributor. - -3. Distribution Obligations. - -3.1. Availability of Source Code. -Any Covered Software that You distribute or -otherwise make available in Executable form must also be made available in -Source Code form and that Source Code form must be distributed only under the -terms of this License. You must include a copy of this License with every copy -of the Source Code form of the Covered Software You distribute or otherwise make -available. You must inform recipients of any such Covered Software in Executable -form as to how they can obtain such Covered Software in Source Code form in a -reasonable manner on or through a medium customarily used for software -exchange. -3.2. Modifications. -The Modifications that You create or to which -You contribute are governed by the terms of this License. You represent that You -believe Your Modifications are Your original creation(s) and/or You have -sufficient rights to grant the rights conveyed by this License. -3.3. Required Notices. -You must include a notice in each of Your Modifications that -identifies You as the Contributor of the Modification. You may not remove or -alter any copyright, patent or trademark notices contained within the Covered -Software, or any notices of licensing or any descriptive text giving attribution -to any Contributor or the Initial Developer. -3.4. Application of Additional Terms. -You may not offer or impose any terms on any Covered Software in Source -Code form that alters or restricts the applicable version of this License or the -recipients' rights hereunder. You may choose to offer, and to charge a fee for, -warranty, support, indemnity or liability obligations to one or more recipients -of Covered Software. However, you may do so only on Your own behalf, and not on -behalf of the Initial Developer or any Contributor. You must make it absolutely -clear that any such warranty, support, indemnity or liability obligation is -offered by You alone, and You hereby agree to indemnify the Initial Developer -and every Contributor for any liability incurred by the Initial Developer or -such Contributor as a result of warranty, support, indemnity or liability terms -You offer. -3.5. Distribution of Executable Versions. -You may distribute the -Executable form of the Covered Software under the terms of this License or under -the terms of a license of Your choice, which may contain terms different from -this License, provided that You are in compliance with the terms of this License -and that the license for the Executable form does not attempt to limit or alter -the recipient's rights in the Source Code form from the rights set forth in -this License. If You distribute the Covered Software in Executable form under a -different license, You must make it absolutely clear that any terms which differ -from this License are offered by You alone, not by the Initial Developer or -Contributor. You hereby agree to indemnify the Initial Developer and every -Contributor for any liability incurred by the Initial Developer or such -Contributor as a result of any such terms You offer. -3.6. Larger Works. -You -may create a Larger Work by combining Covered Software with other code not -governed by the terms of this License and distribute the Larger Work as a single -product. In such a case, You must make sure the requirements of this License are -fulfilled for the Covered Software. - -4. Versions of the License. - -4.1. New Versions. -Oracle is the initial license steward and may publish revised and/or -new versions of this License from time to time. Each version will be given a -distinguishing version number. Except as provided in Section 4.3, no one other -than the license steward has the right to modify this License. -4.2. Effect of New Versions. -You may always continue to use, distribute or otherwise make the -Covered Software available under the terms of the version of the License under -which You originally received the Covered Software. If the Initial Developer -includes a notice in the Original Software prohibiting it from being distributed -or otherwise made available under any subsequent version of the License, You -must distribute and make the Covered Software available under the terms of the -version of the License under which You originally received the Covered Software. -Otherwise, You may also choose to use, distribute or otherwise make the Covered -Software available under the terms of any subsequent version of the License -published by the license steward. -4.3. Modified Versions. -When You are an -Initial Developer and You want to create a new license for Your Original -Software, You may create and use a modified version of this License if You: (a) -rename the license and remove any references to the name of the license steward -(except to note that the license differs from this License); and (b) otherwise -make it clear that the license contains terms which differ from this -License. - -5. DISCLAIMER OF WARRANTY. - -COVERED SOFTWARE IS PROVIDED UNDER THIS -LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE -IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR -NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED -SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY -RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE -COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF -WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED -SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -6. TERMINATION. - -6.1. This License and the rights granted hereunder will -terminate automatically if You fail to comply with terms herein and fail to cure -such breach within 30 days of becoming aware of the breach. Provisions which, by -their nature, must remain in effect beyond the termination of this License shall -survive. -6.2. If You assert a patent infringement claim (excluding declaratory -judgment actions) against Initial Developer or a Contributor (the Initial -Developer or Contributor against whom You assert such claim is referred to as -“Participant”) alleging that the Participant Software (meaning the -Contributor Version where the Participant is a Contributor or the Original -Software where the Participant is the Initial Developer) directly or indirectly -infringes any patent, then any and all rights granted directly or indirectly to -You by such Participant, the Initial Developer (if the Initial Developer is not -the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this -License shall, upon 60 days notice from Participant terminate prospectively and -automatically at the expiration of such 60 day notice period, unless if within -such 60 day period You withdraw Your claim with respect to the Participant -Software against such Participant either unilaterally or pursuant to a written -agreement with Participant. -6.3. If You assert a patent infringement claim -against Participant alleging that the Participant Software directly or -indirectly infringes any patent where such claim is resolved (such as by license -or settlement) prior to the initiation of patent infringement litigation, then -the reasonable value of the licenses granted by such Participant under Sections -2.1 or 2.2 shall be taken into account in determining the amount or value of any -payment or license. -6.4. In the event of termination under Sections 6.1 or 6.2 -above, all end user licenses that have been validly granted by You or any -distributor hereunder prior to termination (excluding licenses granted to You by -any distributor) shall survive termination. - -7. LIMITATION OF LIABILITY. - -UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT -(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL -DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY -SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, -SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, -WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER -FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN -IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS -LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL -INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW -PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR -LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND -LIMITATION MAY NOT APPLY TO YOU. - -8. U.S. GOVERNMENT END USERS. - -The Covered -Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 -(Oct. 1995), consisting of “commercial computer software” (as that term is -defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software -documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). -Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 -(June 1995), all U.S. Government End Users acquire Covered Software with only -those rights set forth herein. This U.S. Government Rights clause is in lieu of, -and supersedes, any other FAR, DFAR, or other clause or provision that addresses -Government rights in computer software under this License. - -9. MISCELLANEOUS. - -This License represents the complete agreement concerning -subject matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent necessary to -make it enforceable. This License shall be governed by the law of the -jurisdiction specified in a notice contained within the Original Software -(except to the extent applicable law, if any, provides otherwise), excluding -such jurisdiction's conflict-of-law provisions. Any litigation relating to this -License shall be subject to the jurisdiction of the courts located in the -jurisdiction and venue specified in a notice contained within the Original -Software, with the losing party responsible for costs, including, without -limitation, court costs and reasonable attorneys' fees and expenses. The -application of the United Nations Convention on Contracts for the International -Sale of Goods is expressly excluded. Any law or regulation which provides that -the language of a contract shall be construed against the drafter shall not -apply to this License. You agree that You alone are responsible for compliance -with the United States export administration regulations (and the export control -laws and regulation of any other countries) when You use, distribute or -otherwise make available any Covered Software. - -10. RESPONSIBILITY FOR CLAIMS. - -As between Initial Developer and the Contributors, each party is -responsible for claims and damages arising, directly or indirectly, out of its -utilization of rights under this License and You agree to work with Initial -Developer and Contributors to distribute such responsibility on an equitable -basis. Nothing herein is intended or shall be deemed to constitute any admission -of liability. - -The binary distribution of this product bundles these dependencies under the -following license: -Protocol Buffer Java API 2.5.0 --------------------------------------------------------------------------------- -This license applies to all parts of Protocol Buffers except the following: - - - Atomicops support for generic gcc, located in - src/google/protobuf/stubs/atomicops_internals_generic_gcc.h. - This file is copyrighted by Red Hat Inc. - - - Atomicops support for AIX/POWER, located in - src/google/protobuf/stubs/atomicops_internals_power.h. - This file is copyrighted by Bloomberg Finance LP. - -Copyright 2014, Google Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Code generated by the Protocol Buffer compiler is owned by the owner -of the input file used when generating it. This code is not -standalone and requires a support library to be linked with it. This -support library is itself covered by the above license. - -For: -XML Commons External Components XML APIs 1.3.04 --------------------------------------------------------------------------------- -By obtaining, using and/or copying this work, you (the licensee) agree that you -have read, understood, and will comply with the following terms and conditions. - -Permission to copy, modify, and distribute this software and its documentation, -with or without modification, for any purpose and without fee or royalty is -hereby granted, provided that you include the following on ALL copies of the -software and documentation or portions thereof, including modifications: -- The full text of this NOTICE in a location viewable to users of the -redistributed or derivative work. -- Any pre-existing intellectual property disclaimers, notices, or terms and -conditions. If none exist, the W3C Software Short Notice should be included -(hypertext is preferred, text is permitted) within the body of any redistributed -or derivative code. -- Notice of any changes or modifications to the files, including the date changes -were made. (We recommend you provide URIs to the location from which the code is -derived.) - -The binary distribution of this product bundles these dependencies under the -following license: -JUnit 4.11 -Eclipse JDT Core 3.1.1 --------------------------------------------------------------------------------- -(EPL v1.0) -Eclipse Public License - v 1.0 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and documentation -distributed under this Agreement, and -b) in the case of each subsequent Contributor: -i) changes to the Program, and -ii) additions to the Program; -where such changes and/or additions to the Program originate from and are -distributed by that particular Contributor. A Contribution 'originates' from a -Contributor if it was added to the Program by such Contributor itself or anyone -acting on such Contributor's behalf. Contributions do not include additions to -the Program which: (i) are separate modules of software distributed in -conjunction with the Program under their own license agreement, and (ii) are not -derivative works of the Program. -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. - -"Program" means the Contributions distributed in accordance with this Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. - -2. GRANT OF RIGHTS - -a) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free copyright license to -reproduce, prepare derivative works of, publicly display, publicly perform, -distribute and sublicense the Contribution of such Contributor, if any, and such -derivative works, in source code and object code form. -b) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed -Patents to make, use, sell, offer to sell, import and otherwise transfer the -Contribution of such Contributor, if any, in source code and object code form. -This patent license shall apply to the combination of the Contribution and the -Program if, at the time the Contribution is added by the Contributor, such -addition of the Contribution causes such combination to be covered by the -Licensed Patents. The patent license shall not apply to any other combinations -which include the Contribution. No hardware per se is licensed hereunder. -c) Recipient understands that although each Contributor grants the licenses to -its Contributions set forth herein, no assurances are provided by any -Contributor that the Program does not infringe the patent or other intellectual -property rights of any other entity. Each Contributor disclaims any liability to -Recipient for claims brought by any other entity based on infringement of -intellectual property rights or otherwise. As a condition to exercising the -rights and licenses granted hereunder, each Recipient hereby assumes sole -responsibility to secure any other intellectual property rights needed, if any. -For example, if a third party patent license is required to allow Recipient to -distribute the Program, it is Recipient's responsibility to acquire that license -before distributing the Program. -d) Each Contributor represents that to its knowledge it has sufficient copyright -rights in its Contribution, if any, to grant the copyright license set forth in -this Agreement. -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under its -own license agreement, provided that: - -a) it complies with the terms and conditions of this Agreement; and -b) its license agreement: -i) effectively disclaims on behalf of all Contributors all warranties and -conditions, express and implied, including warranties or conditions of title and -non-infringement, and implied warranties or conditions of merchantability and -fitness for a particular purpose; -ii) effectively excludes on behalf of all Contributors all liability for -damages, including direct, indirect, special, incidental and consequential -damages, such as lost profits; -iii) states that any provisions which differ from this Agreement are offered by -that Contributor alone and not by any other party; and -iv) states that source code for the Program is available from such Contributor, -and informs licensees how to obtain it in a reasonable manner on or through a -medium customarily used for software exchange. -When the Program is made available in source code form: - -a) it must be made available under this Agreement; and -b) a copy of this Agreement must be included with each copy of the Program. -Contributors may not remove or alter any copyright notices contained within the -Program. - -Each Contributor must identify itself as the originator of its Contribution, if -any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, if -a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, damages -and costs (collectively "Losses") arising from claims, lawsuits and other legal -actions brought by a third party against the Indemnified Contributor to the -extent caused by the acts or omissions of such Commercial Contributor in -connection with its distribution of the Program in a commercial product -offering. The obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. In order -to qualify, an Indemnified Contributor must: a) promptly notify the Commercial -Contributor in writing of such claim, and b) allow the Commercial Contributor to -control, and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may participate in -any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If that -Commercial Contributor then makes performance claims, or offers warranties -related to Product X, those performance claims and warranties are such -Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a court -requires any other Contributor to pay any damages as a result, the Commercial -Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each -Recipient is solely responsible for determining the appropriateness of using and -distributing the Program and assumes all risks associated with its exercise of -rights under this Agreement , including but not limited to the risks and costs -of program errors, compliance with applicable laws, damage to or loss of data, -programs or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS -GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under applicable -law, it shall not affect the validity or enforceability of the remainder of the -terms of this Agreement, and without further action by the parties hereto, such -provision shall be reformed to the minimum extent necessary to make such -provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Program itself -(excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted under -Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue and -survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to time. -No one other than the Agreement Steward has the right to modify this Agreement. -The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation -may assign the responsibility to serve as the Agreement Steward to a suitable -separate entity. Each new version of the Agreement will be given a -distinguishing version number. The Program (including Contributions) may always -be distributed subject to the version of the Agreement under which it was -received. In addition, after a new version of the Agreement is published, -Contributor may elect to distribute the Program (including its Contributions) -under the new version. Except as expressly stated in Sections 2(a) and 2(b) -above, Recipient receives no rights or licenses to the intellectual property of -any Contributor under this Agreement, whether expressly, by implication, -estoppel or otherwise. All rights in the Program not expressly granted under -this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation. - -The binary distribution of this product bundles these dependencies under the -following license: -JSch 0.1.51 -ParaNamer Core 2.3 -JLine 0.9.94 -leveldbjni-all 1.8 -Hamcrest Core 1.3 -ASM Core 5.0.4 -ASM Commons 5.0.2 -ASM Tree 5.0.2 --------------------------------------------------------------------------------- -(3-clause BSD) -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The binary distribution of this product bundles these dependencies under the -following license: -FindBugs-jsr305 3.0.0 -dnsjava 2.1.7, Copyright (c) 1998-2011, Brian Wellington. All rights reserved. --------------------------------------------------------------------------------- -(2-clause BSD) -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those -of the authors and should not be interpreted as representing official policies, -either expressed or implied, of the FreeBSD Project. - -The binary distribution of this product bundles these dependencies under the -following license: -"Java Concurrency in Practice" book annotations 1.0 --------------------------------------------------------------------------------- -(CCAL v2.5) -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS -PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR -OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS -LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE -BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED -HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. - -1. Definitions - -"Collective Work" means a work, such as a periodical issue, anthology or -encyclopedia, in which the Work in its entirety in unmodified form, along with a -number of other contributions, constituting separate and independent works in -themselves, are assembled into a collective whole. A work that constitutes a -Collective Work will not be considered a Derivative Work (as defined below) for -the purposes of this License. -"Derivative Work" means a work based upon the Work or upon the Work and other -pre-existing works, such as a translation, musical arrangement, dramatization, -fictionalization, motion picture version, sound recording, art reproduction, -abridgment, condensation, or any other form in which the Work may be recast, -transformed, or adapted, except that a work that constitutes a Collective Work -will not be considered a Derivative Work for the purpose of this License. For -the avoidance of doubt, where the Work is a musical composition or sound -recording, the synchronization of the Work in timed-relation with a moving image -("synching") will be considered a Derivative Work for the purpose of this -License. -"Licensor" means the individual or entity that offers the Work under the terms -of this License. -"Original Author" means the individual or entity who created the Work. -"Work" means the copyrightable work of authorship offered under the terms of -this License. -"You" means an individual or entity exercising rights under this License who has -not previously violated the terms of this License with respect to the Work, or -who has received express permission from the Licensor to exercise rights under -this License despite a previous violation. -2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or -restrict any rights arising from fair use, first sale or other limitations on -the exclusive rights of the copyright owner under copyright law or other -applicable laws. - -3. License Grant. Subject to the terms and conditions of this License, Licensor -hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the -duration of the applicable copyright) license to exercise the rights in the Work -as stated below: - -to reproduce the Work, to incorporate the Work into one or more Collective -Works, and to reproduce the Work as incorporated in the Collective Works; -to create and reproduce Derivative Works; -to distribute copies or phonorecords of, display publicly, perform publicly, and -perform publicly by means of a digital audio transmission the Work including as -incorporated in Collective Works; -to distribute copies or phonorecords of, display publicly, perform publicly, and -perform publicly by means of a digital audio transmission Derivative Works. -For the avoidance of doubt, where the work is a musical composition: - -Performance Royalties Under Blanket Licenses. Licensor waives the exclusive -right to collect, whether individually or via a performance rights society (e.g. -ASCAP, BMI, SESAC), royalties for the public performance or public digital -performance (e.g. webcast) of the Work. -Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right -to collect, whether individually or via a music rights agency or designated -agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the -Work ("cover version") and distribute, subject to the compulsory license created -by 17 USC Section 115 of the US Copyright Act (or the equivalent in other -jurisdictions). -Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the -Work is a sound recording, Licensor waives the exclusive right to collect, -whether individually or via a performance-rights society (e.g. SoundExchange), -royalties for the public digital performance (e.g. webcast) of the Work, subject -to the compulsory license created by 17 USC Section 114 of the US Copyright Act -(or the equivalent in other jurisdictions). -The above rights may be exercised in all media and formats whether now known or -hereafter devised. The above rights include the right to make such modifications -as are technically necessary to exercise the rights in other media and formats. -All rights not expressly granted by Licensor are hereby reserved. - -4. Restrictions.The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - -You may distribute, publicly display, publicly perform, or publicly digitally -perform the Work only under the terms of this License, and You must include a -copy of, or the Uniform Resource Identifier for, this License with every copy or -phonorecord of the Work You distribute, publicly display, publicly perform, or -publicly digitally perform. You may not offer or impose any terms on the Work -that alter or restrict the terms of this License or the recipients' exercise of -the rights granted hereunder. You may not sublicense the Work. You must keep -intact all notices that refer to this License and to the disclaimer of -warranties. You may not distribute, publicly display, publicly perform, or -publicly digitally perform the Work with any technological measures that control -access or use of the Work in a manner inconsistent with the terms of this -License Agreement. The above applies to the Work as incorporated in a Collective -Work, but this does not require the Collective Work apart from the Work itself -to be made subject to the terms of this License. If You create a Collective -Work, upon notice from any Licensor You must, to the extent practicable, remove -from the Collective Work any credit as required by clause 4(b), as requested. If -You create a Derivative Work, upon notice from any Licensor You must, to the -extent practicable, remove from the Derivative Work any credit as required by -clause 4(b), as requested. -If you distribute, publicly display, publicly perform, or publicly digitally -perform the Work or any Derivative Works or Collective Works, You must keep -intact all copyright notices for the Work and provide, reasonable to the medium -or means You are utilizing: (i) the name of the Original Author (or pseudonym, -if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor -designate another party or parties (e.g. a sponsor institute, publishing entity, -journal) for attribution in Licensor's copyright notice, terms of service or by -other reasonable means, the name of such party or parties; the title of the Work -if supplied; to the extent reasonably practicable, the Uniform Resource -Identifier, if any, that Licensor specifies to be associated with the Work, -unless such URI does not refer to the copyright notice or licensing information -for the Work; and in the case of a Derivative Work, a credit identifying the use -of the Work in the Derivative Work (e.g., "French translation of the Work by -Original Author," or "Screenplay based on original Work by Original Author"). -Such credit may be implemented in any reasonable manner; provided, however, that -in the case of a Derivative Work or Collective Work, at a minimum such credit -will appear where any other comparable authorship credit appears and in a manner -at least as prominent as such other comparable authorship credit. -5. Representations, Warranties and Disclaimer - -UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS -THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING -THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT -LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR -PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, -OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME -JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH -EXCLUSION MAY NOT APPLY TO YOU. - -6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN -NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, -INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS -LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -7. Termination - -This License and the rights granted hereunder will terminate automatically upon -any breach by You of the terms of this License. Individuals or entities who have -received Derivative Works or Collective Works from You under this License, -however, will not have their licenses terminated provided such individuals or -entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, -and 8 will survive any termination of this License. -Subject to the above terms and conditions, the license granted here is perpetual -(for the duration of the applicable copyright in the Work). Notwithstanding the -above, Licensor reserves the right to release the Work under different license -terms or to stop distributing the Work at any time; provided, however that any -such election will not serve to withdraw this License (or any other license that -has been, or is required to be, granted under the terms of this License), and -this License will continue in full force and effect unless terminated as stated -above. -8. Miscellaneous - -Each time You distribute or publicly digitally perform the Work or a Collective -Work, the Licensor offers to the recipient a license to the Work on the same -terms and conditions as the license granted to You under this License. -Each time You distribute or publicly digitally perform a Derivative Work, -Licensor offers to the recipient a license to the original Work on the same -terms and conditions as the license granted to You under this License. -If any provision of this License is invalid or unenforceable under applicable -law, it shall not affect the validity or enforceability of the remainder of the -terms of this License, and without further action by the parties to this -agreement, such provision shall be reformed to the minimum extent necessary to -make such provision valid and enforceable. -No term or provision of this License shall be deemed waived and no breach -consented to unless such waiver or consent shall be in writing and signed by the -party to be charged with such waiver or consent. -This License constitutes the entire agreement between the parties with respect -to the Work licensed here. There are no understandings, agreements or -representations with respect to the Work not specified here. Licensor shall not -be bound by any additional provisions that may appear in any communication from -You. This License may not be modified without the mutual written agreement of -the Licensor and You. - -The binary distribution of this product bundles these dependencies under the -following license: -jamon-runtime 2.4.1 --------------------------------------------------------------------------------- -(MPL 2.0) - Mozilla Public License - Version 2.0 - -1. Definitions - -1.1. “Contributor” -means each individual or legal entity that creates, contributes to the creation -of, or owns Covered Software. - -1.2. “Contributor Version” -means the combination of the Contributions of others (if any) used by a -Contributor and that particular Contributor’s Contribution. - -1.3. “Contribution” -means Covered Software of a particular Contributor. - -1.4. “Covered Software” -means Source Code Form to which the initial Contributor has attached the notice -in Exhibit A, the Executable Form of such Source Code Form, and Modifications of -such Source Code Form, in each case including portions thereof. - -1.5. “Incompatible With Secondary Licenses” -means - -that the initial Contributor has attached the notice described in Exhibit B to -the Covered Software; or - -that the Covered Software was made available under the terms of version 1.1 or -earlier of the License, but not also under the terms of a Secondary License. - -1.6. “Executable Form” -means any form of the work other than Source Code Form. - -1.7. “Larger Work” -means a work that combines Covered Software with other material, in a separate -file or files, that is not Covered Software. - -1.8. “License” -means this document. - -1.9. “Licensable” -means having the right to grant, to the maximum extent possible, whether at the -time of the initial grant or subsequently, any and all of the rights conveyed by -this License. - -1.10. “Modifications” -means any of the following: - -any file in Source Code Form that results from an addition to, deletion from, or -modification of the contents of Covered Software; or - -any new file in Source Code Form that contains any Covered Software. - -1.11. “Patent Claims” of a Contributor -means any patent claim(s), including without limitation, method, process, and -apparatus claims, in any patent Licensable by such Contributor that would be -infringed, but for the grant of the License, by the making, using, selling, -offering for sale, having made, import, or transfer of either its Contributions -or its Contributor Version. - -1.12. “Secondary License” -means either the GNU General Public License, Version 2.0, the GNU Lesser General -Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, -or any later versions of those licenses. - -1.13. “Source Code Form” -means the form of the work preferred for making modifications. - -1.14. “You” (or “Your”) -means an individual or a legal entity exercising rights under this License. For -legal entities, “You” includes any entity that controls, is controlled by, -or is under common control with You. For purposes of this definition, -“control” means (a) the power, direct or indirect, to cause the direction or -management of such entity, whether by contract or otherwise, or (b) ownership of -more than fifty percent (50%) of the outstanding shares or beneficial ownership -of such entity. - -2. License Grants and Conditions - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive -license: - -under intellectual property rights (other than patent or trademark) Licensable -by such Contributor to use, reproduce, make available, modify, display, perform, -distribute, and otherwise exploit its Contributions, either on an unmodified -basis, with Modifications, or as part of a Larger Work; and - -under Patent Claims of such Contributor to make, use, sell, offer for sale, have -made, import, and otherwise transfer either its Contributions or its Contributor -Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution become -effective for each Contribution on the date the Contributor first distributes -such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under this -License. No additional rights or licenses will be implied from the distribution -or licensing of Covered Software under this License. Notwithstanding Section -2.1(b) above, no patent license is granted by a Contributor: - -for any code that a Contributor has removed from Covered Software; or - -for infringements caused by: (i) Your and any other third party’s -modifications of Covered Software, or (ii) the combination of its Contributions -with other software (except as part of its Contributor Version); or - -under Patent Claims infringed by Covered Software in the absence of its -Contributions. - -This License does not grant any rights in the trademarks, service marks, or -logos of any Contributor (except as may be necessary to comply with the notice -requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to distribute -the Covered Software under a subsequent version of this License (see Section -10.2) or under the terms of a Secondary License (if permitted under the terms of -Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its Contributions are -its original creation(s) or it has sufficient rights to grant the rights to its -Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under applicable -copyright doctrines of fair use, fair dealing, or other equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in -Section 2.1. - -3. Responsibilities - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under the -terms of this License. You must inform recipients that the Source Code Form of -the Covered Software is governed by the terms of this License, and how they can -obtain a copy of this License. You may not attempt to alter or restrict the -recipients’ rights in the Source Code Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -such Covered Software must also be made available in Source Code Form, as -described in Section 3.1, and You must inform recipients of the Executable Form -how they can obtain a copy of such Source Code Form by reasonable means in a -timely manner, at a charge no more than the cost of distribution to the -recipient; and - -You may distribute such Executable Form under the terms of this License, or -sublicense it under different terms, provided that the license for the -Executable Form does not attempt to limit or alter the recipients’ rights in -the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, provided -that You also comply with the requirements of this License for the Covered -Software. If the Larger Work is a combination of Covered Software with a work -governed by one or more Secondary Licenses, and the Covered Software is not -Incompatible With Secondary Licenses, this License permits You to additionally -distribute such Covered Software under the terms of such Secondary License(s), -so that the recipient of the Larger Work may, at their option, further -distribute the Covered Software under the terms of either this License or such -Secondary License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices (including -copyright notices, patent notices, disclaimers of warranty, or limitations of -liability) contained within the Source Code Form of the Covered Software, except -that You may alter any license notices to the extent required to remedy known -factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, indemnity -or liability obligations to one or more recipients of Covered Software. However, -You may do so only on Your own behalf, and not on behalf of any Contributor. You -must make it absolutely clear that any such warranty, support, indemnity, or -liability obligation is offered by You alone, and You hereby agree to indemnify -every Contributor for any liability incurred by such Contributor as a result of -warranty, support, indemnity or liability terms You offer. You may include -additional disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - -If it is impossible for You to comply with any of the terms of this License with -respect to some or all of the Covered Software due to statute, judicial order, -or regulation then You must: (a) comply with the terms of this License to the -maximum extent possible; and (b) describe the limitations and the code they -affect. Such description must be placed in a text file included with all -distributions of the Covered Software under this License. Except to the extent -prohibited by statute or regulation, such description must be sufficiently -detailed for a recipient of ordinary skill to be able to understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You -fail to comply with any of its terms. However, if You become compliant, then the -rights granted under this License from a particular Contributor are reinstated -(a) provisionally, unless and until such Contributor explicitly and finally -terminates Your grants, and (b) on an ongoing basis, if such Contributor fails -to notify You of the non-compliance by some reasonable means prior to 60 days -after You have come back into compliance. Moreover, Your grants from a -particular Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the first -time You have received notice of non-compliance with this License from such -Contributor, and You become compliant prior to 30 days after Your receipt of the -notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, counter-claims, and -cross-claims) alleging that a Contributor Version directly or indirectly -infringes any patent, then the rights granted to You by any and all Contributors -for the Covered Software under Section 2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user -license agreements (excluding distributors and resellers) which have been -validly granted by You or Your distributors under this License prior to -termination shall survive termination. - -6. Disclaimer of Warranty - -Covered Software is provided under this License on an “as is” basis, without -warranty of any kind, either expressed, implied, or statutory, including, -without limitation, warranties that the Covered Software is free of defects, -merchantable, fit for a particular purpose or non-infringing. The entire risk as -to the quality and performance of the Covered Software is with You. Should any -Covered Software prove defective in any respect, You (not any Contributor) -assume the cost of any necessary servicing, repair, or correction. This -disclaimer of warranty constitutes an essential part of this License. No use of -any Covered Software is authorized under this License except under this -disclaimer. - -7. Limitation of Liability - -Under no circumstances and under no legal theory, whether tort (including -negligence), contract, or otherwise, shall any Contributor, or anyone who -distributes Covered Software as permitted above, be liable to You for any -direct, indirect, special, incidental, or consequential damages of any character -including, without limitation, damages for lost profits, loss of goodwill, work -stoppage, computer failure or malfunction, or any and all other commercial -damages or losses, even if such party shall have been informed of the -possibility of such damages. This limitation of liability shall not apply to -liability for death or personal injury resulting from such party’s negligence -to the extent applicable law prohibits such limitation. Some jurisdictions do -not allow the exclusion or limitation of incidental or consequential damages, so -this exclusion and limitation may not apply to You. - -8. Litigation - -Any litigation relating to this License may be brought only in the courts of a -jurisdiction where the defendant maintains its principal place of business and -such litigation shall be governed by laws of that jurisdiction, without -reference to its conflict-of-law provisions. Nothing in this Section shall -prevent a party’s ability to bring cross-claims or counter-claims. - -9. Miscellaneous - -This License represents the complete agreement concerning the subject matter -hereof. If any provision of this License is held to be unenforceable, such -provision shall be reformed only to the extent necessary to make it enforceable. -Any law or regulation which provides that the language of a contract shall be -construed against the drafter shall not be used to construe this License against -a Contributor. - -10. Versions of the License - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section 10.3, -no one other than the license steward has the right to modify or publish new -versions of this License. Each version will be given a distinguishing version -number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version of the -License under which You originally received the Covered Software, or under the -terms of any subsequent version published by the license steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to create a -new license for such software, you may create and use a modified version of this -License if you rename the license and remove any references to the name of the -license steward (except to note that such modified license differs from this -License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses - -If You choose to distribute Source Code Form that is Incompatible With Secondary -Licenses under the terms of this version of the License, the notice described in -Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice - -This Source Code Form is subject to the terms of the Mozilla Public License, v. -2.0. If a copy of the MPL was not distributed with this file, You can obtain one -at https://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, then -You may include the notice in a location (such as a LICENSE file in a relevant -directory) where a recipient would be likely to look for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - “Incompatible With Secondary Licenses” Notice - -This Source Code Form is “Incompatible With Secondary Licenses”, as defined -by the Mozilla Public License, v. 2.0. - -The binary distribution of this product bundles these dependencies under the -following license: -JDOM 1.1 --------------------------------------------------------------------------------- -/*-- - - Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions, and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions, and the disclaimer that follows - these conditions in the documentation and/or other materials - provided with the distribution. - - 3. The name "JDOM" must not be used to endorse or promote products - derived from this software without prior written permission. For - written permission, please contact . - - 4. Products derived from this software may not be called "JDOM", nor - may "JDOM" appear in their name, without prior written permission - from the JDOM Project Management . - - In addition, we request (but do not require) that you include in the - end-user documentation provided with the redistribution and/or in the - software itself an acknowledgement equivalent to the following: - "This product includes software developed by the - JDOM Project (http://www.jdom.org/)." - Alternatively, the acknowledgment may be graphical using the logos - available at http://www.jdom.org/images/logos. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - This software consists of voluntary contributions made by many - individuals on behalf of the JDOM Project and was originally - created by Jason Hunter and - Brett McLaughlin . For more information - on the JDOM Project, please see . - - */ - -The binary distribution of this product bundles these dependencies under the -following license: -Hbase Server 1.2.4 --------------------------------------------------------------------------------- -This project bundles a derivative image for our Orca Logo. This image is -available under the Creative Commons By Attribution 3.0 License. - - Creative Commons Legal Code - - Attribution 3.0 Unported - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR - DAMAGES RESULTING FROM ITS USE. - - License - - THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE - COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY - COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS - AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - - BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE - TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY - BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS - CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND - CONDITIONS. - - 1. Definitions - - a. "Adaptation" means a work based upon the Work, or upon the Work and - other pre-existing works, such as a translation, adaptation, - derivative work, arrangement of music or other alterations of a - literary or artistic work, or phonogram or performance and includes - cinematographic adaptations or any other form in which the Work may be - recast, transformed, or adapted including in any form recognizably - derived from the original, except that a work that constitutes a - Collection will not be considered an Adaptation for the purpose of - this License. For the avoidance of doubt, where the Work is a musical - work, performance or phonogram, the synchronization of the Work in - timed-relation with a moving image ("synching") will be considered an - Adaptation for the purpose of this License. - b. "Collection" means a collection of literary or artistic works, such as - encyclopedias and anthologies, or performances, phonograms or - broadcasts, or other works or subject matter other than works listed - in Section 1(f) below, which, by reason of the selection and - arrangement of their contents, constitute intellectual creations, in - which the Work is included in its entirety in unmodified form along - with one or more other contributions, each constituting separate and - independent works in themselves, which together are assembled into a - collective whole. A work that constitutes a Collection will not be - considered an Adaptation (as defined above) for the purposes of this - License. - c. "Distribute" means to make available to the public the original and - copies of the Work or Adaptation, as appropriate, through sale or - other transfer of ownership. - d. "Licensor" means the individual, individuals, entity or entities that - offer(s) the Work under the terms of this License. - e. "Original Author" means, in the case of a literary or artistic work, - the individual, individuals, entity or entities who created the Work - or if no individual or entity can be identified, the publisher; and in - addition (i) in the case of a performance the actors, singers, - musicians, dancers, and other persons who act, sing, deliver, declaim, - play in, interpret or otherwise perform literary or artistic works or - expressions of folklore; (ii) in the case of a phonogram the producer - being the person or legal entity who first fixes the sounds of a - performance or other sounds; and, (iii) in the case of broadcasts, the - organization that transmits the broadcast. - f. "Work" means the literary and/or artistic work offered under the terms - of this License including without limitation any production in the - literary, scientific and artistic domain, whatever may be the mode or - form of its expression including digital form, such as a book, - pamphlet and other writing; a lecture, address, sermon or other work - of the same nature; a dramatic or dramatico-musical work; a - choreographic work or entertainment in dumb show; a musical - composition with or without words; a cinematographic work to which are - assimilated works expressed by a process analogous to cinematography; - a work of drawing, painting, architecture, sculpture, engraving or - lithography; a photographic work to which are assimilated works - expressed by a process analogous to photography; a work of applied - art; an illustration, map, plan, sketch or three-dimensional work - relative to geography, topography, architecture or science; a - performance; a broadcast; a phonogram; a compilation of data to the - extent it is protected as a copyrightable work; or a work performed by - a variety or circus performer to the extent it is not otherwise - considered a literary or artistic work. - g. "You" means an individual or entity exercising rights under this - License who has not previously violated the terms of this License with - respect to the Work, or who has received express permission from the - Licensor to exercise rights under this License despite a previous - violation. - h. "Publicly Perform" means to perform public recitations of the Work and - to communicate to the public those public recitations, by any means or - process, including by wire or wireless means or public digital - performances; to make available to the public Works in such a way that - members of the public may access these Works from a place and at a - place individually chosen by them; to perform the Work to the public - by any means or process and the communication to the public of the - performances of the Work, including by public digital performance; to - broadcast and rebroadcast the Work by any means including signs, - sounds or images. - i. "Reproduce" means to make copies of the Work by any means including - without limitation by sound or visual recordings and the right of - fixation and reproducing fixations of the Work, including storage of a - protected performance or phonogram in digital form or other electronic - medium. - - 2. Fair Dealing Rights. Nothing in this License is intended to reduce, - limit, or restrict any uses free from copyright or rights arising from - limitations or exceptions that are provided for in connection with the - copyright protection under copyright law or other applicable laws. - - 3. License Grant. Subject to the terms and conditions of this License, - Licensor hereby grants You a worldwide, royalty-free, non-exclusive, - perpetual (for the duration of the applicable copyright) license to - exercise the rights in the Work as stated below: - - a. to Reproduce the Work, to incorporate the Work into one or more - Collections, and to Reproduce the Work as incorporated in the - Collections; - b. to create and Reproduce Adaptations provided that any such Adaptation, - including any translation in any medium, takes reasonable steps to - clearly label, demarcate or otherwise identify that changes were made - to the original Work. For example, a translation could be marked "The - original work was translated from English to Spanish," or a - modification could indicate "The original work has been modified."; - c. to Distribute and Publicly Perform the Work including as incorporated - in Collections; and, - d. to Distribute and Publicly Perform Adaptations. - e. For the avoidance of doubt: - - i. Non-waivable Compulsory License Schemes. In those jurisdictions in - which the right to collect royalties through any statutory or - compulsory licensing scheme cannot be waived, the Licensor - reserves the exclusive right to collect such royalties for any - exercise by You of the rights granted under this License; - ii. Waivable Compulsory License Schemes. In those jurisdictions in - which the right to collect royalties through any statutory or - compulsory licensing scheme can be waived, the Licensor waives the - exclusive right to collect such royalties for any exercise by You - of the rights granted under this License; and, - iii. Voluntary License Schemes. The Licensor waives the right to - collect royalties, whether individually or, in the event that the - Licensor is a member of a collecting society that administers - voluntary licensing schemes, via that society, from any exercise - by You of the rights granted under this License. - - The above rights may be exercised in all media and formats whether now - known or hereafter devised. The above rights include the right to make - such modifications as are technically necessary to exercise the rights in - other media and formats. Subject to Section 8(f), all rights not expressly - granted by Licensor are hereby reserved. - - 4. Restrictions. The license granted in Section 3 above is expressly made - subject to and limited by the following restrictions: - - a. You may Distribute or Publicly Perform the Work only under the terms - of this License. You must include a copy of, or the Uniform Resource - Identifier (URI) for, this License with every copy of the Work You - Distribute or Publicly Perform. You may not offer or impose any terms - on the Work that restrict the terms of this License or the ability of - the recipient of the Work to exercise the rights granted to that - recipient under the terms of the License. You may not sublicense the - Work. You must keep intact all notices that refer to this License and - to the disclaimer of warranties with every copy of the Work You - Distribute or Publicly Perform. When You Distribute or Publicly - Perform the Work, You may not impose any effective technological - measures on the Work that restrict the ability of a recipient of the - Work from You to exercise the rights granted to that recipient under - the terms of the License. This Section 4(a) applies to the Work as - incorporated in a Collection, but this does not require the Collection - apart from the Work itself to be made subject to the terms of this - License. If You create a Collection, upon notice from any Licensor You - must, to the extent practicable, remove from the Collection any credit - as required by Section 4(b), as requested. If You create an - Adaptation, upon notice from any Licensor You must, to the extent - practicable, remove from the Adaptation any credit as required by - Section 4(b), as requested. - b. If You Distribute, or Publicly Perform the Work or any Adaptations or - Collections, You must, unless a request has been made pursuant to - Section 4(a), keep intact all copyright notices for the Work and - provide, reasonable to the medium or means You are utilizing: (i) the - name of the Original Author (or pseudonym, if applicable) if supplied, - and/or if the Original Author and/or Licensor designate another party - or parties (e.g., a sponsor institute, publishing entity, journal) for - attribution ("Attribution Parties") in Licensor's copyright notice, - terms of service or by other reasonable means, the name of such party - or parties; (ii) the title of the Work if supplied; (iii) to the - extent reasonably practicable, the URI, if any, that Licensor - specifies to be associated with the Work, unless such URI does not - refer to the copyright notice or licensing information for the Work; - and (iv) , consistent with Section 3(b), in the case of an Adaptation, - a credit identifying the use of the Work in the Adaptation (e.g., - "French translation of the Work by Original Author," or "Screenplay - based on original Work by Original Author"). The credit required by - this Section 4 (b) may be implemented in any reasonable manner; - provided, however, that in the case of a Adaptation or Collection, at - a minimum such credit will appear, if a credit for all contributing - authors of the Adaptation or Collection appears, then as part of these - credits and in a manner at least as prominent as the credits for the - other contributing authors. For the avoidance of doubt, You may only - use the credit required by this Section for the purpose of attribution - in the manner set out above and, by exercising Your rights under this - License, You may not implicitly or explicitly assert or imply any - connection with, sponsorship or endorsement by the Original Author, - Licensor and/or Attribution Parties, as appropriate, of You or Your - use of the Work, without the separate, express prior written - permission of the Original Author, Licensor and/or Attribution - Parties. - c. Except as otherwise agreed in writing by the Licensor or as may be - otherwise permitted by applicable law, if You Reproduce, Distribute or - Publicly Perform the Work either by itself or as part of any - Adaptations or Collections, You must not distort, mutilate, modify or - take other derogatory action in relation to the Work which would be - prejudicial to the Original Author's honor or reputation. Licensor - agrees that in those jurisdictions (e.g. Japan), in which any exercise - of the right granted in Section 3(b) of this License (the right to - make Adaptations) would be deemed to be a distortion, mutilation, - modification or other derogatory action prejudicial to the Original - Author's honor and reputation, the Licensor will waive or not assert, - as appropriate, this Section, to the fullest extent permitted by the - applicable national law, to enable You to reasonably exercise Your - right under Section 3(b) of this License (right to make Adaptations) - but not otherwise. - - 5. Representations, Warranties and Disclaimer - - UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR - OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY - KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, - INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, - FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF - LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, - WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION - OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. - - 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE - LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR - ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES - ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS - BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - - 7. Termination - - a. This License and the rights granted hereunder will terminate - automatically upon any breach by You of the terms of this License. - Individuals or entities who have received Adaptations or Collections - from You under this License, however, will not have their licenses - terminated provided such individuals or entities remain in full - compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will - survive any termination of this License. - b. Subject to the above terms and conditions, the license granted here is - perpetual (for the duration of the applicable copyright in the Work). - Notwithstanding the above, Licensor reserves the right to release the - Work under different license terms or to stop distributing the Work at - any time; provided, however that any such election will not serve to - withdraw this License (or any other license that has been, or is - required to be, granted under the terms of this License), and this - License will continue in full force and effect unless terminated as - stated above. - - 8. Miscellaneous - - a. Each time You Distribute or Publicly Perform the Work or a Collection, - the Licensor offers to the recipient a license to the Work on the same - terms and conditions as the license granted to You under this License. - b. Each time You Distribute or Publicly Perform an Adaptation, Licensor - offers to the recipient a license to the original Work on the same - terms and conditions as the license granted to You under this License. - c. If any provision of this License is invalid or unenforceable under - applicable law, it shall not affect the validity or enforceability of - the remainder of the terms of this License, and without further action - by the parties to this agreement, such provision shall be reformed to - the minimum extent necessary to make such provision valid and - enforceable. - d. No term or provision of this License shall be deemed waived and no - breach consented to unless such waiver or consent shall be in writing - and signed by the party to be charged with such waiver or consent. - e. This License constitutes the entire agreement between the parties with - respect to the Work licensed here. There are no understandings, - agreements or representations with respect to the Work not specified - here. Licensor shall not be bound by any additional provisions that - may appear in any communication from You. This License may not be - modified without the mutual written agreement of the Licensor and You. - f. The rights granted under, and the subject matter referenced, in this - License were drafted utilizing the terminology of the Berne Convention - for the Protection of Literary and Artistic Works (as amended on - September 28, 1979), the Rome Convention of 1961, the WIPO Copyright - Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 - and the Universal Copyright Convention (as revised on July 24, 1971). - These rights and subject matter take effect in the relevant - jurisdiction in which the License terms are sought to be enforced - according to the corresponding provisions of the implementation of - those treaty provisions in the applicable national law. If the - standard suite of rights granted under applicable copyright law - includes additional rights not granted under this License, such - additional rights are deemed to be included in the License; this - License is not intended to restrict the license of any rights under - applicable law. - - - Creative Commons Notice - - Creative Commons is not a party to this License, and makes no warranty - whatsoever in connection with the Work. Creative Commons will not be - liable to You or any party on any legal theory for any damages - whatsoever, including without limitation any general, special, - incidental or consequential damages arising in connection to this - license. Notwithstanding the foregoing two (2) sentences, if Creative - Commons has expressly identified itself as the Licensor hereunder, it - shall have all rights and obligations of Licensor. - - Except for the limited purpose of indicating to the public that the - Work is licensed under the CCPL, Creative Commons does not authorize - the use by either party of the trademark "Creative Commons" or any - related trademark or logo of Creative Commons without the prior - written consent of Creative Commons. Any permitted use will be in - compliance with Creative Commons' then-current trademark usage - guidelines, as may be published on its website or otherwise made - available upon request from time to time. For the avoidance of doubt, - this trademark restriction does not form part of this License. - - Creative Commons may be contacted at https://creativecommons.org/. --------------------------------------------------------------------------------- - -For: hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs -/server/datanode/checker/AbstractFuture.java and -hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs -/server/datanode/checker/TimeoutFuture.java - -Copyright (C) 2007 The Guava Authors - -Licensed under the Apache License, Version 2.0 (the "License"); you may not -use this file except in compliance with the License. You may obtain a copy of -the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations under -the License. - -Source materials are available for download at: http://maven.ibiblio.org/maven2/org/apache/hadoop/ -AspectJ 1.8.9 -Attribution Statements -https://www.eclipse.org/aspectj/ - -Copyright Statements -Copyright © 2018 The Eclipse Foundation. All Rights Reserved. - -License Text (https://spdx.org/licenses/EPL-1.0.html) -Made available under the Eclipse Public License 1.0. See Appendix for full text. - -Source materials are available for download at: http://git.eclipse.org/c/aspectj/org.aspectj.git -AST Types 0.13.2 -Attribution Statements -https://github.com/benjamn/ast-types - -Copyright Statements -Copyright (c) 2013 Ben Newman - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/benjamn/ast-types -Astring 1.4.3 -Attribution Statements -https://github.com/davidbonnet/astring - -Copyright Statements -Copyright (c) 2015, David Bonnet - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/davidbonnet/astring -Autoprefixer 8.6.5 -Attribution Statements -https://twitter.com/autoprefixer - -Copyright Statements -Copyright 2013 Andrey Sitnik - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/postcss/autoprefixer -Babel 7.4.4 -Attribution Statements -https://babeljs.io/ - -Copyright Statements -Copyright (c) 2014-present Sebastian McKenzie and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/babel/babel/ -Babel Loader 8.0.5 -Attribution Statements -https://github.com/babel/babel-loader - -Copyright Statements -Copyright (c) 2014-2016 Luís Couto - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/babel/babel-loader -BigInteger.js 1.6.48 -Attribution Statements -https://github.com/peterolson/BigInteger.js - -Copyright Statements -Copyright (C) Peter Olson - -License Text (https://spdx.org/licenses/Unlicense.html) -Made available under The Unlicense. See Appendix for full text. - -Source materials are available for download at: https://github.com/peterolson/BigInteger.js -Bixio DiskQueue -Attribution Statements -https://github.com/bixo/bixo/blob/master/src/main/java/bixo/utils/DiskQueue.java - -This file has been modified by MarkLogic Corporation. -Modifications copyright (c) 2016 MarkLogic Corporation - -Copyright Statements -Copyright 2009-2015 Scale Unlimited - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/bixo/bixo/blob/master/src/main/java/bixo/utils/DiskQueue.java -Bliki engine (Java Wikipedia API) 3.1.0 -Attribution Statements -https://bitbucket.org/axelclk/info.bliki.wiki - -This package uses modified sources and libraries from other open source projects: -a) HTMLCleaner which is published under BSD license. -For more information see: -http://htmlcleaner.sourceforge.net/ - -b) The JAMWiki MagicWord implementation which is published under the GNU Lesser General Public License. -For more information see: -http://jamwiki.org - -c) The JSPWiki LatexConverter which is published under the GNU Lesser General Public License. -For more information see: -http://jspwiki.org/wiki/LatexConverter - -d) Textile-J which is published under Apache license. -For more information see: -https://textile-j.dev.java.net/ - -e) The Flying Saucer project which is published under the GNU Lesser General Public License. -For more information see: -https://xhtmlrenderer.dev.java.net/ - -f) iText (PDF generation) which is published under the Mozilla Public License -For more information see: -http://www.lowagie.com/iText/ and http://itextpdf.sourceforge.net/ - -g) The Apache Commons libraries are published under the Apache License -http://commons.apache.org/ - -h) The Apache Derby libraries are published under the Apache License -http://db.apache.org/derby/ - -g) the stringtotime library is published under the following License: - -Copyright (c) 2012 Clutch, Inc. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -For more information see: -https://github.com/collegeman/stringtotime - -j) the Scribunto MediaWiki extension which is published under GPL-2.0+ and MIT -https://www.mediawiki.org/wiki/Extension:Scribunto - -k) The LuaJ library is published under the MIT license -http://www.luaj.org/luaj/3.0/README.html - -Copyright (c) 2009-2014 Luaj.org. - -Copyright Statements -Axel Kramer - -License Text (http:// https://spdx.org/licenses/EPL-1.0.html) -Made available under the Eclipse Public License 1.0. See Appendix for full text. - -Source materials are available for download at: https://bitbucket.org/axelclk/info.bliki.wiki/src -bluebird 3.7.2 -Attribution Statements -http://bluebirdjs.com/docs/getting-started.html - -Copyright Statements -Copyright (C) 2017, Petka Antonov - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/petkaantonov/bluebird -body-parser 1.18.3 -Attribution Statements -https://github.com/expressjs/body-parser - -Copyright Statements -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/expressjs/body-parser -Bootstrap 4.0.0-alpha.5 -Attribution Statements -http://getbootstrap.com - -Copyright Statements -Copyright (c) 2011-2017 Twitter, Inc. -Copyright (c) 2011-2017 The Bootstrap Authors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/twbs/bootstrap -Brandon Grotesque font family -Attribution Statements -https://www.myfonts.com/fonts/hvdfonts/brandon-grotesque/ - -Copyright Statements -Copyright © 1999-2018 MyFonts Inc. - -License Text (https://www.myfonts.com/viewlicense.php?lid=794) -Made available under commercial license. - -Source materials are available for download at: https://www.myfonts.com/fonts/hvdfonts/brandon-grotesque/ -Bunyan 1.8.12 -Attribution Statements -https://github.com/trentm/node-bunyan - -Copyright Statements -Copyright (C) 2017, Trent Mick - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/trentm/node-bunyan -Chai 4.2.0 -Attribution Statements -https://www.chaijs.com/ - -Copyright Statements -Copyright (c) 2017 Chai.js Assertion Library - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/chaijs/chai -Chalk 2.4.2 -Attribution Statements -https://github.com/chalk/chalk - -Copyright Statements -Copyright (c) Sindre Sorhus (sindresorhus.com) - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/chalk/chalk -classList.js 1.1.20150312 -Attribution Statements -https://www.npmjs.com/package/classlist.js - -Copyright Statements -Eli Grey - -License Text (https://spdx.org/licenses/Unlicense.html) -Made available under The Unlicense. See Appendix for full text. - -Source materials are available for download at: https://github.com/eligrey/classList.js -clipboard.js 2.0.1 -Attribution Statements -https://clipboardjs.com/ - -Copyright Statements -Copyright © 2018 Zeno Rocha - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/zenorocha/clipboard.js/ -Codelyzer 4.5.0 -Attribution Statements -http://codelyzer.com/ - -Copyright Statements -Copyright (c) 2016 Minko Gechev - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/mgechev/codelyzer -CodeMirror 5.42.2 -Attribution Statements -http://codemirror.net/ - -CodeMirror may depend on xquery-hint -Copyright (C) 2013 by Angelo ZERR -Made available under the MIT License. - -Copyright Statements -Copyright (C) 2017 by Marijn Haverbeke and others - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/codemirror/codemirror -Compodoc 0.0.41 -Attribution Statements -https://compodoc.app/ - -Copyright Statements -Copyright (c) 2016 Vincent Ogloblinsky - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/compodoc/compodoc -concat-stream 2.0.0 -Attribution Statements -https://github.com/maxogden/concat-stream - -Copyright Statements -Copyright (c) 2013 Max Ogden - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/maxogden/concat-stream -Concurrently 4.1.0 -Attribution Statements -https://github.com/kimmobrunfeldt/concurrently - -Copyright Statements -Copyright (c) 2015 Kimmo Brunfeldt - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/kimmobrunfeldt/concurrently -Connect 3.6.6 -Attribution Statements -https://github.com/senchalabs/connect - -Copyright Statements -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 LearnBoost -Copyright (c) 2011-2014 TJ Holowaychuk -Copyright (c) 2015 Douglas Christopher Wilson - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/senchalabs/connect -Copy Webpack Plugin 4.6.0 -Attribution Statements -https://github.com/webpack-contrib/copy-webpack-plugin - -Copyright Statements -Copyright JS Foundation and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/webpack-contrib/copy-webpack-plugin -core-js 2.5.1 -Attribution Statements -https://github.com/zloirock/core-js - -Copyright Statements -Copyright (c) 2014-2016 Denis Pushkarev - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/zloirock/core-js -core-js 2.6.2 -Attribution Statements -https://github.com/zloirock/core-js - -Copyright Statements -Copyright (c) 2014-2016 Denis Pushkarev - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/zloirock/core-js -core-util-is 1.0.2 -Attribution Statements -https://github.com/isaacs/core-util-is - -Copyright Statements -Copyright Node.js contributors. All rights reserved. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/isaacs/core-util-is -css-loader 2.1.1 -Attribution Statements -https://github.com/webpack-contrib/css-loader - -Copyright Statements -Copyright JS Foundation and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/webpack-contrib/css-loader -custom-event-polyfill 1.0.6 -Attribution Statements -https://github.com/kumarharsh/custom-event-polyfill - -Copyright Statements -Copyright (c) 2016 Evan Krambuhl - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/kumarharsh/custom-event-polyfill -date-fns 1.30.1 -Attribution Statements -https://date-fns.org - -Copyright Statements -Copyright © 2018 Sasha Koss - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/date-fns/date-fns -deepcopy.js 2.0.0 -Attribution Statements -https://github.com/sasaplus1/deepcopy.js - -Copyright Statements -Copyright (c) 2013 sasa+1 - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/sasaplus1/deepcopy.js -DefinitelyTyped -Attribution Statements -http://definitelytyped.org/ - -Copyright Statements -Copyrights are respective of each contributor listed at the beginning of each definition file. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/DefinitelyTyped/DefinitelyTyped -dicer 0.3.0 -Attribution Statements -https://github.com/mscdex/dicer - -Copyright Statements -Copyright Brian White. All rights reserved. - -License Text (https://spdx.org/licenses/MIT.html) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/mscdex/dicer -DocStrap 1.0.0 -Attribution Statements -https://github.com/docstrap/docstrap - -Copyright Statements -Copyright (c) 2012-15 Terry Weiss & Contributors. All rights reserved. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/docstrap/docstrap -DOM4J 1.6.1 -Attribution Statements -http://dom4j.org -http://dom4j.sourceforge.net - -Copyright Statements -Copyright 2001-2010 (C) MetaStuff, Ltd. All Rights Reserved. - -License Text (https://github.com/dom4j/dom4j/blob/master/LICENSE) -Copyright 2001-2010 (C) MetaStuff, Ltd. All Rights Reserved. - -Redistribution and use of this software and associated documentation -("Software"), with or without modification, are permitted provided -that the following conditions are met: - -1. Redistributions of source code must retain copyright - statements and notices. Redistributions must also contain a - copy of this document. - -2. Redistributions in binary form must reproduce the - above copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - -3. The name "DOM4J" must not be used to endorse or promote - products derived from this Software without prior written - permission of MetaStuff, Ltd. For written permission, - please contact dom4j-info@metastuff.com. - -4. Products derived from this Software may not be called "DOM4J" - nor may "DOM4J" appear in their names without prior written - permission of MetaStuff, Ltd. DOM4J is a registered - trademark of MetaStuff, Ltd. - -5. Due credit should be given to the DOM4J Project - - http://dom4j.sourceforge.net - -THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -Source materials are available for download at: https://github.com/dom4j/dom4j -EasyMock 3.4 -Attribution Statements -http://easymock.org/ - -Copyright Statements -Copyright 2001-2019 the original author or authors. - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/easymock/easymock -End-to-End (e2e) 1.0.0 -Attribution Statements -https://github.com/willscott/e2e - -Copyright Statements -https://wills.co.tt - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://www.npmjs.com/package/e2e -ESLint Scope 4.0.0 -Attribution Statements -https://github.com/eslint/eslint-scope - -Copyright Statements -Copyright JS Foundation and other contributors, https://js.foundation -Copyright (C) 2012-2013 Yusuke Suzuki (twitter: @Constellation) and other contributors. - -License Text (http://spdx.org/licenses/BSD-2-Clause) -Made available under the BSD 2-Clause "Simplified" or "FreeBSD" License. See Appendix for full text. - -Source materials are available for download at: https://github.com/eslint/eslint-scope -EventSource 1.0.7 -Attribution Statements -https://github.com/EventSource/eventsource - -Copyright Statements -Copyright (c) EventSource GitHub organisation - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/EventSource/eventsource -Express 4.16.3 -Attribution Statements -https://expressjs.com/ - -Copyright Statements -Copyright (c) 2009-2014 TJ Holowaychuk -Copyright (c) 2013-2014 Roman Shtylman -Copyright (c) 2014-2015 Douglas Christopher Wilson - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/expressjs/express -fast-xml-parser 3.17.1 -Attribution Statements -https://github.com/NaturalIntelligence/fast-xml-parser - -fast-xml-parser may include software under license from the following copyright holder: -Copyright 2013 Timothy J Fontaine - -Copyright Statements -Copyright (c) 2017 Amit Kumar Gupta - -License Text (https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/LICENSE) -MIT License - -Copyright (c) 2017 Amit Kumar Gupta - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -If you use this library in a public repository then you give us the right to mention your company name and logo in user's list without further permission required, but you can request them to be taken down within 30 days. - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -Source materials are available for download at: https://github.com/NaturalIntelligence/fast-xml-parser -file-loader 3.0.1 -Attribution Statements -https://github.com/webpack-contrib/file-loader - -Copyright Statements -Copyright JS Foundation and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/webpack-contrib/file-loader -FileSaver.js 1.3.3 -Attribution Statements -https://eligrey.com/blog/saving-generated-files-on-the-client-side/ - -Copyright Statements -Copyright © 2016 Eli Grey. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/eligrey/FileSaver.js -Font Awesome 4.7.0 -Attribution Statements -http://fontawesome.io - -Font Awesome Free is free, open source, and GPL friendly. You can use it for -commercial projects, open source projects, or really almost whatever you want. -Full Font Awesome Free license: https://fontawesome.com/license/free. - -# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) -In the Font Awesome Free download, the CC BY 4.0 license applies to all icons -packaged as SVG and JS file types. - -# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL) -In the Font Awesome Free download, the SIL OFL license applies to all icons -packaged as web and desktop font files. - -# Code: MIT License (https://opensource.org/licenses/MIT) -In the Font Awesome Free download, the MIT license applies to all non-font and -non-icon files. - -# Attribution -Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font -Awesome Free files already contain embedded comments with sufficient -attribution, so you shouldn't need to do anything additional when using these -files normally. - -We've kept attribution comments terse, so we ask that you do not actively work -to remove them from files, especially code. They're a great way for folks to -learn about Font Awesome. - -# Brand Icons -All brand icons are trademarks of their respective owners. The use of these -trademarks does not indicate endorsement of the trademark holder by Font -Awesome, nor vice versa. **Please do not use brand logos for any purpose except -to represent the company, product, or service to which they refer.** - -Copyright Statements -Copyright (c) Font Awesome - -License Text (https://fontawesome.com/license) -Made available under commercial license. - -Source materials are available for download at: https://github.com/FortAwesome/Font-Awesome -fs-extra 7.0.0 -Attribution Statements -https://github.com/jprichardson/node-fs-extra - -Copyright Statements -Copyright (c) 2011-2017 JP Richardson - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/jprichardson/node-fs-extra -GeoNames 1.0 -Attribution Statements -http://www.geonames.org/source-code/ - -GeoNames is a project of Unxos GmbH, Weingartenstrasse 8, 8708 Männedorf, Switzerland. - -Copyright Statements -Copyright 2012 Marc Wick, geonames.org - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://sourceforge.net/projects/geonames/ -Gradle 4.2.1 -Attribution Statements -https://gradle.org/ - -Gradle Subcomponents: - ------------------------------------------------------------------------------- -License for the slf4j package ------------------------------------------------------------------------------- -SLF4J License - -Copyright (c) 2004-2007 QOS.ch -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -These terms are identical to those of the MIT License, also called the X License or the X11 License, -which is a simple, permissive non-copyleft free software license. It is deemed compatible with virtually -all types of licenses, commercial or otherwise. In particular, the Free Software Foundation has declared it -compatible with GNU GPL. It is also known to be approved by the Apache Software Foundation as compatible -with Apache Software License. - - ------------------------------------------------------------------------------- -License for the JUnit package ------------------------------------------------------------------------------- -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and -documentation distributed under this Agreement, and - -b) in the case of each subsequent Contributor: - -i) changes to the Program, and - -ii) additions to the Program; - -where such changes and/or additions to the Program originate from and are -distributed by that particular Contributor. A Contribution 'originates' from a -Contributor if it was added to the Program by such Contributor itself or anyone -acting on such Contributor's behalf. Contributions do not include additions to -the Program which: (i) are separate modules of software distributed in -conjunction with the Program under their own license agreement, and (ii) are not -derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents " mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. - -"Program" means the Contributions distributed in accordance with this Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. - -2. GRANT OF RIGHTS - -a) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free copyright license to -reproduce, prepare derivative works of, publicly display, publicly perform, -distribute and sublicense the Contribution of such Contributor, if any, and such -derivative works, in source code and object code form. - -b) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed -Patents to make, use, sell, offer to sell, import and otherwise transfer the -Contribution of such Contributor, if any, in source code and object code form. -This patent license shall apply to the combination of the Contribution and the -Program if, at the time the Contribution is added by the Contributor, such -addition of the Contribution causes such combination to be covered by the -Licensed Patents. The patent license shall not apply to any other combinations -which include the Contribution. No hardware per se is licensed hereunder. - -c) Recipient understands that although each Contributor grants the licenses -to its Contributions set forth herein, no assurances are provided by any -Contributor that the Program does not infringe the patent or other intellectual -property rights of any other entity. Each Contributor disclaims any liability to -Recipient for claims brought by any other entity based on infringement of -intellectual property rights or otherwise. As a condition to exercising the -rights and licenses granted hereunder, each Recipient hereby assumes sole -responsibility to secure any other intellectual property rights needed, if any. -For example, if a third party patent license is required to allow Recipient to -distribute the Program, it is Recipient's responsibility to acquire that license -before distributing the Program. - -d) Each Contributor represents that to its knowledge it has sufficient -copyright rights in its Contribution, if any, to grant the copyright license set -forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under its -own license agreement, provided that: - -a) it complies with the terms and conditions of this Agreement; and - -b) its license agreement: - -i) effectively disclaims on behalf of all Contributors all warranties and -conditions, express and implied, including warranties or conditions of title and -non-infringement, and implied warranties or conditions of merchantability and -fitness for a particular purpose; - -ii) effectively excludes on behalf of all Contributors all liability for -damages, including direct, indirect, special, incidental and consequential -damages, such as lost profits; - -iii) states that any provisions which differ from this Agreement are offered -by that Contributor alone and not by any other party; and - -iv) states that source code for the Program is available from such -Contributor, and informs licensees how to obtain it in a reasonable manner on or -through a medium customarily used for software exchange. - -When the Program is made available in source code form: - -a) it must be made available under this Agreement; and - -b) a copy of this Agreement must be included with each copy of the Program. - -Contributors may not remove or alter any copyright notices contained within the -Program. - -Each Contributor must identify itself as the originator of its Contribution, if -any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, if -a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, damages -and costs (collectively "Losses") arising from claims, lawsuits and other legal -actions brought by a third party against the Indemnified Contributor to the -extent caused by the acts or omissions of such Commercial Contributor in -connection with its distribution of the Program in a commercial product -offering. The obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. In order -to qualify, an Indemnified Contributor must: a) promptly notify the Commercial -Contributor in writing of such claim, and b) allow the Commercial Contributor to -control, and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may participate in -any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If that -Commercial Contributor then makes performance claims, or offers warranties -related to Product X, those performance claims and warranties are such -Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a court -requires any other Contributor to pay any damages as a result, the Commercial -Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each -Recipient is solely responsible for determining the appropriateness of using and -distributing the Program and assumes all risks associated with its exercise of -rights under this Agreement, including but not limited to the risks and costs of -program errors, compliance with applicable laws, damage to or loss of data, -programs or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS -GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under applicable -law, it shall not affect the validity or enforceability of the remainder of the -terms of this Agreement, and without further action by the parties hereto, such -provision shall be reformed to the minimum extent necessary to make such -provision valid and enforceable. - -If Recipient institutes patent litigation against a Contributor with respect to -a patent applicable to software (including a cross-claim or counterclaim in a -lawsuit), then any patent licenses granted by that Contributor to such Recipient -under this Agreement shall terminate as of the date such litigation is filed. In -addition, if Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the Program -itself (excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted under -Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue and -survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to time. -No one other than the Agreement Steward has the right to modify this Agreement. -IBM is the initial Agreement Steward. IBM may assign the responsibility to serve -as the Agreement Steward to a suitable separate entity. Each new version of the -Agreement will be given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the Agreement -under which it was received. In addition, after a new version of the Agreement -is published, Contributor may elect to distribute the Program (including its -Contributions) under the new version. Except as expressly stated in Sections -2(a) and 2(b) above, Recipient receives no rights or licenses to the -intellectual property of any Contributor under this Agreement, whether -expressly, by implication, estoppel or otherwise. All rights in the Program not -expressly granted under this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation. - ------------------------------------------------------------------------------- -License for the JCIFS package ------------------------------------------------------------------------------- -JCIFS License - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - -Copyright Statements -© Gradle Inc. 2017 - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://services.gradle.org/distributions/gradle-4.5.1-bin.zip -Gradle 5.0.1 -Attribution Statements -https://gradle.org/ - -Gradle Subcomponents: - ------------------------------------------------------------------------------- -License for the slf4j package ------------------------------------------------------------------------------- -SLF4J License - -Copyright (c) 2004-2007 QOS.ch -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -These terms are identical to those of the MIT License, also called the X License or the X11 License, -which is a simple, permissive non-copyleft free software license. It is deemed compatible with virtually -all types of licenses, commercial or otherwise. In particular, the Free Software Foundation has declared it -compatible with GNU GPL. It is also known to be approved by the Apache Software Foundation as compatible -with Apache Software License. - - ------------------------------------------------------------------------------- -License for the JUnit package ------------------------------------------------------------------------------- -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and -documentation distributed under this Agreement, and - -b) in the case of each subsequent Contributor: - -i) changes to the Program, and - -ii) additions to the Program; - -where such changes and/or additions to the Program originate from and are -distributed by that particular Contributor. A Contribution 'originates' from a -Contributor if it was added to the Program by such Contributor itself or anyone -acting on such Contributor's behalf. Contributions do not include additions to -the Program which: (i) are separate modules of software distributed in -conjunction with the Program under their own license agreement, and (ii) are not -derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents " mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. - -"Program" means the Contributions distributed in accordance with this Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. - -2. GRANT OF RIGHTS - -a) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free copyright license to -reproduce, prepare derivative works of, publicly display, publicly perform, -distribute and sublicense the Contribution of such Contributor, if any, and such -derivative works, in source code and object code form. - -b) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed -Patents to make, use, sell, offer to sell, import and otherwise transfer the -Contribution of such Contributor, if any, in source code and object code form. -This patent license shall apply to the combination of the Contribution and the -Program if, at the time the Contribution is added by the Contributor, such -addition of the Contribution causes such combination to be covered by the -Licensed Patents. The patent license shall not apply to any other combinations -which include the Contribution. No hardware per se is licensed hereunder. - -c) Recipient understands that although each Contributor grants the licenses -to its Contributions set forth herein, no assurances are provided by any -Contributor that the Program does not infringe the patent or other intellectual -property rights of any other entity. Each Contributor disclaims any liability to -Recipient for claims brought by any other entity based on infringement of -intellectual property rights or otherwise. As a condition to exercising the -rights and licenses granted hereunder, each Recipient hereby assumes sole -responsibility to secure any other intellectual property rights needed, if any. -For example, if a third party patent license is required to allow Recipient to -distribute the Program, it is Recipient's responsibility to acquire that license -before distributing the Program. - -d) Each Contributor represents that to its knowledge it has sufficient -copyright rights in its Contribution, if any, to grant the copyright license set -forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under its -own license agreement, provided that: - -a) it complies with the terms and conditions of this Agreement; and - -b) its license agreement: - -i) effectively disclaims on behalf of all Contributors all warranties and -conditions, express and implied, including warranties or conditions of title and -non-infringement, and implied warranties or conditions of merchantability and -fitness for a particular purpose; - -ii) effectively excludes on behalf of all Contributors all liability for -damages, including direct, indirect, special, incidental and consequential -damages, such as lost profits; - -iii) states that any provisions which differ from this Agreement are offered -by that Contributor alone and not by any other party; and - -iv) states that source code for the Program is available from such -Contributor, and informs licensees how to obtain it in a reasonable manner on or -through a medium customarily used for software exchange. - -When the Program is made available in source code form: - -a) it must be made available under this Agreement; and - -b) a copy of this Agreement must be included with each copy of the Program. - -Contributors may not remove or alter any copyright notices contained within the -Program. - -Each Contributor must identify itself as the originator of its Contribution, if -any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, if -a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, damages -and costs (collectively "Losses") arising from claims, lawsuits and other legal -actions brought by a third party against the Indemnified Contributor to the -extent caused by the acts or omissions of such Commercial Contributor in -connection with its distribution of the Program in a commercial product -offering. The obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. In order -to qualify, an Indemnified Contributor must: a) promptly notify the Commercial -Contributor in writing of such claim, and b) allow the Commercial Contributor to -control, and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may participate in -any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If that -Commercial Contributor then makes performance claims, or offers warranties -related to Product X, those performance claims and warranties are such -Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a court -requires any other Contributor to pay any damages as a result, the Commercial -Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each -Recipient is solely responsible for determining the appropriateness of using and -distributing the Program and assumes all risks associated with its exercise of -rights under this Agreement, including but not limited to the risks and costs of -program errors, compliance with applicable laws, damage to or loss of data, -programs or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS -GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under applicable -law, it shall not affect the validity or enforceability of the remainder of the -terms of this Agreement, and without further action by the parties hereto, such -provision shall be reformed to the minimum extent necessary to make such -provision valid and enforceable. - -If Recipient institutes patent litigation against a Contributor with respect to -a patent applicable to software (including a cross-claim or counterclaim in a -lawsuit), then any patent licenses granted by that Contributor to such Recipient -under this Agreement shall terminate as of the date such litigation is filed. In -addition, if Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the Program -itself (excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted under -Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue and -survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to time. -No one other than the Agreement Steward has the right to modify this Agreement. -IBM is the initial Agreement Steward. IBM may assign the responsibility to serve -as the Agreement Steward to a suitable separate entity. Each new version of the -Agreement will be given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the Agreement -under which it was received. In addition, after a new version of the Agreement -is published, Contributor may elect to distribute the Program (including its -Contributions) under the new version. Except as expressly stated in Sections -2(a) and 2(b) above, Recipient receives no rights or licenses to the -intellectual property of any Contributor under this Agreement, whether -expressly, by implication, estoppel or otherwise. All rights in the Program not -expressly granted under this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation. - ------------------------------------------------------------------------------- -License for the JCIFS package ------------------------------------------------------------------------------- -JCIFS License - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - -Copyright Statements -© Gradle Inc. 2017 - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://services.gradle.org/distributions/gradle-4.5.1-bin.zip -Gradle Bintray Plugin 1.7.2 -Attribution Statements -https://plugins.gradle.org/plugin/com.jfrog.bintray/1.7.2 - -Copyright Statements -(c) All rights reserved JFrog - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/bintray/gradle-bintray-plugin -Gradle Plugin for Node 1.1.1 -Attribution Statements -https://plugins.gradle.org/plugin/com.moowork.node/1.1.1 - -Copyright Statements -Sten Roger Sandvik - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/srs/gradle-node-plugin -Gradle Properties Plugin 1.4.6 -Attribution Statements -https://plugins.gradle.org/plugin/net.saliman.properties - -Copyright Statements -Copyright 2012-2016 Steven C. Saliman - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/stevesaliman/gradle-properties-plugin -Gson 2.8.2 -Attribution Statements -http://code.google.com/p/google-gson/ - -Copyright Statements -Copyright 2008 Google Inc. - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/google/gson -Guava 18.0 -Attribution Statements -https://github.com/google/guava/wiki/Release18 - -Copyright Statements -Copyright (C) 2015 The Guava Authors - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/google/guava -gulp 4.0.2 -Attribution Statements -https://gulpjs.com/ - -Copyright Statements -Copyright (c) 2013-2018 Blaine Bublitz , Eric Schoffstall and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/gulpjs/gulp -gulp-jsdoc3 1.0.1 -Attribution Statements -https://github.com/mlucool/gulp-jsdoc3 - -Copyright Statements -Marc Udoff https://github.com/mlucool - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/mlucool/gulp-jsdoc3 -gulp-jshint 2.1.0 -Attribution Statements -https://github.com/spalger/gulp-jshint - -Copyright Statements -Copyright (c) 2015 Spencer Alger - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/spalger/gulp-jshint -gulp-mocha 6.0.0 -Attribution Statements -https://github.com/sindresorhus/gulp-mocha - -Copyright Statements -Copyright (c) Sindre Sorhus (sindresorhus.com) - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/sindresorhus/gulp-mocha -gulp-zip 4.2.0 -Attribution Statements -https://github.com/sindresorhus/gulp-zip - -Copyright Statements -Copyright (c) Sindre Sorhus (sindresorhus.com) - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/sindresorhus/gulp-zip -H2 Database Engine 1.4.193 -Attribution Statements -http://www.h2database.com/html/main.html - -Copyright Statements -Copyright 2004-2018 H2 Group. - -License Text (http://spdx.org/licenses/EPL-1.0) -Made available under the Eclipse Public License 1.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/h2database/h2database -hamcrest-junit 2.0.0.0 -Attribution Statements -https://github.com/hamcrest/hamcrest-junit - -Copyright Statements -Copyright (c) 2000-2006 hamcrest.org - -License Text (http://spdx.org/licenses/EPL-1.0.html) -Made available under the Eclipse Public License 1.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/hamcrest/hamcrest-junit -HighCharts JS 6.2.0 -Attribution Statements -http://www.highcharts.com - -Copyright Statements -(c) 2009-2012 Torstein Honsi - -License Text () -Made available under commercial license. - -HTML Webpack Plugin 4.0.0-beta.5 -Attribution Statements -https://github.com/jantimon/html-webpack-plugin - -Copyright Statements -Copyright JS Foundation and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/jantimon/html-webpack-plugin -HtmlCleaner 2.21 -Attribution Statements -http://htmlcleaner.sourceforge.net/ - -Copyright Statements -Copyright (c) 2006-2017, HtmlCleaner team. All rights reserved. - -License Text (https://spdx.org/licenses/BSD-3-Clause.html) -Made available under the BSD 3-Clause "New" or "Revised" License. See Appendix for full text. - -Source materials are available for download at: http://htmlcleaner.sourceforge.net/download.php -http-proxy-middleware 0.19.1 -Attribution Statements -https://github.com/chimurai/http-proxy-middleware - -Copyright Statements -Copyright (c) 2015 Steven Chim - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/chimurai/http-proxy-middleware -HyperSQL Database (HSQLDB) 2.4.0 -Attribution Statements -http://hsqldb.org/ - -For work originally developed by the Hypersonic SQL Group: - -Copyright (c) 1995-2000 by the Hypersonic SQL Group. -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -Neither the name of the Hypersonic SQL Group nor the names of its -contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many individuals on behalf of the -Hypersonic SQL Group. - -Copyright Statements -Copyright (c) 2001-2016, The HSQL Development Group -All rights reserved. - -License Text (http://spdx.org/licenses/BSD-3-Clause) -Made available under the BSD 3-Clause "New" or "Revised" License. See Appendix for full text. - -Source materials are available for download at: http://mvnrepository.com/artifact/org.hsqldb/hsqldb -IcoMoon 1.0 generated files -Attribution Statements -https://icomoon.io/#app-features - -Copyright Statements -Copyright (c) IcoMoon (icomoon.io) - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://icomoon.io/#app-features -intercept-stdout 0.1.2 -Attribution Statements -https://github.com/sfarthin/intercept-stdout - -Copyright Statements -Copyright (c) 2014 Steve Farthing - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/sfarthin/intercept-stdout -Intl.js 1.2.5 -Attribution Statements -https://github.com/andyearnshaw/Intl.js - -Contents of the `locale-data` directory are a modified form of the Unicode CLDR -data found at http://www.unicode.org/cldr/data/. It comes with the following -license. - -COPYRIGHT AND PERMISSION NOTICE - -Copyright (c) 1991-2013 Unicode, Inc. All rights reserved. Distributed under -the Terms of Use in http://www.unicode.org/copyright.html. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -the Unicode data files and any associated documentation (the "Data Files") or -Unicode software and any associated documentation (the "Software") to deal in -the Data Files or Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, and/or sell copies -of the Data Files or Software, and to permit persons to whom the Data Files or -Software are furnished to do so, provided that (a) the above copyright -notice(s) and this permission notice appear with all copies of the Data Files -or Software, (b) both the above copyright notice(s) and this permission notice -appear in associated documentation, and (c) there is clear notice in each -modified Data File or in the Software as well as in the documentation -associated with the Data File(s) or Software that the data or software has been -modified. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD -PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN -THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL -DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR -SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall not be -used in advertising or otherwise to promote the sale, use or other dealings in -these Data Files or Software without prior written authorization of the -copyright holder. - -Unicode and the Unicode logo are trademarks of Unicode, Inc. in the United -States and other countries. All third party trademarks referenced herein are -the property of their respective owners. - -Copyright Statements -Copyright (c) 2013 Andy Earnshaw - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/andyearnshaw/Intl.js -Jackson Annotations 2.10.3 -Attribution Statements -http://wiki.fasterxml.com/JacksonHome - -Copyright Statements -Copyright ©2009 FasterXML, LLC - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: http://github.com/FasterXML/jackson -Jackson Core 2.10.3 -Attribution Statements -http://wiki.fasterxml.com/JacksonHome - -Copyright Statements -Copyright ©2009 FasterXML, LLC - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/FasterXML/jackson-core -Jackson Core 2.11.0 -Attribution Statements -http://wiki.fasterxml.com/JacksonHome - -Copyright Statements -Copyright ©2009 FasterXML, LLC - -License Text (http://www.apache.org/licenses/LICENSE-2.0.txt) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/FasterXML/jackson-core -Jackson Databind 2.10.3 -Attribution Statements -http://wiki.fasterxml.com/JacksonHome - -Jackson Databind may include the following software under license: -cglib 2.2.2 (Apache-2.0) - Copyright 2004 The Apache Software Foundation -Apache Groovy 1.7.9 (Apache-2.0) - Copyright 2003-2019 The Apache Software Foundation -Hibernate-cglib-repack 2.1_3 (LGPL-2.1) - Copyright (c) 2010 Red Hat, Inc. -Jackson Annotations 2.5.0 (Apache-2.0) - Copyright ©2009 FasterXML, LLC -JSR-275 0.9.2 - © 2019, Oracle Corporation and/or its affiliates. - -Copyright Statements -Copyright ©2009 FasterXML, LLC - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/FasterXML/jackson-databind -Jackson Databind 2.11.0 -Attribution Statements -http://wiki.fasterxml.com/JacksonHome - -Jackson Databind may include the following software under license: -cglib 2.2.2 (Apache-2.0) - Copyright 2004 The Apache Software Foundation -Apache Groovy 1.7.9 (Apache-2.0) - Copyright 2003-2019 The Apache Software Foundation -Hibernate-cglib-repack 2.1_3 (LGPL-2.1) - Copyright (c) 2010 Red Hat, Inc. -Jackson Annotations 2.5.0 (Apache-2.0) - Copyright ©2009 FasterXML, LLC -JSR-275 0.9.2 - © 2019, Oracle Corporation and/or its affiliates. - -Copyright Statements -Copyright ©2009 FasterXML, LLC - -License Text (http://www.apache.org/licenses/LICENSE-2.0.txt) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/FasterXML/jackson-databind -Jackson Dataformat CSV 2.10.3 -Attribution Statements -https://github.com/FasterXML/jackson-dataformat-csv - -Copyright Statements -Copyright ©2009 FasterXML, LLC - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/FasterXML/jackson-dataformat-csv -Jackson Dataformat XML 2.10.3 -Attribution Statements -http://wiki.fasterxml.com/JacksonExtensionXmlDataBinding - -Copyright Statements -Copyright ©2009 FasterXML, LLC - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/FasterXML/jackson-dataformat-xml -Jackson Module Kotlin 2.10.3 -Attribution Statements -https://github.com/FasterXML/jackson-module-kotlin - -Copyright Statements -Copyright ©2009-2011 FasterXML, LLC. - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-kotlin -Jaeger 1.12 -Attribution Statements -https://www.jaegertracing.io/ - -Includes software developed at Uber Technologies, Inc. (https://eng.uber.com/). - -Copyright Statements -Copyright 2015-2019 The Jaeger Project Authors - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/jaegertracing/jaeger -Jasmine 2.8.0 -Attribution Statements -https://jasmine.github.io/ - -Copyright Statements -Copyright (c) 2008-2019 Pivotal Labs - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/jasmine/jasmine -Jasmine Reporters 2.3.2 -Attribution Statements -https://github.com/larrymyers/jasmine-reporters - -Copyright Statements -Copyright (c) 2010 Larry Myers - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/larrymyers/jasmine-reporters -jasmine-spec-reporter 4.2.1 -Attribution Statements -https://github.com/bcaudan/jasmine-spec-reporter - -Copyright Statements -Copyright 2014 Bastien Caudan - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/bcaudan/jasmine-spec-reporter -JavaMail 1.6.1 -Attribution Statements -https://javaee.github.io/javamail/ - -Copyright Statements -Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. - -License Text (http://www.spdx.org/licenses/CDDL-1.1.html) -Made available under the Common Development and Distribution License 1.1. See Appendix for full text. - -Source materials are available for download at: https://mvnrepository.com/artifact/com.sun.mail/javax.mail -javax.ws.rs-api (JAX-RS API) 2.1 -Attribution Statements -https://github.com/jax-rs/api - -Copyright Statements -Copyright (c) 2010-2017 Oracle and/or its affiliates. All rights reserved. - -License Text (http://www.spdx.org/licenses/CDDL-1.1.html) -Made available under the Common Development and Distribution License 1.1. See Appendix for full text. - -Source materials are available for download at: https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -Java™ Architecture for XML Binding (JAXB) 2.3.2 -Attribution Statements -https://javaee.github.io/jaxb-v2/ - -Copyright Statements -Copyright (c) 1997-2017 Oracle and/or its affiliates. All rights reserved. - -License Text (http://www.spdx.org/licenses/CDDL-1.1.html) -Made available under the Common Development and Distribution License 1.1. See Appendix for full text. - -Source materials are available for download at: https://github.com/javaee/jaxb-v2 -JAX RS Provider For JSON Content Type (jackson-jaxrs) 1.9.13 -Attribution Statements -http://jackson.codehaus.org - -Copyright Statements -Copyright © FasterXML. - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: http://mvnrepository.com/artifact/org.codehaus.jackson/jackson-jaxrs/1.9.13 -JDOM 2.0.6 -Attribution Statements -http://www.jdom.org - -This product includes software developed by the JDOM Project (http://www.jdom.org/). - -Copyright Statements -Copyright (C) 2000-2012 Jason Hunter & Brett McLaughlin. All rights reserved. - -License Text (https://github.com/hunterhacker/jdom/blob/master/LICENSE.txt) -Copyright (C) 2000-2012 Jason Hunter & Brett McLaughlin. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions, and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions, and the disclaimer that follows - these conditions in the documentation and/or other materials - provided with the distribution. - - 3. The name "JDOM" must not be used to endorse or promote products - derived from this software without prior written permission. For - written permission, please contact . - - 4. Products derived from this software may not be called "JDOM", nor - may "JDOM" appear in their name, without prior written permission - from the JDOM Project Management . - - In addition, we request (but do not require) that you include in the - end-user documentation provided with the redistribution and/or in the - software itself an acknowledgement equivalent to the following: - "This product includes software developed by the - JDOM Project (http://www.jdom.org/)." - Alternatively, the acknowledgment may be graphical using the logos - available at http://www.jdom.org/images/logos. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - This software consists of voluntary contributions made by many - individuals on behalf of the JDOM Project and was originally - created by Jason Hunter and - Brett McLaughlin . For more information - on the JDOM Project, please see . - -Source materials are available for download at: https://github.com/hunterhacker/jdom/ -Jersey 1.19.3 -Attribution Statements -https://jersey.java.net/ - -%% The following software may be included in this product: ASM - Use of any of this software is governed by the terms of the license below: - -Copyright (c) 2000-2005 INRIA, France Telecom -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -THE POSSIBILITY OF SUCH DAMAGE. - - -%% The following software may be included in this product: Jettison - Use of any of this software is governed by the terms of the license below: - - -Copyright 2006 Envoi Solutions LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Copyright Statements -Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. - -License Text (http://www.spdx.org/licenses/CDDL-1.1.html) -Made available under the Common Development and Distribution License 1.1. See Appendix for full text. - -Source materials are available for download at: https://github.com/jersey/jersey/ -jQuery 2.0.0 -Attribution Statements -http://jquery.com/ - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/jquery/jquery - -All files located in the node_modules and external directories are -externally maintained libraries used by this software which have their -own licenses; we recommend you read them, as their terms may differ from -the terms above. - -JQuery depends on Sizzle -http://sizzlejs.com -Copyright JS Foundation and other contributors, https://js.foundation/ -Made available under the MIT License. - -Copyright Statements -Copyright (c) 2009-2019 John Resig, jQuery Foundation, Inc. - -License Text (https://spdx.org/licenses/MIT.html) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/jquery/jquery -JS-YAML 3.13.1 -Attribution Statements -http://nodeca.github.io/js-yaml/ - -Copyright Statements -Copyright (C) 2011-2015 by Vitaly Puzrin - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/nodeca/js-yaml -JSDoc 3.6.3 -Attribution Statements -http://usejsdoc.org/ - -JSDoc 3 includes or depends upon the following third-party software, either in whole or in part. Each third-party software package is provided under its own license. - -MIT License -Several of the following software packages are distributed under the MIT license, which is reproduced below: - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Google Code Prettify -Google Code Prettify is distributed under the Apache License 2.0, which is included with this package. - -Copyright (c) 2006 Google Inc. - -The source code for Google Code Prettify is available at: https://code.google.com/p/google-code-prettify/ - -Jasmine -Jasmine is distributed under the MIT license, which is reproduced above. - -Copyright (c) 2008-2011 Pivotal Labs. - -The source code for Jasmine is available at: https://github.com/pivotal/jasmine - -jasmine-node -jasmine-node is distributed under the MIT license, which is reproduced above. - -Copyright (c) 2010 Adam Abrons and Misko Hevery (http://getangular.com). - -The source code for jasmine-node is available at: https://github.com/mhevery/jasmine-node - -Open Sans -Open Sans is distributed under the Apache License 2.0, which is included with this package. - -Copyright (c) 2010-2011, Google Inc. - -This typeface, including the complete set of variations, are available at: http://www.google.com/fonts/specimen/Open+Sans - -Tomorrow Theme for Google Code Prettify -The Tomorrow Theme for Google Code Prettify is distributed under the MIT license, which is reproduced above. - -Copyright (c) 2016 Yoshihide Jimbo. - -The source code for the Tomorrow Theme is available at: https://github.com/jmblog/color-themes-for-google-code-prettify - -Copyright Statements -Copyright (c) 2011-present Michael Mathews micmath@gmail.com and the contributors to JSDoc. All rights reserved. - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/jsdoc3/jsdoc -JSHint 2.11.0 -Attribution Statements -https://jshint.com/ - -Copyright Statements -Copyright 2012 Anton Kovalyov (http://jshint.com) - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/jshint/jshint -JSON 20080701 -Attribution Statements -http://www.json.org/ - -Copyright Statements -Copyright (c) 2008 JSON.org - -License Text (https://spdx.org/licenses/JSON.html) -Made available under the JSON License. See Appendix for full text. - -Source materials are available for download at: https://github.com/douglascrockford/JSON-java -JSON 20160810 -Attribution Statements -http://www.json.org/ - -Copyright Statements -Copyright (c) 2016 JSON.org - -License Text (https://spdx.org/licenses/JSON.html) -Made available under the JSON License. See Appendix for full text. - -Source materials are available for download at: https://github.com/douglascrockford/JSON-java -json-schema-validator -Attribution Statements -https://github.com/networknt/json-schema-validator - -========================================================================== -Third Party Dependencies -========================================================================== - -This project includes or depends on code from third party projects. - -The following are attribution notices from dependencies: - ------------------ -Undertow ------------------ - -JBoss, Home of Professional Open Source. -Copyright 2014 Red Hat, Inc., and individual contributors -as indicated by the @author tags. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ------------------ -Jackson ------------------ - -This copy of Jackson JSON processor streaming parser/generator is licensed under the -Apache (Software) License, version 2.0 ("the License"). -See the License for details about distribution rights, and the -specific rights regarding derivate works. - -You may obtain a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - ------------------ -SLF4J ------------------ - -Copyright (c) 2004-2017 QOS.ch -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -https://www.slf4j.org/license.html - ------------------ -Commons-lang3 ------------------ - -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ------------------ -Logback ------------------ - -Logback: the reliable, generic, fast and flexible logging framework. -Copyright (C) 1999-2015, QOS.ch. All rights reserved. - -This program and the accompanying materials are dual-licensed under -either the terms of the Eclipse Public License v1.0 as published by -the Eclipse Foundation - - or (per the licensee's choosing) - -under the terms of the GNU Lesser General Public License version 2.1 -as published by the Free Software Foundation. - -Copyright Statements -Copyright (c) 2019 Network New Technologies Inc. - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/networknt/json-schema-validator -json-text-sequence 0.1.1 -Attribution Statements -https://github.com/hildjj/json-text-sequence - -Copyright Statements -Copyright (C) 2018, Joe Hildebrand - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/hildjj/json-text-sequence -JSONassert 1.5.0 -Attribution Statements -http://jsonassert.skyscreamer.org/ - -Copyright Statements -Copyright © 2017. All rights reserved. - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/skyscreamer/JSONassert -JUnit 4.12 -Attribution Statements -https://junit.org/junit4/ - -JUnit depends on Java Hamcrest -http://hamcrest.org/JavaHamcrest/ -Copyright (c) 2000-2015 www.hamcrest.org. All rights reserved. -Made available under the MIT License. -https://spdx.org/licenses/MIT.html - -Copyright Statements -Copyright © 2002-2017 JUnit. All Rights Reserved. - -License Text (http://spdx.org/licenses/EPL-1.0) -Made available under the Eclipse Public License 1.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/junit-team/junit4 -JUnit 5.4.2 -Attribution Statements -https://junit.org/junit5/ - -Copyright Statements -Copyright (C) Christian Stein, Matthias Merdes, Sam Brannen, Johannes Link, Stefan Bechtold, Marc Philipp - -License Text (http://spdx.org/licenses/EPL-1.0) -Made available under the Eclipse Public License 1.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/junit-team/junit5/ -Karma 4.1.0 -Attribution Statements -http://karma-runner.github.io/latest/index.html - -Copyright Statements -Copyright (C) 2011-2019 Google, Inc. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/karma-runner/karma -karma-chrome-launcher 2.2.0 -Attribution Statements -https://github.com/karma-runner/karma-chrome-launcher - -Copyright Statements -Copyright (C) 2011-2013 Google, Inc. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/karma-runner/karma-chrome-launcher -karma-cli 1.0.1 -Attribution Statements -https://github.com/karma-runner/karma-cli - -Copyright Statements -Copyright (C) 2011-2013 Google, Inc. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/karma-runner/karma-cli -karma-coverage-istanbul-reporter 2.0.4 -Attribution Statements -https://github.com/mattlewis92/karma-coverage-istanbul-reporter - -Copyright Statements -Copyright (c) 2017 Matt Lewis - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/mattlewis92/karma-coverage-istanbul-reporter -karma-firefox-launcher 1.0.1 -Attribution Statements -https://github.com/karma-runner/karma-firefox-launcher - -Copyright Statements -Copyright (C) 2011-2013 Google, Inc. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/karma-runner/karma-firefox-launcher -karma-jasmine 1.1.2 -Attribution Statements -https://github.com/karma-runner/karma-jasmine - -karma-jasmine may include the following software under license: -jasmine 3.4.0 (MIT) - Copyright (c) 2008-2019 Pivotal Labs -jasmine-core 3.3 (MIT) - Copyright (c) 2008-2019 Pivotal Labs - -Copyright Statements -Copyright (C) 2011-2013 Google, Inc. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/karma-runner/karma-jasmine -karma-jasmine-html-reporter 0.2.2 -Attribution Statements -https://github.com/dfederm/karma-jasmine-html-reporter - -Copyright Statements -Copyright (C) 2011-2013 Vojta Jína and contributors. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/dfederm/karma-jasmine-html-reporter -Kotlin Standard Library JDK 1.3.31 -Attribution Statements -http://kotlinlang.org/ - -Copyright Statements -Copyright 2010-2018 JetBrains s.r.o. - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib-jdk8 -Lodash 4.17.13 -Attribution Statements -https://lodash.com/ - -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash - -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. - -CC0: http://creativecommons.org/publicdomain/zero/1.0/ - -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above. - -Copyright Statements -Copyright (C) 2018, John-David Dalton - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/lodash/lodash -Logback 1.1.11 -Attribution Statements -http://logback.qos.ch - -Copyright Statements -Copyright (C) 1999-2015, QOS.ch. All rights reserved. - -License Text (http://spdx.org/licenses/EPL-1.0) -Made available under the Eclipse Public License 1.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/qos-ch/logback -Logback 1.2.3 -Attribution Statements -http://logback.qos.ch - -Copyright Statements -Copyright (C) 1999-2015, QOS.ch. All rights reserved. - -License Text (http://spdx.org/licenses/EPL-1.0) -Made available under the Eclipse Public License 1.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/qos-ch/logback -Lunr 0.5.11 -Attribution Statements -https://lunrjs.com/ - -Copyright Statements -Copyright (C) 2015 Oliver Nightingale - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/olivernn/lunr.js -MapR 5.1.0 -Attribution Statements -https://mapr.com/ - -Copyright Statements -MapR Technologies, Inc. - -License Text () -Made available under commercial license. - -Source materials are available for download at: https://mapr.com/download/ -MapR Hadoop Bundle 2.7.0-mapr-1602 -Attribution Statements -https://mapr.com/products/apache-hadoop/ - -Copyright Statements -© MapR Technologies, Inc. All Rights Reserved - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: http://repository.mapr.com/nexus/content/groups/mapr-public/org/apache/hadoop/ -marklogic-contentpump 11.0 -License Text (http://spdx.org/licenses/Apache-2.0.html) - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -marklogic-marklogic-data-hub 5.2.0 -Copyright Statements -Copyright (C) 2020, MarkLogic, MarkLogic Github Contributors - -License Text (http://www.apache.org/licenses/LICENSE-2.0.txt) - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -Material Design Icons (MDI) Iconfont 3.0.3 -Attribution Statements -http://google.github.io/material-design-icons/ - -Copyright Statements -Copyright (C) 2016, Material Design Authors - -License Text (https://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/jossef/material-design-icons-iconfont -Material Design Icons (MDI) Webfont 2.2.43 -Attribution Statements -https://materialdesignicons.com/ - -Copyright Statements -Copyright (c) 2014, Austin Andrews (http://materialdesignicons.com/), with Reserved Font Name Material Design Icons. - -Copyright (c) 2014, Google (http://www.google.com/design/) uses the license at https://github.com/google/material-design-icons/blob/master/LICENSE - -License Text (https://spdx.org/licenses/OFL-1.1.html) -Made available under the SIL Open Font License 1.1. See Appendix for full text. - -Source materials are available for download at: https://github.com/Templarian/MaterialDesign-Webfont -Material Design Lite 1.3.0 -Attribution Statements -http://getmdl.io - -Copyright Statements -Copyright (C) 2016, Google - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/google/material-design-lite -MIT Kerberos v5 1.1.2 -Attribution Statements -http://web.mit.edu/kerberos/www/ - -Copyright Statements -Copyright 1985-2012 by the Massachusetts Institute of Technology. All rights reserved. - -License Text (http://web.mit.edu/kerberos/krb5-devel/doc/mitK5license.html) -Made available under the MIT Kerberos License. See Appendix for full text. - -Source materials are available for download at: http://web.mit.edu/kerberos/www/dist/index.html -Moby Lexical Tools -Attribution Statements -http://icon.shef.ac.uk/Moby/ -http://web.archive.org/web/20170930060409/http://icon.shef.ac.uk/Moby/ - -SGML markup by Jon Bosak, 1992-1994. -XML version by Jon Bosak, 1996-1999. - -Copyright Statements -The XML markup in this version is Copyright © 1999 Jon Bosak. - -License Text (http://icon.shef.ac.uk/Moby/) -ASCII text placed in the public domain by Moby Lexical Tools, 1992. -This work may freely be distributed on condition that it not be modified or altered in any way. - -Source materials are available for download at: http://www.gutenberg.org/ -Mocha 6.2.2 -Attribution Statements -https://mochajs.org/ - -Copyright Statements -Copyright (c) 2011-2018 JS Foundation and contributors, https://js.foundation - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/mochajs/mocha -Mockito 1.10.19 -Attribution Statements -http://site.mockito.org/ - -Copyright Statements -Copyright (c) 2007 Mockito contributors - -License Text (https://spdx.org/licenses/MIT.html) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/mockito/mockito -Moment.js 2.24.0 -Attribution Statements -http://momentjs.com/ - -Copyright Statements -Copyright (c) JS Foundation and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/moment/moment -multipart-stream 2.0.1 -Attribution Statements -https://github.com/hendrikcech/multipart-stream - -Copyright Statements -Copyright (C) 2014, Hendrik Cech - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/hendrikcech/multipart-stream -MXP1: Xml Pull Parser 3rd Edition (XPP3) 1.1.4c -Attribution Statements -http://www.extreme.indiana.edu/xgws/xsoap/xpp/mxp1/ - -Copyright Statements -Copyright (c) 2002 Extreme! Lab, Indiana University. All rights reserved. - -License Text (http://www.extreme.indiana.edu/dist/java-repository/xpp3/licenses/LICENSE.txt) -Copyright (c) 2002 Extreme! Lab, Indiana University. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, - must include the following acknowledgment: - "This product includes software developed by the Indiana University - Extreme! Lab (http://www.extreme.indiana.edu/)." -Alternately, this acknowledgment may appear in the software itself, -if and wherever such third-party acknowledgments normally appear. - -4. The names "Indiana Univeristy" and "Indiana Univeristy Extreme! Lab" -must not be used to endorse or promote products derived from this -software without prior written permission. For written permission, -please contact http://www.extreme.indiana.edu/. - -5. Products derived from this software may not use "Indiana Univeristy" -name nor may "Indiana Univeristy" appear in their name, without prior -written permission of the Indiana University. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHORS, COPYRIGHT HOLDERS OR ITS CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Source materials are available for download at: http://www.extreme.indiana.edu/dist/java-repository/xpp3/distributions/ -ng2-device-detector 1.0.0 -Attribution Statements -https://github.com/KoderLabs/ng2-device-detector - -Copyright Statements -Copyright (C) 2018, Ahsan Ayaz - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/KoderLabs/ng2-device-detector -ngx-bootstrap 3.0.1 -Attribution Statements -https://valor-software.com/ngx-bootstrap/#/ - -Copyright Statements -Copyright (C) 2018, Dmitriy Shekhovtsov - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/valor-software/ngx-bootstrap -ngx-bootstrap 3.1.4 -Attribution Statements -https://valor-software.com/ngx-bootstrap/#/ - -Copyright Statements -Copyright (C) 2018, Dmitriy Shekhovtsov - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/valor-software/ngx-bootstrap -node-portfinder 1.0.20 -Attribution Statements -https://github.com/indexzero/node-portfinder - -Copyright Statements -Copyright (c) 2012 Charlie Robbins - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/indexzero/node-portfinder -node-sass 4.12.0 -Attribution Statements -https://github.com/sass/node-sass - -node-sass may include the following software under license: -async-foreach 0.1.3 (MIT) - Copyright (c) 2011 "Cowboy" Ben Alman -chalk 1.1.1 (MIT) - Copyright (c) Sindre Sorhus (sindresorhus.com) -cross-spawn 3.0.0 (MIT) - Copyright (c) 2018 Made With MOXY Lda -gaze 1.0.0 (MIT) - Copyright (c) 2018 Kyle Robinson Young -get-stdin 4.0.1 (MIT) - Copyright (c) Sindre Sorhus (sindresorhus.com) -glob 7.0.3 (ISC) - Copyright (c) Isaac Z. Schlueter and Contributors -in-publish 2.0.0 (ISC) - Copyright (c) 2015, Rebecca Turner -lodash 4.17.15 (MIT) - Copyright JS Foundation and other contributors -meow 3.7.0 (MIT) - Copyright (c) Sindre Sorhus (sindresorhus.com) -mkdirp 0.5.1 (MIT) - Copyright 2010 James Halliday (mail@substack.net) -nan 2.13.2 (MIT) - Copyright (c) 2018 NAN contributors -node-gyp 3.8.0 (MIT) - Copyright (c) 2012 Nathan Rajlich -npmlog 4.0.0 (ISC) - Copyright (c) Isaac Z. Schlueter and Contributors -request 2.88.0 (Apache-2.0) - Copyright 2010-2012 Mikeal Rogers -sass-graph 2.2.4 (MIT) - Copyright 2014 Michael Mifsud -stdout-stream 1.4.0 (MIT) - Copyright 2013 Mathias Buus -true-case-path 1.0.2 (Apache-2.0) - Profiscienc? https://www.profiscience.com/ - -Copyright Statements -Copyright (c) 2013-2016 Andrew Nesbitt - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/sass/node-sass -node-sass-tilde-importer 1.0.2 -Attribution Statements -https://github.com/matthewdavidson/node-sass-tilde-importer - -node-sass-tilde-importer may include the following software under license: -find-parent-dir 0.3.0 (MIT) - Copyright 2013 Thorsten Lorenz. All rights reserved. - -Copyright Statements -Copyright 2016 Matthew Davidson - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/matthewdavidson/node-sass-tilde-importer -node-tar 4.4.9 -Attribution Statements -https://github.com/npm/node-tar - -node-tar may include the following software under license: -chownr 1.1.3 (ISC) - Copyright (c) Isaac Z. Schlueter and Contributors -fs-minipass 2.0.0 (ISC) - Copyright (c) Isaac Z. Schlueter and Contributors -minipass 3.0.0 (ISC) - Copyright (c) npm, Inc. and Contributors -minizlib 2.1.0 (MIT) - Copyright Isaac Z. Schlueter and Contributors; Copyright Node.js contributors. All rights reserved.; Copyright Joyent, Inc. and other Node contributors. All rights reserved. -mkdirp 0.5.0 (MIT) - Copyright 2010 James Halliday (mail@substack.net) -yallist 4.0.0 (ISC) - Copyright (c) Isaac Z. Schlueter and Contributors - -Copyright Statements -Copyright (c) Isaac Z. Schlueter and Contributors - -License Text (http://spdx.org/licenses/ISC.html) -Made available under the ISC License. See Appendix for full text. - -Source materials are available for download at: https://github.com/npm/node-tar -Noto Sans webfont -Attribution Statements -https://fonts.google.com/specimen/Noto+Sans - -Copyright Statements -Google - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://fonts.google.com/specimen/Noto+Sans -OkHttp 4.4.0 -Attribution Statements -http://square.github.io/okhttp/ - -Copyright Statements -Copyright 2016 Square, Inc. - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -okhttp-digest 2.2 -Attribution Statements -https://github.com/rburgst/okhttp-digest/ - -The following NOTICEs are pertain to software distributed with this project. -Apache HttpComponents HttpClient -Copyright 1999-2011 The Apache Software Foundation - -Copyright Statements -rburgst http://rainer.4950.net - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/rburgst/okhttp-digest/ -opencsv 4.1 -Attribution Statements -http://opencsv.sf.net - -Copyright Statements -Copyright © 2017. All rights reserved. - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://sourceforge.net/p/opencsv/source/ci/master/tree/ -PostCSS Loader 3.0.0 -Attribution Statements -https://github.com/postcss/postcss-loader - -Copyright Statements -Copyright 2017 Andrey Sitnik - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/postcss/postcss-loader -Protocol Buffers (protobuf) 2.5.0 -Attribution Statements -https://developers.google.com/protocol-buffers/ - -This license applies to all parts of Protocol Buffers except the following: - - - Atomicops support for generic gcc, located in - src/google/protobuf/stubs/atomicops_internals_generic_gcc.h. - This file is copyrighted by Red Hat Inc. - - - Atomicops support for AIX/POWER, located in - src/google/protobuf/stubs/atomicops_internals_power.h. - This file is copyrighted by Bloomberg Finance LP. - -Code generated by the Protocol Buffer compiler is owned by the owner -of the input file used when generating it. This code is not -standalone and requires a support library to be linked with it. This -support library is itself covered by the above license. - -Copyright Statements -Copyright 2014, Google Inc. All rights reserved. - -License Text (http://spdx.org/licenses/BSD-3-Clause) -Made available under the BSD 3-Clause "New" or "Revised" License. See Appendix for full text. - -Source materials are available for download at: https://github.com/google/protobuf -Protractor 5.4.2 -Attribution Statements -http://www.protractortest.org/#/ - -Copyright Statements -Copyright (c) 2010-2017 Google, Inc. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/angular/protractor -protractor-html-reporter 1.3.2 -Attribution Statements -https://github.com/etxebe/protractor-html-reporter - -protractor-html-reporter may include the following software under license: -fs 0.0.1-security (ISC) - npm https://www.npmjs.com/ -fs-extra 1.0.0 (MIT) - Copyright (c) 2011-2017 JP Richardson -lodash 4.17.2 (MIT) - Copyright JS Foundation and other contributors -path 0.12.7 (MIT) - Copyright Joyent, Inc. and other Node contributors. All rights reserved. -xmldoc 0.5.1 (MIT) - Copyright 2012 Nick Farina. All rights reserved. - -Copyright Statements -Copyright (c) 2016 - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/etxebe/protractor-html-reporter -protractor-jasmine2-html-reporter 0.0.7 -Attribution Statements -https://github.com/Kenzitron/protractor-jasmine2-html-reporter - -protractor-jasmine2-html-reporter may include the following software under license: -async 2.1.4 (MIT) - Copyright (c) 2010-2018 Caolan McMahon -hat 0.0.3 (MIT) - James Halliday mail@substack.net http://substack.net -lodash 4.17.0 (MIT) - Copyright JS Foundation and other contributors -mkdirp 0.5.0 (MIT) - Copyright 2010 James Halliday (mail@substack.net) -string.prototype.startswith 0.2.0 (MIT) - Copyright Mathias Bynens - -Copyright Statements -Alejandro Asensio (http://www.kenzilab.com/) - -License Text (http://spdx.org/licenses/BSD-2-Clause) -Made available under the BSD 2-Clause "Simplified" License. See Appendix for full text. - -Source materials are available for download at: https://github.com/Kenzitron/protractor-jasmine2-html-reporter -protractor-screenshoter-plugin 0.10.3 -Attribution Statements -https://github.com/azachar/protractor-screenshoter-plugin - -protractor-screenshoter-plugin may include the following software under license: -circular-json 0.5.1 (MIT) - Copyright (C) 2013-2017 by Andrea Giammarchi - @WebReflection -fs-extra 7.0.0 (MIT) - Copyright (c) 2011-2017 JP Richardson -klaw-sync 6.0.0 (MIT) - Copyright (c) 2017 Mani Maghsoudlou -lodash 4.17.11 (MIT) - Copyright JS Foundation and other contributors -mkdirp 0.5.1 (MIT) - Copyright 2010 James Halliday (mail@substack.net) -moment 2.20.1 (MIT) - Copyright (c) JS Foundation and other contributors -q 1.5.1 (MIT) - Copyright 2009–2018 Kristopher Michael Kowal. All rights reserved. -screenshoter-report-analyzer 0.6 (MIT) - Copyright (c) 2016 Andrej Zachar -uuid 3.1.0 (MIT) - Copyright (c) 2010-2016 Robert Kieffer and other contributors - -Copyright Statements -Copyright (c) 2015-2016 Andrej Zachar, Abhishek Swain - -Copyright for portions of project protractor-screenshoter-plugin is held -by Abhishek Swain, 2015 as part of project jasmine2-protractor-utils. - -All other copyright for project protractor-screenshoter-plugin is -held by Andrej Zachar, 2016. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/azachar/protractor-screenshoter-plugin -qs 6.9.1 -Attribution Statements -https://github.com/ljharb/qs - -The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors - -Copyright Statements -Copyright (c) 2014 Nathan LaFreniere and other contributors. -All rights reserved. - -License Text (http://spdx.org/licenses/BSD-3-Clause) -Made available under the BSD 3-Clause "New" or "Revised" License. See Appendix for full text. - -Source materials are available for download at: https://github.com/ljharb/qs -read 1.0.7 -Attribution Statements -https://github.com/npm/read - -Copyright Statements -Copyright (c) Isaac Z. Schlueter and Contributors - -License Text (http://spdx.org/licenses/ISC.html) -Made available under the ISC License. See Appendix for full text. - -Source materials are available for download at: https://github.com/npm/read -Request - Simplified HTTP client 2.88.0 -Attribution Statements -https://github.com/request/request - -Copyright Statements -Copyright 2010-2012 Mikeal Rogers - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/request/request -rimraf 2.6.3 -Attribution Statements -https://github.com/isaacs/rimraf - -Copyright Statements -Copyright (c) Isaac Z. Schlueter and Contributors - -License Text (http://spdx.org/licenses/ISC) -Made available under the ISC License. See Appendix for full text. - -Source materials are available for download at: https://github.com/isaacs/rimraf -RxJS 6.3.3 -Attribution Statements -https://rxjs-dev.firebaseapp.com/ - -Copyright Statements -Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/ReactiveX/RxJS -RxJS 6.5.2 -Attribution Statements -https://rxjs-dev.firebaseapp.com/ - -Copyright Statements -Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/ReactiveX/RxJS -sanitize-html 1.22.0 -Attribution Statements -https://github.com/apostrophecms/sanitize-html - -Copyright Statements -Copyright (c) 2013, 2014, 2015 P'unk Avenue LLC - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/apostrophecms/sanitize-html -sass-loader 7.1.0 -Attribution Statements -https://github.com/webpack-contrib/sass-loader - -sass-loader may include the following software under license: -clone-deep 4.0.1 (MIT) - Copyright (c) 2014-2018, Jon Schlinkert. -loader-utils 1.2.3 (MIT) - Copyright JS Foundation and other contributors -neo-async 2.6.1 (MIT) - Copyright (c) 2014-2018 Suguru Motegi -schema-utils 2.4.1 (MIT) - Copyright JS Foundation and other contributors -semver 6.3.0 (ISC) - Copyright (c) Isaac Z. Schlueter and Contributors - -Copyright Statements -Copyright JS Foundation and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/webpack-contrib/sass-loader -Saxon-HE 9.7.0-7 -Attribution Statements -http://www.saxonica.com/products/PD9.9/HE.pdf - -(This notice is included in the Saxon distribution because Saxon includes a QuickSort -module that was originally developed by Wolfgang Hoschek at CERN, and which was licensed -for use under the conditions specified here.) - -Copyright © 1999 CERN - European Organization for Nuclear Research. - -Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose -is hereby granted without fee, provided that the above copyright notice appear in all copies and -that both that copyright notice and this permission notice appear in supporting documentation. -CERN makes no representations about the suitability of this software for any purpose. -It is provided "as is" without expressed or implied warranty. - ------ - -(This notice is included in the Saxon distribution because Saxon -uses code extracted from the PCollections library. The only substantive change -in the version distributed with Saxon is the removal of code that Saxon does not need.) - -(This license is published at https://github.com/hrldcpr/pcollections/blob/master/LICENSE) - -MIT License - -Copyright 2008 Harold Cooper - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - -(This notice is included in the Saxon distribution because Saxon's XPath parser -was originally derived from an XPath parser written by James Clark and made available -under this license. The Saxon XPath parser has since diverged very substantially, but -there are traces of the original code still present.) - -Copyright (c) 1998, 1999 James Clark - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL JAMES CLARK BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of James Clark shall -not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization -from James Clark. - ------ - -(This notice is included in the Saxon distribution because Saxon -uses code for conversion of XML Schema Regular expressions to -Java/.NET regular expressions that was originally written by James -Clark and made available under this license. The Saxon version of -the code has been enhanced in various ways but is still recognizably -based on the original.) - -Copyright (c) 2001-2003 Thai Open Source Software Center Ltd -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - Neither the name of the Thai Open Source Software Center Ltd nor - the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------ - -(This notice is included in the Saxon distribution because Saxon -uses code performing Unicode Normalization that was originally written by Mark -Davis and made available under this license. The Saxon version of the -code has been enhanced in various minor ways but is still recognizably -based on the original. For details of modifications, see the comments in -the source code.) - -COPYRIGHT AND PERMISSION NOTICE -Copyright © 1991-2007 Unicode, Inc. All rights reserved. Distributed under the Terms of Use -in http://www.unicode.org/copyright.html. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode -data files and any associated documentation (the "Data Files") or Unicode software and any -associated documentation (the "Software") to deal in the Data Files or Software without -restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, -and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or -Software are furnished to do so, provided that (a) the above copyright notice(s) and this -permission notice appear with all copies of the Data Files or Software, (b) both the above -copyright notice(s) and this permission notice appear in associated documentation, and -(c) there is clear notice in each modified Data File or in the Software as well as in the -documentation associated with the Data File(s) or Software that the data or software has -been modified. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE -BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA -FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall not be used -in advertising or otherwise to promote the sale, use or other dealings in these -Data Files or Software without prior written authorization of the copyright holder. - -Copyright Statements -Copyright (C) 2017, Saxonica, John Lumley, Debbie Lockett, Michael Kay, O'Neil Delpratt - -License Text (https://spdx.org/licenses/MPL-2.0.html) -Made available under the Mozilla Public License 2.0. See Appendix for full text. - -Source materials are available for download at: https://sourceforge.net/projects/saxon/files/Saxon-HE/ -semver(1) 5.5.1 -Attribution Statements -https://www.npmjs.com/package/semver - -Copyright Statements -Copyright (c) Isaac Z. Schlueter and Contributors - -License Text (http://spdx.org/licenses/ISC) -Made available under the ISC License. See Appendix for full text. - -Source materials are available for download at: https://github.com/npm/node-semver -ShellJS 0.7.8 -Attribution Statements -http://documentup.com/shelljs/shelljs - -Copyright Statements -Copyright (c) 2012, Artur Adib -All rights reserved. - -License Text (http://spdx.org/licenses/BSD-3-Clause) -Made available under the BSD 3-Clause "New" or "Revised" License. See Appendix for full text. - -Source materials are available for download at: https://github.com/shelljs/shelljs -Should.js 13.2.3 -Attribution Statements -http://shouldjs.github.io/ - -Copyright Statements -Copyright(c) 2010-2013 TJ Holowaychuk -Copyright(c) 2013-2017 Denis Bardadym - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/shouldjs/should.js -SLF4J 1.7.25 -Attribution Statements -http://www.slf4j.org - -Copyright Statements -Copyright (c) 2004-2007 QOS.ch. All rights reserved. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/qos-ch/slf4j/tree/master/slf4j-api -SockJS-client 1.3.0 -Attribution Statements -http://sockjs.org - -Copyright Statements -Copyright (c) 2011-2012 VMware, Inc. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/sockjs/sockjs-client -Spock Framework 1.2 -Attribution Statements -http://spockframework.org/ - -This product includes software developed by -The Apache Software Foundation (http://www.apache.org/). - -It includes the following other software: - -gentyref (http://code.google.com/p/gentyref/) - -For licenses see the LICENSE file. - -If any software distributed with Spock does not have an Apache 2 License, its license is explicitly listed in the -LICENSE file. - -Copyright Statements -Copyright 2010 the original author or authors. - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/spockframework/spock -Spring Boot 1.5.6.RELEASE -Attribution Statements -https://projects.spring.io/spring-boot/ - -Copyright Statements -Copyright 2012-2018 the original author or authors. - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/spring-projects/spring-boot -Spring Framework 5.0.4.RELEASE -Attribution Statements -https://projects.spring.io/spring-framework/ - -Copyright Statements -Copyright (c) 2002-2013 Pivotal, Inc. - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/spring-projects/spring-framework -Spring Security 5.1.4 -Attribution Statements -https://spring.io/projects/spring-security - -This product includes software developed by Spring Security Project (https://www.springframework.org/security). - -Copyright Statements -Copyright 2002-2018 the original author or authors. - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/spring-projects/spring-security -STOMP.js 2.3.3 -Attribution Statements -http://jmesnil.net/stomp-websocket/doc/ - -Copyright Statements -Copyright (C) 2014, Jeff Mesnil - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/jmesnil/stomp-websocket -Sunlight 1.22.0 -Attribution Statements -http://sunlightjs.com/ - -Copyright Statements -by Tommy Montgomery - -License Text (https://spdx.org/licenses/WTFPL.html) -Made available under the Do What The F*ck You Want To Public License. See Appendix for full text. - -Source materials are available for download at: https://github.com/tmont/sunlight -Swagger Codegen™ -Attribution Statements -https://github.com/swagger-api/swagger-codegen - -Copyright Statements -Copyright 2016 SmartBear Software - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/swagger-api/swagger-codegen -Swagger Express Middleware 2.0.1 -Attribution Statements -https://apidevtools.org/swagger-express-middleware/ - -Copyright Statements -Copyright (c) 2015 James Messinger - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/APIDevTools/swagger-express-middleware -Swagger UI Express 4.0.2 -Attribution Statements -https://github.com/scottie1984/swagger-ui-express - -Copyright Statements -Copyright (c) 2018 Scott IT London - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/scottie1984/swagger-ui-express -swagger-tools 0.10.4 -Attribution Statements -https://github.com/apigee-127/swagger-tools - -swagger-tools may include the following software under license: -async 2.5.0 (MIT) - Copyright (c) 2010-2018 Caolan McMahon -body-parser 1.18.2 (MIT) - Copyright (c) 2014 Jonathan Ong ; Copyright (c) 2014-2015 Douglas Christopher Wilson -commander 2.11.0 (MIT) - Copyright (c) 2011 TJ Holowaychuk -debug 3.1.0 (MIT) - Copyright (c) 2014 TJ Holowaychuk -js-yaml 3.3.1 (MIT) - Copyright (C) 2011-2015 by Vitaly Puzrin -json-refs 3.0.2 (MIT) - Copyright (c) 2014 Jeremy Whitlock -lodash 4.17.4 (MIT) - Copyright JS Foundation and other contributors -multer 1.1.0 (MIT) - Copyright (c) 2014 Hage Yaapa <[http://www.hacksparrow.com](http://www.hacksparrow.com)> -parseurl 1.3.0 (MIT) - Copyright (c) 2014 Jonathan Ong ; Copyright (c) 2014-2017 Douglas Christopher Wilson -path-to-regexp 2.0.0 (MIT) - Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) -qs 6.0.3 (MIT) - Copyright (c) 2014, Nathan LaFreniere and other contributors All rights reserved. -serve-static 1.10.0 (MIT) - Copyright (c) 2010 Sencha Inc.; Copyright (c) 2011 LearnBoost; Copyright (c) 2011 TJ Holowaychuk; Copyright (c) 2014-2016 Douglas Christopher Wilson -spark-md5 3.0.0 (MIT) - Copyright (c) 2015 André Cruz -superagent 3.5.2 (MIT) - Copyright (c) 2014-2016 TJ Holowaychuk -swagger-converter 0.1.7 (MIT) - Copyright (c) 2014 Apigee Corporation -traverse 0.6.6 (MIT) - Copyright 2010 James Halliday (mail@substack.net) -z-schema 3.15.4 (MIT) - Copyright (c) 2014 Martin Zagora and other contributors https://github.com/zaggino/z-schema/graphs/contributors - -Copyright Statements -Copyright (c) 2014 Apigee Corporation - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/apigee-127/swagger-tools -through2 3.0.1 -Attribution Statements -https://github.com/rvagg/through2 - -Copyright Statements -Copyright (c) 2016 Rod Vagg (the "Original Author") and additional contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/rvagg/through2 -tmp 0.0.33 -Attribution Statements -https://github.com/raszi/node-tmp - -node-tmp may include the following software under license: -rimraf 2.6.3 (ISC) - Copyright (c) Isaac Z. Schlueter and Contributors - -Copyright Statements -Copyright (c) 2014 KARASZI István - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/raszi/node-tmp -trace-ui 3.0.0 -Attribution Statements -https://github.com/ancestorcloud/trace-ui - -Copyright Statements -Copyright (c) 2017 ancestorcloud - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/ancestorcloud/trace-ui -ts-node 4.1.0 -Attribution Statements -https://github.com/TypeStrong/ts-node - -ts-node may include the following software under license: -arg 4.1.0 (MIT) - Copyright (c) 2017-2019 Zeit, Inc. -diff 4.0.1 (BSD-3-clause) - Copyright (c) 2009-2015, Kevin Decker -make-error 1.1.1 (ISC) - Copyright 2014 Julien Fontanet -source-map-support 0.5.6 (MIT) - Copyright (c) 2014 Evan Wallace -yn 3.0.0 (MIT) - Copyright (c) Sindre Sorhus (sindresorhus.com) - -Copyright Statements -Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/TypeStrong/ts-node -tslib 1.9.0 -Attribution Statements -https://github.com/Microsoft/tslib - -Copyright Statements -Copyright (C) 2019, Microsoft Corp. - -License Text (https://spdx.org/licenses/0BSD.html) -Made available under the BSD Zero Clause License. See Appendix for full text. - -Source materials are available for download at: https://github.com/Microsoft/tslib -TSLint 5.12.1 -Attribution Statements -https://palantir.github.io/tslint/ - -TSLint may include the following software under license: -@babel/code-frame 7.0.0 (MIT) - Sebastian McKenzie https://babeljs.io/ -builtin-modules 1.1.1 (MIT) - Copyright (c) Sindre Sorhus (sindresorhus.com) -chalk 2.3.0 (MIT) - Copyright (c) Sindre Sorhus (sindresorhus.com) -commander 2.12.1 (MIT) - Copyright (c) 2011 TJ Holowaychuk -diff 4.0.1 (BSD-3-clause) - Copyright (c) 2009-2015, Kevin Decker -glob 7.1.1 (ISC) - Copyright (c) Isaac Z. Schlueter and Contributors -js-yaml 3.13.1 (MIT) - Copyright (C) 2011-2015 by Vitaly Puzrin -minimatch 3.0.4 (MIT) - Copyright (c) Isaac Z. Schlueter and Contributors -mkdirp 0.5.1 (MIT) - Copyright 2010 James Halliday (mail@substack.net) -resolve 1.3.2 (MIT) - Copyright (c) 2012 James Halliday -semver 5.3.0 (ISC) - Copyright (c) Isaac Z. Schlueter and Contributors -tslib 1.10.0 (Apache-2.0) - Copyright (c) Microsoft Corporation. All rights reserved. -tsutils 2.29.0 (MIT) - Copyright (c) 2017 Klaus Meinhardt - -Copyright Statements -Copyright 2018 Palantir Technologies, Inc. - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/palantir/tslint -TypeScript 3.7.2 -Attribution Statements -https://www.typescriptlang.org/ - -The TypeScript software incorporates third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. - ---------------------------------------------- -Third Party Code Components --------------------------------------------- - -------------------- DefinitelyTyped -------------------- -This file is based on or incorporates material from the projects listed below (collectively "Third Party Code"). Microsoft is not the original author of the Third Party Code. The original copyright notice and the license, under which Microsoft received such Third Party Code, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft, not the third party, licenses the Third Party Code to you under the terms set forth in the EULA for the Microsoft Product. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. -DefinitelyTyped -This project is licensed under the MIT license. Copyrights are respective of each contributor listed at the beginning of each definition file. Provided for Informational Purposes Only - -MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------------------------------------- - -------------------- Unicode -------------------- -UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE - -Unicode Data Files include all data files under the directories -http://www.unicode.org/Public/, http://www.unicode.org/reports/, -http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and -http://www.unicode.org/utility/trac/browser/. - -Unicode Data Files do not include PDF online code charts under the -directory http://www.unicode.org/Public/. - -Software includes any source code published in the Unicode Standard -or under the directories -http://www.unicode.org/Public/, http://www.unicode.org/reports/, -http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and -http://www.unicode.org/utility/trac/browser/. - -NOTICE TO USER: Carefully read the following legal agreement. -BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S -DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), -YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE -TERMS AND CONDITIONS OF THIS AGREEMENT. -IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE -THE DATA FILES OR SOFTWARE. - -COPYRIGHT AND PERMISSION NOTICE - -Copyright (c) 1991-2017 Unicode, Inc. All rights reserved. -Distributed under the Terms of Use in http://www.unicode.org/copyright.html. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Unicode data files and any associated documentation -(the "Data Files") or Unicode software and any associated documentation -(the "Software") to deal in the Data Files or Software -without restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, and/or sell copies of -the Data Files or Software, and to permit persons to whom the Data Files -or Software are furnished to do so, provided that either -(a) this copyright and permission notice appear with all copies -of the Data Files or Software, or -(b) this copyright and permission notice appear in associated -Documentation. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT OF THIRD PARTY RIGHTS. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS -NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL -DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THE DATA FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder -shall not be used in advertising or otherwise to promote the sale, -use or other dealings in these Data Files or Software without prior -written authorization of the copyright holder. -------------------------------------------------------------------------------------- - --------------------Document Object Model----------------------------- -DOM - -W3C License -This work is being provided by the copyright holders under the following license. -By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions. -Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following -on ALL copies of the work or portions thereof, including modifications: -* The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. -* Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included. -* Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived -from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)." -Disclaimers -THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR -FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT. -The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. -Title to copyright in this work will at all times remain with copyright holders. - ---------- - -DOM -Copyright © 2018 WHATWG (Apple, Google, Mozilla, Microsoft). This work is licensed under a Creative Commons Attribution 4.0 International License: Attribution 4.0 International -======================================================================= -Creative Commons Corporation ("Creative Commons") is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an "as-is" basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. Using Creative Commons Public Licenses Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC- licensed material, or material used under an exception or limitation to copyright. More considerations for licensors: - -wiki.creativecommons.org/Considerations_for_licensors Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor's permission is not necessary for any reason--for example, because of any applicable exception or limitation to copyright--then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More_considerations for the public: wiki.creativecommons.org/Considerations_for_licensees ======================================================================= -Creative Commons Attribution 4.0 International Public License By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. Section 1 -- Definitions. a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. Section 2 -- Scope. a. License grant. 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: a. reproduce and Share the Licensed Material, in whole or in part; and b. produce, reproduce, and Share Adapted Material. 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 3. Term. The term of this Public License is specified in Section 6(a). 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a) (4) never produces Adapted Material. 5. Downstream recipients. a. Offer from the Licensor -- Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. b. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). b. Other rights. 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 2. Patent and trademark rights are not licensed under this Public License. 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. Section 3 -- License Conditions. Your exercise of the Licensed Rights is expressly made subject to the following conditions. a. Attribution. 1. If You Share the Licensed Material (including in modified form), You must: a. retain the following if it is supplied by the Licensor with the Licensed Material: i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); ii. a copyright notice; iii. a notice that refers to this Public License; iv. a notice that refers to the disclaimer of warranties; v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; b. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and c. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. Section 4 -- Sui Generis Database Rights. Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. Section 5 -- Disclaimer of Warranties and Limitation of Liability. a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. Section 6 -- Term and Termination. a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 2. upon express reinstatement by the Licensor. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. Section 7 -- Other Terms and Conditions. a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. Section 8 -- Interpretation. a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. ======================================================================= Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the "Licensor." Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark "Creative Commons" or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. Creative Commons may be contacted at creativecommons.org. - --------------------------------------------------------------------------------- - -----------------------Web Background Synchronization------------------------------ - -Web Background Synchronization Specification -Portions of spec © by W3C - -W3C Community Final Specification Agreement -To secure commitments from participants for the full text of a Community or Business Group Report, the group may call for voluntary commitments to the following terms; a "summary" is -available. See also the related "W3C Community Contributor License Agreement". -1. The Purpose of this Agreement. -This Agreement sets forth the terms under which I make certain copyright and patent rights available to you for your implementation of the Specification. -Any other capitalized terms not specifically defined herein have the same meaning as those terms have in the "W3C Patent Policy", and if not defined there, in the "W3C Process Document". -2. Copyrights. -2.1. Copyright Grant. I grant to you a perpetual (for the duration of the applicable copyright), worldwide, non-exclusive, no-charge, royalty-free, copyright license, without any obligation for accounting to me, to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, distribute, and implement the Specification to the full extent of my copyright interest in the Specification. -2.2. Attribution. As a condition of the copyright grant, you must include an attribution to the Specification in any derivative work you make based on the Specification. That attribution must include, at minimum, the Specification name and version number. -3. Patents. -3.1. Patent Licensing Commitment. I agree to license my Essential Claims under the W3C Community RF Licensing Requirements. This requirement includes Essential Claims that I own and any that I have the right to license without obligation of payment or other consideration to an unrelated third party. W3C Community RF Licensing Requirements obligations made concerning the Specification and described in this policy are binding on me for the life of the patents in question and encumber the patents containing Essential Claims, regardless of changes in participation status or W3C Membership. I also agree to license my Essential Claims under the W3C Community RF Licensing Requirements in derivative works of the Specification so long as all normative portions of the Specification are maintained and that this licensing commitment does not extend to any portion of the derivative work that was not included in the Specification. -3.2. Optional, Additional Patent Grant. In addition to the provisions of Section 3.1, I may also, at my option, make certain intellectual property rights infringed by implementations of the Specification, including Essential Claims, available by providing those terms via the W3C Web site. -4. No Other Rights. Except as specifically set forth in this Agreement, no other express or implied patent, trademark, copyright, or other property rights are granted under this Agreement, including by implication, waiver, or estoppel. -5. Antitrust Compliance. I acknowledge that I may compete with other participants, that I am under no obligation to implement the Specification, that each participant is free to develop competing technologies and standards, and that each party is free to license its patent rights to third parties, including for the purpose of enabling competing technologies and standards. -6. Non-Circumvention. I agree that I will not intentionally take or willfully assist any third party to take any action for the purpose of circumventing my obligations under this Agreement. -7. Transition to W3C Recommendation Track. The Specification developed by the Project may transition to the W3C Recommendation Track. The W3C Team is responsible for notifying me that a Corresponding Working Group has been chartered. I have no obligation to join the Corresponding Working Group. If the Specification developed by the Project transitions to the W3C Recommendation Track, the following terms apply: -7.1. If I join the Corresponding Working Group. If I join the Corresponding Working Group, I will be subject to all W3C rules, obligations, licensing commitments, and policies that govern that Corresponding Working Group. -7.2. If I Do Not Join the Corresponding Working Group. -7.2.1. Licensing Obligations to Resulting Specification. If I do not join the Corresponding Working Group, I agree to offer patent licenses according to the W3C Royalty-Free licensing requirements described in Section 5 of the W3C Patent Policy for the portions of the Specification included in the resulting Recommendation. This licensing commitment does not extend to any portion of an implementation of the Recommendation that was not included in the Specification. This licensing commitment may not be revoked but may be modified through the exclusion process defined in Section 4 of the W3C Patent Policy. I am not required to join the Corresponding Working Group to exclude patents from the W3C Royalty-Free licensing commitment, but must otherwise follow the normal exclusion procedures defined by the W3C Patent Policy. The W3C Team will notify me of any Call for Exclusion in the Corresponding Working Group as set forth in Section 4.5 of the W3C Patent Policy. -7.2.2. No Disclosure Obligation. If I do not join the Corresponding Working Group, I have no patent disclosure obligations outside of those set forth in Section 6 of the W3C Patent Policy. -8. Conflict of Interest. I will disclose significant relationships when those relationships might reasonably be perceived as creating a conflict of interest with my role. I will notify W3C of any change in my affiliation using W3C-provided mechanisms. -9. Representations, Warranties and Disclaimers. I represent and warrant that I am legally entitled to grant the rights and promises set forth in this Agreement. IN ALL OTHER RESPECTS THE SPECIFICATION IS PROVIDED ?AS IS.? The entire risk as to implementing or otherwise using the Specification is assumed by the implementer and user. Except as stated herein, I expressly disclaim any warranties (express, implied, or otherwise), including implied warranties of merchantability, non-infringement, fitness for a particular purpose, or title, related to the Specification. IN NO EVENT WILL ANY PARTY BE LIABLE TO ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF ACTION OF ANY KIND WITH RESPECT TO THIS AGREEMENT, WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR NOT THE OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. All of my obligations under Section 3 regarding the transfer, successors in interest, or assignment of Granted Claims will be satisfied if I notify the transferee or assignee of any patent that I know contains Granted Claims of the obligations under Section 3. Nothing in this Agreement requires me to undertake a patent search. -10. Definitions. -10.1. Agreement. ?Agreement? means this W3C Community Final Specification Agreement. -10.2. Corresponding Working Group. ?Corresponding Working Group? is a W3C Working Group that is chartered to develop a Recommendation, as defined in the W3C Process Document, that takes the Specification as an input. -10.3. Essential Claims. ?Essential Claims? shall mean all claims in any patent or patent application in any jurisdiction in the world that would necessarily be infringed by implementation of the Specification. A claim is necessarily infringed hereunder only when it is not possible to avoid infringing it because there is no non-infringing alternative for implementing the normative portions of the Specification. Existence of a non-infringing alternative shall be judged based on the state of the art at the time of the publication of the Specification. The following are expressly excluded from and shall not be deemed to constitute Essential Claims: -10.3.1. any claims other than as set forth above even if contained in the same patent as Essential Claims; and -10.3.2. claims which would be infringed only by: -portions of an implementation that are not specified in the normative portions of the Specification, or -enabling technologies that may be necessary to make or use any product or portion thereof that complies with the Specification and are not themselves expressly set forth in the Specification (e.g., semiconductor manufacturing technology, compiler technology, object-oriented technology, basic operating system technology, and the like); or -the implementation of technology developed elsewhere and merely incorporated by reference in the body of the Specification. -10.3.3. design patents and design registrations. -For purposes of this definition, the normative portions of the Specification shall be deemed to include only architectural and interoperability requirements. Optional features in the RFC 2119 sense are considered normative unless they are specifically identified as informative. Implementation examples or any other material that merely illustrate the requirements of the Specification are informative, rather than normative. -10.4. I, Me, or My. ?I,? ?me,? or ?my? refers to the signatory. -10.5 Project. ?Project? means the W3C Community Group or Business Group for which I executed this Agreement. -10.6. Specification. ?Specification? means the Specification identified by the Project as the target of this agreement in a call for Final Specification Commitments. W3C shall provide the authoritative mechanisms for the identification of this Specification. -10.7. W3C Community RF Licensing Requirements. ?W3C Community RF Licensing Requirements? license shall mean a non-assignable, non-sublicensable license to make, have made, use, sell, have sold, offer to sell, import, and distribute and dispose of implementations of the Specification that: -10.7.1. shall be available to all, worldwide, whether or not they are W3C Members; -10.7.2. shall extend to all Essential Claims owned or controlled by me; -10.7.3. may be limited to implementations of the Specification, and to what is required by the Specification; -10.7.4. may be conditioned on a grant of a reciprocal RF license (as defined in this policy) to all Essential Claims owned or controlled by the licensee. A reciprocal license may be required to be available to all, and a reciprocal license may itself be conditioned on a further reciprocal license from all. -10.7.5. may not be conditioned on payment of royalties, fees or other consideration; -10.7.6. may be suspended with respect to any licensee when licensor issued by licensee for infringement of claims essential to implement the Specification or any W3C Recommendation; -10.7.7. may not impose any further conditions or restrictions on the use of any technology, intellectual property rights, or other restrictions on behavior of the licensee, but may include reasonable, customary terms relating to operation or maintenance of the license relationship such as the following: choice of law and dispute resolution; -10.7.8. shall not be considered accepted by an implementer who manifests an intent not to accept the terms of the W3C Community RF Licensing Requirements license as offered by the licensor. -10.7.9. The RF license conforming to the requirements in this policy shall be made available by the licensor as long as the Specification is in effect. The term of such license shall be for the life of the patents in question. -I am encouraged to provide a contact from which licensing information can be obtained and other relevant licensing information. Any such information will be made publicly available. -10.8. You or Your. ?You,? ?you,? or ?your? means any person or entity who exercises copyright or patent rights granted under this Agreement, and any person that person or entity controls. - -------------------------------------------------------------------------------------- - -------------------- WebGL ----------------------------- -Copyright (c) 2018 The Khronos Group Inc. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and/or associated documentation files (the -"Materials"), to deal in the Materials without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Materials, and to -permit persons to whom the Materials are furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Materials. - -THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. - -Copyright Statements -Copyright (C) 2019, Microsoft Corp. - -License Text (http://spdx.org/licenses/Apache-2.0.html) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://github.com/microsoft/TypeScript -url-loader 1.1.2 -Attribution Statements -https://github.com/webpack-contrib/url-loader - -Copyright Statements -Copyright JS Foundation and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/webpack-contrib/url-loader -Vinyl 2.2.0 -Attribution Statements -https://github.com/gulpjs/vinyl - -Copyright Statements -Copyright (c) 2013 Blaine Bublitz , Eric Schoffstall and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/gulpjs/vinyl -webpack 4.30.0 -Attribution Statements -https://webpack.js.org/ - -Copyright Statements -Copyright JS Foundation and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/webpack/webpack -webpack-dev-middleware 3.5.1 -Attribution Statements -https://github.com/webpack/webpack-dev-middleware - -Copyright Statements -Copyright JS Foundation and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/webpack/webpack-dev-middleware -webpack-dev-server 3.1.14 -Attribution Statements -https://github.com/webpack/webpack-dev-server - -Copyright Statements -Copyright JS Foundation and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/webpack/webpack-dev-server -webpack-merge 4.2.1 -Attribution Statements -https://www.npmjs.com/package/webpack-merge - -Copyright Statements -Copyright (c) 2015 Juho Vepsalainen - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/survivejs/webpack-merge -webpack-sources 1.3.0 -Attribution Statements -https://github.com/webpack/webpack-sources - -Copyright Statements -Copyright (c) 2017 JS Foundation and other contributors - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/webpack/webpack-sources -Wikipedia content -Attribution Statements -https://www.wikipedia.org/ - -Copyright Statements -The Wikimedia Foundation, Inc. - -License Text (https://spdx.org/licenses/CC-BY-SA-3.0.html) -Made available under the Creative Commons Attribution Share Alike 3.0 Unported. See Appendix for full text. - -Source materials are available for download at: https://www.wikipedia.org/ -winston 3.2.1 -Attribution Statements -https://github.com/winstonjs/winston - -Copyright Statements -Copyright (c) 2010 Charlie Robbins - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/winstonjs/winston -www-authenticate 0.6.2 -Attribution Statements -https://github.com/randymized/www-authenticate - -Copyright Statements -Copyright (c) 2013 Randy McLaughlin - -License Text (https://spdx.org/licenses/MIT.html) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/randymized/www-authenticate -Xerces2 Java Parser 2.12.0 -Attribution Statements -https://xerces.apache.org/xerces2-j/ - -Portions of this software were originally based on the following: - - software copyright (c) 1999, IBM Corporation., http://www.ibm.com. - - software copyright (c) 1999, Sun Microsystems., http://www.sun.com. - - voluntary contributions made by Paul Eng on behalf of the Apache Software Foundation that were originally developed at iClick, Inc., software copyright (c) 1999. - -Copyright Statements -Copyright (C) 2018, The Apache Software Foundation - -License Text (http://www.apache.org/licenses/LICENSE-2.0.txt) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: http://svn.apache.org/viewvc/xerces/java/trunk/ -Xml Compatibility Extensions For Jackson (jackson-xc) 1.9.13 -Attribution Statements -http://jackson.codehaus.org - -Copyright Statements -Copyright © FasterXML. - -License Text (http://spdx.org/licenses/Apache-2.0) -Made available under the Apache License 2.0. See Appendix for full text. - -Source materials are available for download at: https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-xc/1.9.13 -XMLUnit 1.6 -Attribution Statements -http://www.xmlunit.org/ - -Copyright Statements -Copyright (c) 2001-2015, Jeff Martin, Tim Bacon -All rights reserved. - -License Text (http://spdx.org/licenses/BSD-3-Clause) -Made available under the BSD 3-Clause "New" or "Revised" License. See Appendix for full text. - -Source materials are available for download at: https://github.com/xmlunit/xmlunit/tree/master/xmlunit-legacy -XStream 1.4.12 -Attribution Statements -http://x-stream.github.io - -Copyright Statements -Copyright (c) 2003-2006, Joe Walnes -Copyright (c) 2006-2019, XStream Committers -All rights reserved. - -License Text (https://spdx.org/licenses/BSD-3-Clause.html) -Made available under the BSD 3-Clause "New" or "Revised" License. See Appendix for full text. - -Source materials are available for download at: http://x-stream.github.io/download.html -yakaa 1.0.1 -Attribution Statements -https://github.com/newrelic/yakaa - -Copyright Statements -Copyright Joyent, Inc. and other Node contributors. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/newrelic/yakaa -Zone.js 0.8.26 -Attribution Statements -https://github.com/angular/zone.js - -author.name: Brian Ford - -Copyright Statements -Copyright (c) 2016 Google, Inc. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/angular/zone.js -Zone.js 0.8.29 -Attribution Statements -https://github.com/angular/zone.js - -author.name: Brian Ford - -Copyright Statements -Copyright (c) 2016 Google, Inc. - -License Text (http://spdx.org/licenses/MIT) -Made available under the MIT License. See Appendix for full text. - -Source materials are available for download at: https://github.com/angular/zone.js - -  -Appendix - -License Text - -  -Apache License 2.0 -https://spdx.org/licenses/Apache-2.0.html - -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - -(b) You must cause any modified files to carry prominent notices stating that You changed the files; and - -(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - -You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -  -BSD 2-Clause "Simplified" License -https://spdx.org/licenses/BSD-2-Clause.html - -Copyright (c) . All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -  -BSD 3-Clause "New" or "Revised" License -https://spdx.org/licenses/BSD-3-Clause.html - -Copyright (c) . All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -  -Common Development and Distribution License 1.1 -https://spdx.org/licenses/CDDL-1.1.html - -COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) -Version 1.1 - -1. Definitions. - -1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications. - -1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. - -1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. - -1.4. “Executable” means the Covered Software in any form other than Source Code. - -1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License. - -1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. - -1.7. “License” means this document. - -1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. - -1.9. “Modifications” means the Source Code and Executable form of any of the following: -A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; -B. Any new file that contains any part of the Original Software or previous Modification; or -C. Any new file that is contributed or otherwise made available under the terms of this License. - -1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License. - -1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. - -1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. - -1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. - -2. License Grants. - -2.1. The Initial Developer Grant. -Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: -(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and -(b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). -(c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. -(d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. - -2.2. Contributor Grant. -Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: -(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and -(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). -(c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. -(d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. - -3. Distribution Obligations. - -3.1. Availability of Source Code. -Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. - -3.2. Modifications. -The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. - -3.3. Required Notices. -You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. - -3.4. Application of Additional Terms. -You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. - -3.5. Distribution of Executable Versions. -You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. - -3.6. Larger Works. -You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. - -4. Versions of the License. - -4.1. New Versions. -Oracle is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. - -4.2. Effect of New Versions. -You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. - -4.3. Modified Versions. -When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. - -5. DISCLAIMER OF WARRANTY. -COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -6. TERMINATION. - -6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. - -6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. - -6.3. If You assert a patent infringement claim against Participant alleging that the Participant Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. - -6.4. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. - -7. LIMITATION OF LIABILITY. -UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - -8. U.S. GOVERNMENT END USERS. -The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. - -9. MISCELLANEOUS. -This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. - -10. RESPONSIBILITY FOR CLAIMS. -As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. - -NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) -The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. - -  -Creative Commons Attribution Share Alike 3.0 Unported -https://spdx.org/licenses/CC-BY-SA-3.0.html - -Creative Commons Attribution-ShareAlike 3.0 Unported - -CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. - -1. Definitions - -a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. - -b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined below) for the purposes of this License. - -c. "Creative Commons Compatible License" means a license that is listed at http://creativecommons.org/compatiblelicenses that has been approved by Creative Commons as being essentially equivalent to this License, including, at a minimum, because that license: (i) contains terms that have the same purpose, meaning and effect as the License Elements of this License; and, (ii) explicitly permits the relicensing of adaptations of works made available under that license under this License or a Creative Commons jurisdiction license with the same License Elements as this License. - -d. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. - -e. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike. - -f. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. - -g. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. - -h. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. - -i. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. - -j. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. - -k. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. - -2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. - -3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: - -a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; - -b. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; - -c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, - -d. to Distribute and Publicly Perform Adaptations. - -e. For the avoidance of doubt: -i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; -ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, -iii. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. -The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. - -4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: - -a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(c), as requested. - -b. You may Distribute or Publicly Perform an Adaptation only under the terms of: (i) this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible License. If you license the Adaptation under one of the licenses mentioned in (iv), you must comply with the terms of that license. If you license the Adaptation under the terms of any of the licenses mentioned in (i), (ii) or (iii) (the "Applicable License"), you must comply with the terms of the Applicable License generally and the following provisions: (I) You must include a copy of, or the URI for, the Applicable License with every copy of each Adaptation You Distribute or Publicly Perform; (II) You may not offer or impose any terms on the Adaptation that restrict the terms of the Applicable License or the ability of the recipient of the Adaptation to exercise the rights granted to that recipient under the terms of the Applicable License; (III) You must keep intact all notices that refer to the Applicable License and to the disclaimer of warranties with every copy of the Work as included in the Adaptation You Distribute or Publicly Perform; (IV) when You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recipient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License. This Section 4(b) applies to the Adaptation as incorporated in a Collection, but this does not require the Collection apart from the Adaptation itself to be made subject to the terms of the Applicable License. -c. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv), consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. -d. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. - -5. Representations, Warranties and Disclaimer -UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. - -6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. Termination - -a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. - -b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. - -8. Miscellaneous - -a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the -recipient a license to the Work on the same terms and conditions as the license granted to You under this License. - -b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. - -c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. - -d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. - -e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. - -f. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. -Creative Commons Notice - -Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. - -Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of the License. - -Creative Commons may be contacted at http://creativecommons.org/. - -  -Do What The F*ck You Want To Public License -https://spdx.org/licenses/WTFPL.html - -DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE -Version 2, December 2004 - -Copyright (C) 2004 Sam Hocevar - -Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. - -DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. You just DO WHAT THE FUCK YOU WANT TO. - -  -Eclipse Public License 1.0 -https://spdx.org/licenses/EPL-1.0.html - -Eclipse Public License - v 1.0 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: -a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and -b) in the case of each subsequent Contributor: -i) changes to the Program, and -ii) additions to the Program; -where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. - -"Program" means the Contributions distributed in accordance with this Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. - -2. GRANT OF RIGHTS - -a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. - -b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. - -c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. - -d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. - -3. REQUIREMENTS -A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: - -a) it complies with the terms and conditions of this Agreement; and - -b) its license agreement: -i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; -ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; -iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and -iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. - -When the Program is made available in source code form: - -a) it must be made available under this Agreement; and - -b) a copy of this Agreement must be included with each copy of the Program. -Contributors may not remove or alter any copyright notices contained within the Program. - -Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION -Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. - -5. NO WARRANTY -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL -If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. - -  -Eclipse Public License 2.0 -https://spdx.org/licenses/EPL-2.0.html - -Eclipse Public License - v 2.0 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS -"Contribution" means: - -a) in the case of the initial Contributor, the initial content Distributed under this Agreement, and -b) in the case of each subsequent Contributor: -i) changes to the Program, and -ii) additions to the Program; -where such changes and/or additions to the Program originate from and are Distributed by that particular Contributor. A Contribution "originates" from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include changes or additions to the Program that are not Modified Works. - -"Contributor" means any person or entity that Distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. - -"Program" means the Contributions Distributed in accordance with this Agreement. - -"Recipient" means anyone who receives the Program under this Agreement or any Secondary License (as applicable), including Contributors. - -"Derivative Works" shall mean any work, whether in Source Code or other form, that is based on (or derived from) the Program and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. - -"Modified Works" shall mean any work in Source Code or other form that results from an addition to, deletion from, or modification of the contents of the Program, including, for purposes of clarity any new file in Source Code form that contains any contents of the Program. Modified Works shall not include works that contain only declarations, interfaces, types, classes, structures, or files of the Program solely in each case in order to link to, bind by name, or subclass the Program or Modified Works thereof. - -"Distribute" means the acts of a) distributing or b) making available in any manner that enables the transfer of a copy. - -"Source Code" means the form of a Program preferred for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Secondary License" means either the GNU General Public License, Version 2.0, or any later versions of that license, including any exceptions or additional permissions as identified by the initial Contributor. - -2. GRANT OF RIGHTS -a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, Distribute and sublicense the Contribution of such Contributor, if any, and such Derivative Works. -b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in Source Code or other form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. -c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to Distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. -d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. -e) Notwithstanding the terms of any Secondary License, no Contributor makes additional grants to any Recipient (other than those set forth in this Agreement) as a result of such Recipient's receipt of the Program under the terms of a Secondary License (if permitted under the terms of Section 3). -3. REQUIREMENTS -3.1 If a Contributor Distributes the Program in any form, then: -a) the Program must also be made available as Source Code, in accordance with section 3.2, and the Contributor must accompany the Program with a statement that the Source Code for the Program is available under this Agreement, and informs Recipients how to obtain it in a reasonable manner on or through a medium customarily used for software exchange; and -b) the Contributor may Distribute the Program under a license different than this Agreement, provided that such license: -i) effectively disclaims on behalf of all other Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; -ii) effectively excludes on behalf of all other Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; -iii) does not attempt to limit or alter the recipients' rights in the Source Code under section 3.2; and -iv) requires any subsequent distribution of the Program by any party to be under a license that satisfies the requirements of this section 3. -3.2 When the Program is Distributed as Source Code: -a) it must be made available under this Agreement, or if the Program (i) is combined with other material in a separate file or files made available under a Secondary License, and (ii) the initial Contributor attached to the Source Code the notice described in Exhibit A of this Agreement, then the Program may be made available under the terms of such Secondary Licenses, and -b) a copy of this Agreement must be included with each copy of the Program. -3.3 Contributors may not remove or alter any copyright, patent, trademark, attribution notices, disclaimers of warranty, or limitations of liability ("notices") contained within the Program from any copy of the Program which they Distribute, provided that Contributors may add their own appropriate notices. -4. COMMERCIAL DISTRIBUTION -Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. - -5. NO WARRANTY -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL -If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be Distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to Distribute the Program (including its Contributions) under the new version. - -Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. Nothing in this Agreement is intended to be enforceable by any entity that is not a Contributor or Recipient. No third-party beneficiary rights are created under this Agreement. - -Exhibit A - Form of Secondary Licenses Notice -"This Source Code may also be made available under the following Secondary Licenses when the conditions for such availability set forth in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), version(s), and exceptions or additional permissions here}." - -Simply including a copy of this Agreement, including this Exhibit A is not sufficient to license the Source Code under Secondary Licenses. - -If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. - -You may add additional accurate notices of copyright ownership.  -ISC License -https://spdx.org/licenses/ISC.html - -ISC License - -Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") -Copyright (c) 1995-2003 by Internet Software Consortium - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -  -JSON License -https://spdx.org/licenses/JSON.html - -JSON License - -Copyright (c) 2002 JSON.org - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -The Software shall be used for Good, not Evil. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -  -MIT License -http://spdx.org/licenses/MIT - -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -  -Mozilla Public License 2.0 -https://spdx.org/licenses/MPL-2.0.html - -Mozilla Public License Version 2.0 - -1. Definitions - -1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. - -1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" means Covered Software of a particular Contributor. - -1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. - -1.5. "Incompatible With Secondary Licenses" means -(a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or -(b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. - -1.6. "Executable Form" means any form of the work other than Source Code Form. - -1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. - -1.8. "License" means this document. - -1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. - -1.10. "Modifications" means any of the following: -(a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or -(b) any new file in Source Code Form that contains any Covered Software. - -1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. - -1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. - -1.13. "Source Code Form" means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. - -2. License Grants and Conditions - -2.1. Grants -Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: -(a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and -(b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. - -2.2. Effective Date -The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. - -2.3. Limitations on Grant Scope -The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: -(a) for any code that a Contributor has removed from Covered Software; or -(b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or -(c) under Patent Claims infringed by Covered Software in the absence of its Contributions. -This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). - -2.4. Subsequent Licenses -No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). - -2.5. Representation -Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use -This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. - -2.7. Conditions -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. - -3. Responsibilities - -3.1. Distribution of Source Form -All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. - -3.2. Distribution of Executable Form -If You distribute Covered Software in Executable Form then: -(a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and -(b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work -You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). - -3.4. Notices -You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms -You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. - -4. Inability to Comply Due to Statute or Regulation -If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. - -6. Disclaimer of Warranty -Covered Software is provided under this License on an "as is" basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer. - -7. Limitation of Liability -Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. - -8. Litigation -Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. - -9. Miscellaneous -This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. - -10. Versions of the License - -10.1. New Versions -Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. - -10.2. Effect of New Versions -You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. - -10.3. Modified Versions -If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses -If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice - -This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice - -This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. - -  -Dual OpenSSL and SSLeay License -https://www.openssl.org/source/license-openssl-ssleay.txt - - - LICENSE ISSUES - ============== - - The OpenSSL toolkit stays under a double license, i.e. both the conditions of - the OpenSSL License and the original SSLeay license apply to the toolkit. - See below for the actual license texts. - - OpenSSL License - --------------- - -/* ==================================================================== - * Copyright (c) 1998-2018 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - - Original SSLeay License - ----------------------- - -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -  -SIL Open Font License 1.1 -https://spdx.org/licenses/OFL-1.1.html - -SIL OPEN FONT LICENSE -Version 1.1 - 26 February 2007 - -PREAMBLE - -The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. - -The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. - -DEFINITIONS - -"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the copyright statement(s). - -"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, or substituting — in part or in whole — any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. - -"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS - -Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. - -5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. - -TERMINATION - -This license becomes null and void if any of the above conditions are not met. - -DISCLAIMER - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. - -  -The Unlicense -https://spdx.org/licenses/Unlicense.html - -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. - -In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to - diff --git a/marklogic-data-hub-spark-connector/README.md b/marklogic-data-hub-spark-connector/README.md deleted file mode 100644 index 5105547223..0000000000 --- a/marklogic-data-hub-spark-connector/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# MarkLogic Connector for Apache Spark - -This project contains the software for the MarkLogic connector for Spark. Please see -[the documentation](https://docs.marklogic.com/cloudservices/aws/admin/dhs-tools.html) and -[the tutorial](https://developer.marklogic.com/learn/spark/) for information on using the connector in -an AWS Glue environment. The rest of this README provides instructions for building and testing the connector locally. - -Note that this connector is part of the Data Hub Framework project. This is due to its dependency on a few DHF library -modules. It is possible to remove this dependency by configuring the connector to use your own endpoint modules. -[The connector documentation](https://docs.marklogic.com/cloudservices/aws/admin/dhs-tools.html) provides information -on the connector options for using your own endpoint modules. - -## Building and testing the connector jar - -To build the connector, run: - - ../gradlew shadowJar - -This produces an "uber" jar at build/libs/marklogic-data-hub-spark-connector-(version)-all.jar . This jar can then be -included in a Spark environment. - -An example of such an environment is in the ./spark-test-project directory. Please see the README file in that directory -for instructions on how to test the connector jar within that project. - -## Running the connector tests - -If you are working on enhancements to this project, you'll likely want to run the automated tests for it. To do so, run: - - ../gradlew test - -Note that if you would like to run the tests in an IDE like Intellij, you must first run the Gradle task -"copyConnectorModulesFromCoreProject" so that the connector modules, which live in the ./marklogic-data-hub project, -are available to be loaded by the tests. Running "test" will do this for you automatically. diff --git a/marklogic-data-hub-spark-connector/build.gradle b/marklogic-data-hub-spark-connector/build.gradle deleted file mode 100644 index d23257b6f1..0000000000 --- a/marklogic-data-hub-spark-connector/build.gradle +++ /dev/null @@ -1,97 +0,0 @@ -plugins { - id "java-library" - id 'com.github.johnrengelman.shadow' version '7.1.2' - id "io.snyk.gradle.plugin.snykplugin" version "0.4" -} - -group = 'com.marklogic' - -// See https://github.com/snyk/gradle-plugin for docs -snyk { - severity = 'medium' - api = snykToken - autoDownload = true - autoUpdate = true -} - -configurations { - // Some of the Spark dependencies bring in junit 3, which we don't want on the classpath - all*.exclude group: "junit", module: "junit" -} - -dependencies { - api(project(":marklogic-data-hub-api")) - - // Makes it possible to use lambdas in Java 8 to implement Spark's Function1 and Function2 interfaces - // See https://github.com/scala/scala-java8-compat for more information - api ("org.scala-lang.modules:scala-java8-compat_2.11:0.9.1") { - exclude module: "scala-library" - } - - // We need to compile against the Spark jars, but we don't want to include them in the shadowJar - compileOnly "org.apache.spark:spark-sql_2.11:${sparkVersion}" - compileOnly "org.apache.spark:spark-launcher_2.11:${sparkVersion}" - compileOnly "org.apache.spark:spark-catalyst_2.11:${sparkVersion}" - compileOnly "org.apache.spark:spark-streaming_2.11:${sparkVersion}" - compileOnly "org.apache.spark:spark-core_2.11:${sparkVersion}" - - // Depends on the test plumbing classes in the test project - testImplementation(project(":marklogic-data-hub-test")) - - testImplementation "org.junit.jupiter:junit-jupiter:5.7.2" - - // Need to declare the Spark dependencies here too so they're available for tests - testImplementation "org.apache.spark:spark-sql_2.11:${sparkVersion}" - testImplementation "org.apache.spark:spark-launcher_2.11:${sparkVersion}" - testImplementation "org.apache.spark:spark-catalyst_2.11:${sparkVersion}" - testImplementation "org.apache.spark:spark-streaming_2.11:${sparkVersion}" - testImplementation "org.apache.spark:spark-core_2.11:${sparkVersion}" -} - -tasks.withType(Test) { - systemProperty "mlHost", mlHost - systemProperty "isDhs", isDhs - useJUnitPlatform() -} - -task copyModulesForConnectorFromCoreProject(type: Copy) { - description = "Copy modules that the connector may need to install from the core project to the resources " + - "directory so that they are included when the shadowJar is created" - from "../marklogic-data-hub/src/main/resources/ml-modules/root" - into "src/main/resources" - include "marklogic-data-hub-spark-connector/**" -} - -// Gradle's processResources task provides a chance for including additional files in the jar -// See https://docs.gradle.org/current/userguide/building_java_projects.html#sec:java_source_sets for more information -processResources.dependsOn copyModulesForConnectorFromCoreProject - -shadowJar { - classifier "needs-to-be-fixed" - // Relocate packages of classes that the ML Java Client needs; it can't use the versions provided by Spark - relocate('okio', 'marklogic.okio') - - relocate('com.fasterxml.jackson', 'marklogic.com.fasterxml.jackson') -} - - -//The relocated JsonRowParser class is being replaced with the original version so that it still uses the Spark version -// of Jackson as opposed to the ML version of Jackson. -task fixShadowJar(type: Jar, dependsOn: "shadowJar") { - classifier "all" - from (zipTree(shadowJar.archiveFile)) { - exclude "com/marklogic/hub/spark/sql/sources/v2/reader/JsonRowParser.class" - } - from ("build/classes/java/main/") { - include "com/marklogic/hub/spark/sql/sources/v2/reader/JsonRowParser.class" - } -} -task copyConnectorToSparkTestProject(type: Copy) { - description = "Build and copy the connector shadowJar to a gitignored directory in spark-test-project" - from "build/libs" - into "spark-test-project/lib" - include "*-all.jar" -} -copyConnectorToSparkTestProject.dependsOn fixShadowJar - -build.dependsOn fixShadowJar diff --git a/marklogic-data-hub-spark-connector/gradle.properties b/marklogic-data-hub-spark-connector/gradle.properties deleted file mode 100644 index eb40c697f5..0000000000 --- a/marklogic-data-hub-spark-connector/gradle.properties +++ /dev/null @@ -1,8 +0,0 @@ -version=1.0-SNAPSHOT -junitJupiterVersion=5.4.0 -junitPlatformVersion=1.4.0 -sparkVersion=2.4.5 - -#Properties to be used for testing locally using gradle -mlHost=localhost -isDhs=false diff --git a/marklogic-data-hub-spark-connector/spark-test-project/.gitignore b/marklogic-data-hub-spark-connector/spark-test-project/.gitignore deleted file mode 100644 index 26d0bde84c..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# The connector shadowJar is expected to be in the lib directory, but we don't want that version controlled -lib diff --git a/marklogic-data-hub-spark-connector/spark-test-project/README.md b/marklogic-data-hub-spark-connector/spark-test-project/README.md deleted file mode 100644 index 45d5192d9d..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/README.md +++ /dev/null @@ -1,64 +0,0 @@ -This is a simple project for manual ad hoc testing of the DH Spark connector in a local Spark environment. It is -intended to be run against the application deployed from ./examples/reference-entity-model in this repository. Please -read the README for that example project in order to deploy it. - -**You must use Java 8** when running the Gradle tasks below. The DH Spark connector depends on Spark 2.x, -which requires Java 8 usage. - -## Building the connector - -To use this project, you will first need to build and copy the DH Spark connector to this project by running the following -Gradle task from the marklogic-data-hub-spark-connector directory (you can abbreviate the task to copycon): - - ../gradlew copyConnectorToSparkTestProject - -This will build and copy the DH Spark connector to the ./lib directory in this project, which is gitignored. - -## Running the example Gradle tasks - -Each Gradle task described below will connect to a Data Hub instance based on the host, username, and password -properties defined in this project's gradle.properties file. These properties default to the "hub-operator" user that -is expected to be deployed by the application in ./examples/reference-entity-model. You may override these via a -gradle-local.properties file in this project, which is gitignored. They may also be overridden via Gradle "-P" options, -e.g: - - ./gradlew taskName -Phost=somehost -Pusername=someuser -Ppassword=changeme - -The local Gradle wrapper in this project can then be used to run each of the Gradle tasks described below. - -The programs run by the Gradle tasks below can also be run via an IDE. If using Intellij, it is recommended to import -this as a separate Intellij project - i.e. don't import the build.gradle file into your DHF project. Make sure you set -the project JDK to Java 8, and you should be able to run each program as a regular Java program. Note that you will need -to provide command line arguments for each program via the IDE as well. This approach is often handy for debugging the -program while making modifications to it. - - -### Writing data - -Run the following Gradle task to load the contents of src/main/resources/data/customers.csv into your staging database: - - ./gradlew writeCustomersToStaging - -Each row in customers.csv will be written as a separate document. To customize how they are written, you can modify the -WriteCustomersToStaging Java program. - -To see an example of using Spark to perform a "streaming write" - i.e. to open a stream on the CSV file and write from -it to MarkLogic - run the following Gradle task: - - ./gradlew streamingWriteCustomersToStaging - -You can examine the StreamingWriteCustomersToStaging program to see the different Spark APIs used to enable streaming -from a data source. - - -### Reading data - -Assuming that the application deployed by ./examples/reference-entity-model has some Customer entity instances in the -final database (this will be the case when the application is first deployed), you can read these entity instances as -rows by running the following Gradle task: - - ./gradlew readCustomersFromFinal - -This will read customers from the final database based on the options specified in the ReadCustomersFromFinal -program in this project. Up to 10 customer rows will be logged. - diff --git a/marklogic-data-hub-spark-connector/spark-test-project/build.gradle b/marklogic-data-hub-spark-connector/spark-test-project/build.gradle deleted file mode 100644 index 6dee67adcf..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/build.gradle +++ /dev/null @@ -1,46 +0,0 @@ -plugins { - id 'net.saliman.properties' version '1.5.1' - id "java" -} - -repositories { - mavenCentral() -} - -sourceCompatibility = "8" -targetCompatibility = "8" - -ext { - sparkVersion = "2.4.5" -} - -dependencies { - implementation fileTree(dir: "lib", includes: ["*.jar"]) - - implementation "org.apache.spark:spark-sql_2.11:${sparkVersion}" - implementation "org.apache.spark:spark-launcher_2.11:${sparkVersion}" - implementation "org.apache.spark:spark-catalyst_2.11:${sparkVersion}" - implementation "org.apache.spark:spark-streaming_2.11:${sparkVersion}" - implementation "org.apache.spark:spark-core_2.11:${sparkVersion}" -} - -task writeCustomersToStaging(type: JavaExec) { - description = "Write customer data from customers.csv to the staging database" - classpath = sourceSets.main.runtimeClasspath - main = "org.example.WriteCustomersToStaging" - args = [host, username, password] -} - -task streamingWriteCustomersToStaging(type: JavaExec) { - description = "Write customer data via Spark streaming from customers.csv to the staging database" - classpath = sourceSets.main.runtimeClasspath - main = "org.example.StreamingWriteCustomersToStaging" - args = [host, username, password] -} - -task readCustomersFromFinal(type: JavaExec) { - description = "Read Customer entity instances as rows from the final database" - classpath = sourceSets.main.runtimeClasspath - main = "org.example.ReadCustomersFromFinal" - args = [host, username, password] -} diff --git a/marklogic-data-hub-spark-connector/spark-test-project/gradle.properties b/marklogic-data-hub-spark-connector/spark-test-project/gradle.properties deleted file mode 100644 index c41f498e12..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/gradle.properties +++ /dev/null @@ -1,9 +0,0 @@ -# Connection properties for the test programs - -# Can override this via gradle-local.properties, which is gitignored -host=localhost - -# Assumes a connection to an application deployed from ./examples/reference-entity-model -username=hub-operator -password=password - diff --git a/marklogic-data-hub-spark-connector/spark-test-project/gradle/wrapper/gradle-wrapper.jar b/marklogic-data-hub-spark-connector/spark-test-project/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 62d4c053550b91381bbd28b1afc82d634bf73a8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58910 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 diff --git a/marklogic-data-hub-spark-connector/spark-test-project/gradle/wrapper/gradle-wrapper.properties b/marklogic-data-hub-spark-connector/spark-test-project/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 622ab64a3c..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/marklogic-data-hub-spark-connector/spark-test-project/gradlew b/marklogic-data-hub-spark-connector/spark-test-project/gradlew deleted file mode 100755 index fbd7c51583..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/marklogic-data-hub-spark-connector/spark-test-project/gradlew.bat b/marklogic-data-hub-spark-connector/spark-test-project/gradlew.bat deleted file mode 100644 index 5093609d51..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/gradlew.bat +++ /dev/null @@ -1,104 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/marklogic-data-hub-spark-connector/spark-test-project/settings.gradle b/marklogic-data-hub-spark-connector/spark-test-project/settings.gradle deleted file mode 100644 index bed43ce6c4..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -// An empty settings file is needed to keep Gradle from complaining about this not being part -// referenced by the parent project diff --git a/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/ExampleSupport.java b/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/ExampleSupport.java deleted file mode 100644 index e72638d46f..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/ExampleSupport.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.example; - -import org.apache.spark.SparkConf; -import org.apache.spark.sql.SparkSession; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; - -public abstract class ExampleSupport { - - protected Logger logger = LoggerFactory.getLogger(getClass()); - - protected String host; - protected String username; - protected String password; - - protected void setConnectionProperties(String[] args) { - if (args.length != 3) { - throw new RuntimeException("Requires 3 args - host, username, and password"); - } else { - host = args[0]; - username = args[1]; - password = args[2]; - logger.info(String.format("Will write to '%s' as user '%s'", host, username)); - } - } - - protected SparkSession newSparkSession() { - logger.info("Creating SparkSession"); - SparkConf conf = new SparkConf().set("spark.driver.bindAddress", "127.0.0.1"); - return SparkSession.builder() - .config(conf).appName("ExampleAppName") - // The brackets specify the number of cores to use; "*" defaults to the number of cores available - .master("local[*]") - .getOrCreate(); - } - - /** - * Depending on how this program is run - e.g. via Gradle or an IDE - the path will resolve to either this project - * directory or the root DHF project directory. So gotta support both. - * - * @return - */ - protected String getTestFilePath() { - String filePath = "src/main/resources/data/customers.csv"; - if (new File(filePath).exists()) { - return new File(filePath).getAbsolutePath(); - } - return new File("marklogic-data-hub-spark-connector/spark-test-project/" + filePath).getAbsolutePath(); - } -} diff --git a/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/ReadCustomersFromFinal.java b/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/ReadCustomersFromFinal.java deleted file mode 100644 index b713c29fdb..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/ReadCustomersFromFinal.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.example; - -import org.apache.spark.sql.Dataset; -import org.apache.spark.sql.Row; -import org.apache.spark.sql.SQLContext; -import org.apache.spark.sql.SparkSession; - -public class ReadCustomersFromFinal extends ExampleSupport { - - public static void main(String[] args) { - new ReadCustomersFromFinal(args); - } - - public ReadCustomersFromFinal(String[] args) { - setConnectionProperties(args); - SparkSession session = newSparkSession(); - SQLContext sqlContext = new SQLContext(session); - - Dataset rows = sqlContext.read() - // Specify the package of the DH Spark connector so Spark uses our DataReader - .format("com.marklogic.hub.spark.sql.sources.v2") - - // Connection properties - .option("mlHost", host) - .option("mlUsername", username) - .option("mlPassword", password) - .option("hubDhs", "false") - - // Query properties - .option("view", "Customer") - .option("schema", "Customer") // optional - .option("sqlCondition", "customerId > 200") // optional - .load() // does not actually load the data, but creates the Dataset - .cache(); // forces the data to be loaded and stored in memory - - long rowCount = rows.count(); - logger.info("Total row count: " + rowCount); - - // Print the first 10 rows - Row[] rowArray = (Row[]) rows.collect(); - for (int i = 0; i < 10; i++) { - if (i < rowCount) { - logger.info("Row: " + rowArray[i]); - } - } - - session.close(); - } -} diff --git a/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/StreamingWriteCustomersToStaging.java b/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/StreamingWriteCustomersToStaging.java deleted file mode 100644 index c5249eefe1..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/StreamingWriteCustomersToStaging.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.example; - -import org.apache.spark.sql.Dataset; -import org.apache.spark.sql.Row; -import org.apache.spark.sql.SparkSession; -import org.apache.spark.sql.streaming.StreamingQuery; -import org.apache.spark.sql.streaming.StreamingQueryException; -import org.apache.spark.sql.types.StructType; - -public class StreamingWriteCustomersToStaging extends ExampleSupport { - - public static void main(String[] args) { - new StreamingWriteCustomersToStaging(args); - } - - public StreamingWriteCustomersToStaging(String[] args) { - setConnectionProperties(args); - - SparkSession session = newSparkSession(); - try { - writeRowsToDataHub(loadRowsFromTestFile(session)); - } finally { - logger.info("Closing SparkSession"); - session.close(); - } - } - - /** - * Demonstrates streaming from a CSV file via Spark. The schema - StructType - is determined first, and then - * readStream() is used to open a stream on the directory containing the CSV file. - * - * @param sparkSession - * @return - */ - private Dataset loadRowsFromTestFile(SparkSession sparkSession) { - final String filePath = getTestFilePath(); - logger.info("Loading from file: " + filePath); - StructType structType = sparkSession.read().option("header", true).csv(getTestFilePath()).schema(); - logger.info("Schema of the input file is: " + structType); - Dataset rows = sparkSession.readStream().schema(structType).format("csv").option("header", true).csv("src/main/resources/data"); - return rows; - } - - /** - * Customize the options in here as needed for ad hoc testing. - * - * @param rows - */ - private void writeRowsToDataHub(Dataset rows) { - StreamingQuery streamingQuery = rows.writeStream() - .format("com.marklogic.hub.spark.sql.sources.v2") - .option("mlHost", host) - .option("mlUsername", username) - .option("mlPassword", password) - .option("uriPrefix", "/StreamingTest/Customer/") - .option("collections", "sparkCustomer,streamingTest") - .option("permissions", "data-hub-common,read,data-hub-common,update") - .option("hubDhs", "false") - .option("batchSize", "3") - .option("checkpointLocation", "build/checkpoints/" + System.currentTimeMillis()) - .start(); - - final long timeToWait = 3000; - try { - streamingQuery.awaitTermination(timeToWait); - } catch (StreamingQueryException e) { - throw new RuntimeException(e); - } - } -} diff --git a/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/WriteCustomersToStaging.java b/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/WriteCustomersToStaging.java deleted file mode 100644 index c0efd19fa0..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/src/main/java/org/example/WriteCustomersToStaging.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.example; - -import org.apache.spark.sql.Dataset; -import org.apache.spark.sql.Row; -import org.apache.spark.sql.SparkSession; - -import java.io.File; - -/** - * Simple test program for verifying that the connector shadowJar works correctly within Spark. This is intended only - * for manual ad hoc testing. The options for the connector default to a local DHF instance; customize those as needed. - */ -public class WriteCustomersToStaging extends ExampleSupport { - - public static void main(String[] args) { - new WriteCustomersToStaging(args); - } - - public WriteCustomersToStaging(String[] args) { - setConnectionProperties(args); - SparkSession sparkSession = newSparkSession(); - try { - writeRowsToStaging(loadRowsFromTestFile(newSparkSession())); - } finally { - logger.info("Closing SparkSession"); - sparkSession.close(); - } - } - - private Dataset loadRowsFromTestFile(SparkSession sparkSession) { - final String filePath = getTestFilePath(); - logger.info("Loading from file: " + filePath); - Dataset rows = sparkSession.read().option("header", true).csv(getTestFilePath()); - logger.info("Number of rows loaded: " + rows.count()); - return rows; - } - - /** - * Customize the options in here as needed for ad hoc testing. - * - * @param rows - */ - private void writeRowsToStaging(Dataset rows) { - rows.write() - .format("com.marklogic.hub.spark.sql.sources.v2") - .option("mlHost", host) - .option("mlUsername", username) - .option("mlPassword", password) - .option("uriTemplate", "/SparkCustomer/{CustomerID}.json") - .option("collections", "sparkCustomer,sparkData") - .option("permissions", "data-hub-common,read,data-hub-common,update") - .option("hubDhs", "false") - .save(); - } -} - diff --git a/marklogic-data-hub-spark-connector/spark-test-project/src/main/resources/data/customers.csv b/marklogic-data-hub-spark-connector/spark-test-project/src/main/resources/data/customers.csv deleted file mode 100644 index dad33ff5c1..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/src/main/resources/data/customers.csv +++ /dev/null @@ -1,6 +0,0 @@ -CustomerID,Name,Email,SSN -501,Jane Spark,jane@example.org,501-99-9999 -502,Jim Spark,jim@example.org,502-99-9999 -503,Juanita Spark,juanita@example.org,503-99-9999 -504,Jasmine Spark,jasmine@example.org,504-99-9999 -505,John Spark,john@example.org,505-99-9999 diff --git a/marklogic-data-hub-spark-connector/spark-test-project/src/main/resources/log4j.properties b/marklogic-data-hub-spark-connector/spark-test-project/src/main/resources/log4j.properties deleted file mode 100644 index 48ef3c66bb..0000000000 --- a/marklogic-data-hub-spark-connector/spark-test-project/src/main/resources/log4j.properties +++ /dev/null @@ -1,18 +0,0 @@ -# Have to use log4j, as the spark jars bring along log4j as a dependency -# This file is just used for tests, so feel free to configure it in any manner - -# Root logger option -log4j.rootLogger=WARN, stdout - -log4j.logger.org.example=INFO, stdout -log4j.additivity.org.example=false - -log4j.logger.com.marklogic.hub=DEBUG, stdout -log4j.additivity.com.marklogic.hub=false - -# Direct log messages to stdout -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Target=System.out -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c{1} - %m%n - diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/dataservices/SparkService.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/dataservices/SparkService.java deleted file mode 100644 index 1a78f58326..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/dataservices/SparkService.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.marklogic.hub.spark.dataservices; - -// IMPORTANT: Do not edit. This file is generated. - -import com.marklogic.client.io.Format; -import java.io.Reader; -import java.util.stream.Stream; - - -import com.marklogic.client.DatabaseClient; -import com.marklogic.client.io.marker.JSONWriteHandle; - -import com.marklogic.client.impl.BaseProxy; - -/** - * Defines endpoints needed by the Spark connector - */ -public interface SparkService { - /** - * Creates a SparkService object for executing operations on the database server. - * - * The DatabaseClientFactory class can create the DatabaseClient parameter. A single - * client object can be used for any number of requests and in multiple threads. - * - * @param db provides a client for communicating with the database server - * @return an object for executing database operations - */ - static SparkService on(DatabaseClient db) { - return on(db, null); - } - /** - * Creates a SparkService object for executing operations on the database server. - * - * The DatabaseClientFactory class can create the DatabaseClient parameter. A single - * client object can be used for any number of requests and in multiple threads. - * - * The service declaration uses a custom implementation of the same service instead - * of the default implementation of the service by specifying an endpoint directory - * in the modules database with the implementation. A service.json file with the - * declaration can be read with FileHandle or a string serialization of the JSON - * declaration with StringHandle. - * - * @param db provides a client for communicating with the database server - * @param serviceDeclaration substitutes a custom implementation of the service - * @return an object for executing database operations - */ - static SparkService on(DatabaseClient db, JSONWriteHandle serviceDeclaration) { - final class SparkServiceImpl implements SparkService { - private DatabaseClient dbClient; - private BaseProxy baseProxy; - - private BaseProxy.DBFunctionRequest req_writeRecords; - private BaseProxy.DBFunctionRequest req_initializeRead; - private BaseProxy.DBFunctionRequest req_finalizeWrite; - private BaseProxy.DBFunctionRequest req_readRows; - private BaseProxy.DBFunctionRequest req_initializeWrite; - - private SparkServiceImpl(DatabaseClient dbClient, JSONWriteHandle servDecl) { - this.dbClient = dbClient; - this.baseProxy = new BaseProxy("/marklogic-data-hub-spark-connector/", servDecl); - - this.req_writeRecords = this.baseProxy.request( - "writeRecords.sjs", BaseProxy.ParameterValuesKind.MULTIPLE_NODES); - this.req_initializeRead = this.baseProxy.request( - "initializeRead.sjs", BaseProxy.ParameterValuesKind.SINGLE_NODE); - this.req_finalizeWrite = this.baseProxy.request( - "finalizeWrite.sjs", BaseProxy.ParameterValuesKind.MULTIPLE_ATOMICS); - this.req_readRows = this.baseProxy.request( - "readRows.sjs", BaseProxy.ParameterValuesKind.MULTIPLE_NODES); - this.req_initializeWrite = this.baseProxy.request( - "initializeWrite.sjs", BaseProxy.ParameterValuesKind.SINGLE_NODE); - } - - @Override - public void writeRecords(Reader endpointConstants, Stream input) { - writeRecords( - this.req_writeRecords.on(this.dbClient), endpointConstants, input - ); - } - private void writeRecords(BaseProxy.DBFunctionRequest request, Reader endpointConstants, Stream input) { - request - .withParams( - BaseProxy.documentParam("endpointConstants", true, BaseProxy.JsonDocumentType.fromReader(endpointConstants)), - BaseProxy.documentParam("input", true, BaseProxy.JsonDocumentType.fromReader(input)) - ).responseNone(); - } - - @Override - public com.fasterxml.jackson.databind.JsonNode initializeRead(com.fasterxml.jackson.databind.JsonNode inputs) { - return initializeRead( - this.req_initializeRead.on(this.dbClient), inputs - ); - } - private com.fasterxml.jackson.databind.JsonNode initializeRead(BaseProxy.DBFunctionRequest request, com.fasterxml.jackson.databind.JsonNode inputs) { - return BaseProxy.JsonDocumentType.toJsonNode( - request - .withParams( - BaseProxy.documentParam("inputs", false, BaseProxy.JsonDocumentType.fromJsonNode(inputs)) - ).responseSingle(false, Format.JSON) - ); - } - - @Override - public void finalizeWrite(String jobId, String status) { - finalizeWrite( - this.req_finalizeWrite.on(this.dbClient), jobId, status - ); - } - private void finalizeWrite(BaseProxy.DBFunctionRequest request, String jobId, String status) { - request - .withParams( - BaseProxy.atomicParam("jobId", false, BaseProxy.StringType.fromString(jobId)), - BaseProxy.atomicParam("status", false, BaseProxy.StringType.fromString(status)) - ).responseNone(); - } - - @Override - public Stream readRows(Reader endpointState, Reader endpointConstants) { - return readRows( - this.req_readRows.on(this.dbClient), endpointState, endpointConstants - ); - } - private Stream readRows(BaseProxy.DBFunctionRequest request, Reader endpointState, Reader endpointConstants) { - return BaseProxy.JsonDocumentType.toReader( - request - .withParams( - BaseProxy.documentParam("endpointState", true, BaseProxy.JsonDocumentType.fromReader(endpointState)), - BaseProxy.documentParam("endpointConstants", true, BaseProxy.JsonDocumentType.fromReader(endpointConstants)) - ).responseMultiple(true, Format.JSON) - ); - } - - @Override - public String initializeWrite(com.fasterxml.jackson.databind.JsonNode externalMetadata) { - return initializeWrite( - this.req_initializeWrite.on(this.dbClient), externalMetadata - ); - } - private String initializeWrite(BaseProxy.DBFunctionRequest request, com.fasterxml.jackson.databind.JsonNode externalMetadata) { - return BaseProxy.StringType.toString( - request - .withParams( - BaseProxy.documentParam("externalMetadata", true, BaseProxy.JsonDocumentType.fromJsonNode(externalMetadata)) - ).responseSingle(false, null) - ); - } - } - - return new SparkServiceImpl(db, serviceDeclaration); - } - - /** - * Supports the Spark connector in writing many records at once - * - * @param endpointConstants provides input - * @param input provides input - * - */ - void writeRecords(Reader endpointConstants, Stream input); - - /** - * Determines the schema and set of partitions based on the user's inputs - * - * @param inputs JSON object defining the inputs for the rows to be read - * @return JSON object containing a 'schema' object, 'partitions' array, and a 'parameterizedPlan' object - */ - com.fasterxml.jackson.databind.JsonNode initializeRead(com.fasterxml.jackson.databind.JsonNode inputs); - - /** - * Finalize a write process, which includes updating the job document - * - * @param jobId ID of the job document - * @param status Status of the job - * - */ - void finalizeWrite(String jobId, String status); - - /** - * Return a JSON array for each row that matches the user's query, as defined by the endpointConstants - * - * @param endpointState provides input - * @param endpointConstants provides input - * @return A JSON array for each matching row for the given partition batch - */ - Stream readRows(Reader endpointState, Reader endpointConstants); - - /** - * Initializes a write process, which includes creating a job document - * - * @param externalMetadata Optional JSON object that will be added to the job document if not null - * @return The ID of the created job - */ - String initializeWrite(com.fasterxml.jackson.databind.JsonNode externalMetadata); - -} diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/DefaultSource.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/DefaultSource.java deleted file mode 100644 index c97237a4fc..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/DefaultSource.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2021 MarkLogic Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.marklogic.hub.spark.sql.sources.v2; - -import com.marklogic.client.ext.helper.LoggingObject; -import com.marklogic.hub.spark.sql.sources.v2.reader.HubDataSourceReader; -import com.marklogic.hub.spark.sql.sources.v2.writer.HubDataSourceWriter; -import org.apache.spark.sql.SaveMode; -import org.apache.spark.sql.sources.v2.DataSourceOptions; -import org.apache.spark.sql.sources.v2.ReadSupport; -import org.apache.spark.sql.sources.v2.StreamWriteSupport; -import org.apache.spark.sql.sources.v2.WriteSupport; -import org.apache.spark.sql.sources.v2.reader.DataSourceReader; -import org.apache.spark.sql.sources.v2.writer.DataSourceWriter; -import org.apache.spark.sql.sources.v2.writer.streaming.StreamWriter; -import org.apache.spark.sql.streaming.OutputMode; -import org.apache.spark.sql.types.StructType; - -import java.util.Optional; - -public class DefaultSource extends LoggingObject implements WriteSupport, StreamWriteSupport, ReadSupport { - - private HubDataSourceReader hubDataSourceReader; - - public DefaultSource() { - logger.debug("Created: " + toString()); - } - - @Override - public Optional createWriter(String writeUUID, StructType schema, SaveMode mode, DataSourceOptions options) { - return Optional.of(new HubDataSourceWriter(options.asMap(), schema, false)); - } - - @Override - public StreamWriter createStreamWriter(String queryId, StructType schema, OutputMode mode, DataSourceOptions options) { - return new HubDataSourceWriter(options.asMap(), schema, true); - } - - @Override - public DataSourceReader createReader(DataSourceOptions options) { - // Logging of the HubDataSourceReader's constructor indicates that in a simple Spark test program, this method - // is called multiple times. On the first occasion, the getSchema method is called, and then instance is seemingly - // discarded. On the second occasion, the planInputPartitions method is called, which allows for partition - // readers to then be created. And then this is called on a third occasion for unknown reasons. For performance - // reasons then, this class will only create one HubDataSourceReader. Testing has shown that if the Spark - // program then calls "format" again on a SQLContext, a new instance of this class - DefaultSource - will be - // created, thus ensuring that a new data source reader is created. - if (hubDataSourceReader == null) { - hubDataSourceReader = new HubDataSourceReader(options); - } - return hubDataSourceReader; - } -} diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/ModuleWriter.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/ModuleWriter.java deleted file mode 100644 index 0df20b09b2..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/ModuleWriter.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2; - -import com.marklogic.client.document.DocumentManager; -import com.marklogic.client.ext.helper.LoggingObject; -import com.marklogic.client.ext.util.DefaultDocumentPermissionsParser; -import com.marklogic.client.io.DocumentMetadataHandle; -import com.marklogic.client.io.Format; -import com.marklogic.client.io.InputStreamHandle; -import com.marklogic.hub.HubClient; -import com.marklogic.hub.HubClientConfig; -import org.springframework.core.io.ClassPathResource; - -import java.io.IOException; - -public class ModuleWriter extends LoggingObject { - - private HubClient hubClient; - private HubClientConfig hubClientConfig; - - public ModuleWriter(HubClient hubClient, HubClientConfig hubClientConfig) { - this.hubClient = hubClient; - this.hubClientConfig = hubClientConfig; - } - - public void loadModuleIfNotPresent(String modulePath, Format format) { - if (!endpointExists(modulePath)) { - try { - DocumentManager modMgr = hubClient.getModulesClient().newDocumentManager(); - DocumentMetadataHandle metadata = buildDocumentMetadata(); - logger.info("Loading module: " + modulePath); - modMgr.write(modulePath, metadata, new InputStreamHandle(new ClassPathResource(modulePath).getInputStream()).withFormat(format)); - } catch (IOException e) { - throw new RuntimeException("Unable to write endpoint at path: " + modulePath + "; cause: " + e.getMessage(), e); - } - } - } - - private boolean endpointExists(String scriptPath) { - return !(hubClient.getModulesClient().newJSONDocumentManager().exists(scriptPath) == null); - } - - private DocumentMetadataHandle buildDocumentMetadata() { - DocumentMetadataHandle metadata = new DocumentMetadataHandle(); - String modulePermissions = hubClientConfig.getModulePermissions(); - new DefaultDocumentPermissionsParser().parsePermissions(modulePermissions, metadata.getPermissions()); - - // It seems preferable to use this collection so that modules loaded by the connector are considered OOTB - // modules. Otherwise, if the modules are not loaded in this collection, tasks like mlClearUserModules will - // delete them, which does not seem expected. - metadata.getCollections().addAll("hub-core-module"); - - return metadata; - } -} diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/Util.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/Util.java deleted file mode 100644 index 508b4446a2..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/Util.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2; - -import com.marklogic.hub.HubClientConfig; - -import java.util.Map; -import java.util.Properties; - -public abstract class Util { - - public static HubClientConfig buildHubClientConfig(Map options) { - Properties props = new Properties(); - // Assume DHS usage by default; the options map can override these - props.setProperty("hubdhs", "true"); - options.keySet().forEach(key -> props.setProperty(key, options.get(key))); - - HubClientConfig hubClientConfig = new HubClientConfig(); - hubClientConfig.registerLowerCasedPropertyConsumers(); - hubClientConfig.applyProperties(props); - return hubClientConfig; - } - -} diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubDataSourceReader.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubDataSourceReader.java deleted file mode 100644 index f85fcbe520..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubDataSourceReader.java +++ /dev/null @@ -1,226 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.marklogic.client.FailedRequestException; -import com.marklogic.client.ext.helper.LoggingObject; -import com.marklogic.client.io.Format; -import com.marklogic.client.io.InputStreamHandle; -import com.marklogic.hub.HubClient; -import com.marklogic.hub.HubClientConfig; -import com.marklogic.hub.spark.dataservices.SparkService; -import com.marklogic.hub.spark.sql.sources.v2.ModuleWriter; -import com.marklogic.hub.spark.sql.sources.v2.Util; -import org.apache.commons.lang.StringUtils; -import org.apache.spark.sql.SparkSession; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.sources.v2.DataSourceOptions; -import org.apache.spark.sql.sources.v2.reader.DataSourceReader; -import org.apache.spark.sql.sources.v2.reader.InputPartition; -import org.apache.spark.sql.types.StructType; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; - -/** - * Responsible for calling the initialization endpoint which allows it to know how many input partitions to - * build and what schema to use. - */ -public class HubDataSourceReader extends LoggingObject implements DataSourceReader { - - private final Map options; - private final JsonNode initializationResponse; - private final StructType sparkSchema; - private JsonNode endpointParams; - private boolean hasCustomApiPath; - private HubClient hubClient; - private HubClientConfig hubClientConfig; - private ModuleWriter moduleWriter; - - /** - * The current default for partition count is based on the active SparkSession. The PartitionCountProvider is used - * to allow for JUnit tests to specify a custom partition count and not depend on a SparkSession being available. - * - * @param dataSourceOptions - */ - public HubDataSourceReader(DataSourceOptions dataSourceOptions) { - logger.debug("Created: " + toString()); - - this.options = dataSourceOptions.asMap(); - hubClientConfig = Util.buildHubClientConfig(options); - hubClient = HubClient.withHubClientConfig(hubClientConfig); - this.moduleWriter = new ModuleWriter(hubClient, hubClientConfig); - validateOptions(this.options); - - this.initializationResponse = initializeRead(this.options); - this.sparkSchema = (StructType) StructType.fromJson(initializationResponse.get("sparkSchema").toString()); - } - - /** - * @param options - */ - private void validateOptions(Map options) { - this.endpointParams = determineReadRowsEndpointParams(options); - if (options.containsKey("serializedplan")) { - Stream.of("view", "schema", "sqlcondition", "selectedcolumns").forEach(key -> { - if (options.containsKey(key)) { - throw new IllegalArgumentException(format("The '%s' option may not be specified when 'serializedplan' is also specified", key)); - } - }); - return; - } - - if (!hasCustomApiPath && !options.containsKey("view")) { - throw new RuntimeException("The 'view' option must define a TDE view name from which to retrieve rows"); - } - } - - /** - * @param options - * @return - */ - private JsonNode initializeRead(Map options) { - ObjectNode inputs = buildInitializeReadInputs(options); - - InputStreamHandle initializeDefinition; - - initializeDefinition = readCustomInitializeApiDefinition(options); - - try { - if(options.containsKey("initializereadapipath")) { - return SparkService.on( - hubClient.getFinalClient(), initializeDefinition - ).initializeRead(inputs); - } - return SparkService.on( - hubClient.getFinalClient() - ).initializeRead(inputs); - } catch (FailedRequestException ex) { - throw new RuntimeException("Unable to initialize read, cause: " + ex.getMessage(), ex); - } - } - - /** - * Protected so that it can be unit-tested. - * - * @param options - * @return - */ - protected ObjectNode buildInitializeReadInputs(Map options) { - ObjectNode inputs = new ObjectMapper().createObjectNode(); - - // The same all-lowercase style is used here for consistency with Spark, even though it's not consistent with - // DHF code conventions - Stream.of("view", "schema", "sqlcondition", "selectedcolumns", "sparkschema").forEach(key -> inputs.put(key, options.get(key))); - inputs.put("numpartitions", determineNumPartitions(options)); - - if (options.containsKey("serializedplan")) { - try { - inputs.set("serializedPlan", new ObjectMapper().readTree(options.get("serializedplan"))); - } catch (Exception ex) { - throw new IllegalArgumentException("Unable to read serializedplan as a JSON object; cause: " + ex.getMessage(), ex); - } - } - - return inputs; - } - - /** - * @param options - * @return - */ - private int determineNumPartitions(Map options) { - int numPartitions; - if (options.containsKey("numpartitions")) { - try { - numPartitions = Integer.parseInt(options.get("numpartitions")); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("numpartitions must be an integer greater than or equal to 1"); - } - } else { - numPartitions = SparkSession.active().sparkContext().defaultMinPartitions(); - } - if (numPartitions < 1) { - throw new IllegalArgumentException("numpartitions must be an integer greater than or equal to 1"); - } - return numPartitions; - } - - private InputStreamHandle readCustomInitializeApiDefinition(Map options) { - InputStreamHandle initializeDefinition = null; - String key = "initializereadapipath"; - if (options.containsKey(key)) { - try { - initializeDefinition = hubClient.getModulesClient().newDocumentManager().read(options.get(key), new InputStreamHandle()); - } catch (Exception ex) { - throw new RuntimeException("Unable to read custom API module for initializing Read job: " + options.get(key) + "; cause: " + ex.getMessage(), ex); - } - } - else { - moduleWriter.loadModuleIfNotPresent("/marklogic-data-hub-spark-connector/initializeRead.sjs", Format.TEXT); - moduleWriter.loadModuleIfNotPresent("/marklogic-data-hub-spark-connector/initializeRead.api", Format.JSON); - } - - return initializeDefinition; - } - - @Override - public List> planInputPartitions() { - List> inputPartitions = new ArrayList<>(); - int partitionCount = initializationResponse.get("partitions").size(); - logger.info("Input partition count: " + partitionCount); - for (int i = 0; i < partitionCount; i++) { - inputPartitions.add(new HubInputPartition(this.options, initializationResponse, i, this.endpointParams)); - } - return inputPartitions; - } - - @Override - public StructType readSchema() { - return sparkSchema; - } - - private JsonNode determineReadRowsEndpointParams(Map options) { - ObjectNode endpointParams; - ObjectMapper objectMapper = new ObjectMapper(); - if (options.containsKey("readrowsendpointparams")) { - try { - endpointParams = (ObjectNode) objectMapper.readTree(options.get("readrowsendpointparams")); - } catch (IOException e) { - throw new IllegalArgumentException("Unable to parse readrowsendpointparams, cause: " + e.getMessage(), e); - } - } else { - endpointParams = objectMapper.createObjectNode(); - } - - boolean doesNotHaveApiPath = (!endpointParams.hasNonNull("apiPath") || StringUtils.isEmpty(endpointParams.get("apiPath").asText())); - boolean hasEndpointConstants = endpointParams.hasNonNull("endpointConstants") && !StringUtils.isEmpty(endpointParams.get("endpointConstants").asText()); - boolean hasEndpointState = endpointParams.hasNonNull("endpointState") && !StringUtils.isEmpty(endpointParams.get("endpointState").asText()); - if (doesNotHaveApiPath && hasEndpointState) { - throw new IllegalArgumentException("Cannot set endpointState in readrowsendpointparams option unless apiPath is defined as well."); - } - if(hasEndpointConstants) - throw new IllegalArgumentException("Cannot set endpointConstants in readrowsendpointparams option; can only set apiPath and endpointState."); - - moduleWriter.loadModuleIfNotPresent("/marklogic-data-hub-spark-connector/readLib.sjs", Format.TEXT); - moduleWriter.loadModuleIfNotPresent("/marklogic-data-hub-spark-connector/partition-lib.xqy", Format.TEXT); - - if (doesNotHaveApiPath) { - moduleWriter.loadModuleIfNotPresent("/marklogic-data-hub-spark-connector/readRows.sjs", Format.TEXT); - moduleWriter.loadModuleIfNotPresent("/marklogic-data-hub-spark-connector/readRows.api", Format.JSON); - String apiPath = "/marklogic-data-hub-spark-connector/readRows.api"; - - endpointParams.put("apiPath", apiPath); - } - this.hasCustomApiPath = !doesNotHaveApiPath; - return endpointParams; - } - - -} - - diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubInputPartition.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubInputPartition.java deleted file mode 100644 index 29450ccc64..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubInputPartition.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.fasterxml.jackson.databind.JsonNode; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.sources.v2.reader.InputPartition; -import org.apache.spark.sql.sources.v2.reader.InputPartitionReader; -import org.apache.spark.sql.types.StructType; - -import java.util.Map; - -/** - * Simple factory class for creating a HubInputPartitionReader based on the inputs to this class's constructor. - */ -public class HubInputPartition implements InputPartition { - - private Map options; - private JsonNode initializeResponse; - private int partitionNumber; - private JsonNode endpointParams; - - public HubInputPartition(Map options, JsonNode initializeResponse, int partitionNumber, JsonNode endpointParams) { - this.options = options; - this.initializeResponse = initializeResponse; - this.partitionNumber = partitionNumber; - this.endpointParams = endpointParams; - } - - @Override - public InputPartitionReader createPartitionReader() { - return new HubInputPartitionReader(options, initializeResponse, partitionNumber, endpointParams); - } -} diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubInputPartitionReader.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubInputPartitionReader.java deleted file mode 100644 index 995ebae930..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/HubInputPartitionReader.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.marklogic.client.dataservices.OutputCaller; -import com.marklogic.client.ext.helper.LoggingObject; -import com.marklogic.client.io.InputStreamHandle; -import com.marklogic.client.io.JacksonHandle; -import com.marklogic.hub.HubClient; -import com.marklogic.hub.spark.sql.sources.v2.Util; -import org.apache.commons.lang.StringUtils; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.sources.v2.reader.InputPartitionReader; -import org.apache.spark.sql.types.StructType; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; - -/** - * Uses a BulkOutputCaller to fetch rows for a given partition. Each JSON row is then converted into an InternalRow. - */ -public class HubInputPartitionReader extends LoggingObject implements InputPartitionReader { - - private final HubClient hubClient; - private final ObjectMapper objectMapper; - private final OutputCaller.BulkOutputCaller bulkOutputCaller; - private final JsonRowParser jsonRowParser; - - private InputStream[] rows; - private int rowIndex; - private JsonNode currentRow; - private long numberOfRowsRead; - - /** - * @param options options provided by the Spark user; needed to both connect to ML and to query for data - * @param initializationResponse - * @param partitionNumber - */ - public HubInputPartitionReader(Map options, JsonNode initializationResponse, int partitionNumber, JsonNode endpointParams) { - this.hubClient = HubClient.withHubClientConfig(Util.buildHubClientConfig(options)); - this.objectMapper = new ObjectMapper(); - - StructType sparkSchema = (StructType) StructType.fromJson(initializationResponse.get("sparkSchema").toString()); - this.jsonRowParser = new JsonRowParser(sparkSchema); - ObjectNode endpointConstants = buildEndpointConstants(options, initializationResponse, partitionNumber); - this.bulkOutputCaller = buildOutputCaller(endpointConstants, endpointParams); - } - - /** - * If this reader's rows array is null or empty, then call the endpoint to read the next batch of rows. If no - * rows are returned, then this returns false, as the endpoint is indicating it has found no more matching rows. - * - * @return - * @throws IOException - */ - @Override - public boolean next() throws IOException { - if (rows == null || rowIndex >= rows.length) { - readNextBatchOfRows(); - } - - if (rows == null || rows.length == 0) { - // Somehow, this log statement is showing up twice when the connector is used in a test program. Given that - // this is returning false, but then somehow Spark is calling this method again, this seems like an issue - // with Spark. The only cost is that an extra call is made to the endpoint, which is almost certainly going - // to return zero rows again. - logger.debug("Finished reading rows"); - return false; - } - - this.currentRow = objectMapper.readTree(rows[rowIndex++]); - return true; - } - - /** - * Convert the most recently read JSON object into an InternalRow. - * - * @return - */ - @Override - public InternalRow get() { - return jsonRowParser.parseJsonRow(currentRow.toString()).head(); - } - - @Override - public void close() { - logger.debug("Closing"); - } - - private ObjectNode buildEndpointConstants(Map options, JsonNode initializationResponse, int partitionNumber) { - ObjectNode endpointConstants = objectMapper.createObjectNode(); - endpointConstants.set("initializationResponse", initializationResponse); - endpointConstants.put("partitionNumber", partitionNumber); - addOptimizationLevel(options,endpointConstants); - return endpointConstants; - } - - private OutputCaller.BulkOutputCaller buildOutputCaller(ObjectNode endpointConstants, JsonNode endpointParams) { - InputStreamHandle defaultApi = hubClient.getModulesClient().newJSONDocumentManager() - .read(endpointParams.get("apiPath").asText(), new InputStreamHandle()); - ObjectNode readEndpointState = (endpointParams.hasNonNull("endpointState"))? - (ObjectNode) endpointParams.get("endpointState") :objectMapper.createObjectNode().put("batchNumber", 1); - - ObjectNode readEndpointConstants = endpointParams.hasNonNull("endpointConstants")? - (ObjectNode) endpointParams.get("endpointConstants"):endpointConstants; - - OutputCaller outputCaller = OutputCaller.on(hubClient.getFinalClient(), defaultApi, new InputStreamHandle()); - - return outputCaller.bulkCaller(outputCaller.newCallContext() - .withEndpointConstants(new JacksonHandle(readEndpointConstants)) - .withEndpointState(new JacksonHandle(readEndpointState))); - } - - private void readNextBatchOfRows() { - this.rows = bulkOutputCaller.next(); - if (rows.length > 0) { - numberOfRowsRead += rows.length; - if (logger.isDebugEnabled()) { - logger.debug("Rows read so far: " + numberOfRowsRead); - } - rowIndex = 0; - } - } - - private ObjectNode addOptimizationLevel(Map options, ObjectNode endpointConstants){ - String optimizationlevel = options.get("optimizationlevel"); - if(StringUtils.isNotEmpty(optimizationlevel)) { - try { - int readOptimizationlevel = Integer.parseInt(optimizationlevel); - if(!(readOptimizationlevel == 0 || readOptimizationlevel == 1 || readOptimizationlevel == 2)) - throw new IllegalArgumentException("optimizationlevel needs to be 0,1 or 2"); - endpointConstants.put("optimizationlevel", readOptimizationlevel); - } catch(NumberFormatException ex) { - throw new IllegalArgumentException("optimizationlevel needs to be 0,1 or 2"); - } - } - return endpointConstants; - } -} diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/JsonRowParser.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/JsonRowParser.java deleted file mode 100644 index 53ed7c8b21..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/reader/JsonRowParser.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonParser; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.catalyst.json.CreateJacksonParser; -import org.apache.spark.sql.catalyst.json.JSONOptions; -import org.apache.spark.sql.catalyst.json.JacksonParser; -import org.apache.spark.sql.types.StructType; -import org.apache.spark.unsafe.types.UTF8String; -import scala.Function1; -import scala.Function2; -import scala.collection.Seq; -import scala.compat.java8.JFunction; - -/** - * Utility class for using Scala's JacksonParser to parse a string of JSON into an InternalRow. - */ -public class JsonRowParser { - - private final JacksonParser jacksonParser; - private final Function2 jsonParserCreator; - private final Function1 utf8StringCreator; - - public JsonRowParser(StructType sparkSchema) { - JSONOptions jsonOptions = new JSONOptions(new scala.collection.immutable.HashMap<>(), "", ""); - this.jacksonParser = new JacksonParser(sparkSchema, jsonOptions); - - // Uses https://github.com/scala/scala-java8-compat so that Java8 lambdas can be used to implement Scala's - // Function1 and Function2 interfaces - this.jsonParserCreator = JFunction.func((jsonFactory, someString) -> CreateJacksonParser.string(jsonFactory, someString)); - this.utf8StringCreator = JFunction.func((someString) -> UTF8String.fromString(someString)); - } - - public Seq parseJsonRow(String json) { - return this.jacksonParser.parse(json, this.jsonParserCreator, this.utf8StringCreator); - } -} diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/AtLeastOneWriteFailedMessage.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/AtLeastOneWriteFailedMessage.java deleted file mode 100644 index 8b5af28232..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/AtLeastOneWriteFailedMessage.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import org.apache.spark.sql.sources.v2.writer.WriterCommitMessage; - -/** - * Indicates that at least one write failed, which allows the DataSourceWriter to know whether the job finished with or - * without errors. - */ -public class AtLeastOneWriteFailedMessage implements WriterCommitMessage { -} diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataSourceWriter.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataSourceWriter.java deleted file mode 100644 index e7f527998c..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataSourceWriter.java +++ /dev/null @@ -1,304 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.marklogic.client.DatabaseClient; -import com.marklogic.client.document.DocumentManager; -import com.marklogic.client.ext.helper.LoggingObject; -import com.marklogic.client.ext.util.DefaultDocumentPermissionsParser; -import com.marklogic.client.io.DocumentMetadataHandle; -import com.marklogic.client.io.Format; -import com.marklogic.client.io.InputStreamHandle; -import com.marklogic.hub.HubClient; -import com.marklogic.hub.HubClientConfig; -import com.marklogic.hub.spark.dataservices.SparkService; -import com.marklogic.hub.spark.sql.sources.v2.ModuleWriter; -import com.marklogic.hub.spark.sql.sources.v2.Util; -import org.apache.commons.lang.StringUtils; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.sources.v2.writer.DataWriterFactory; -import org.apache.spark.sql.sources.v2.writer.WriterCommitMessage; -import org.apache.spark.sql.sources.v2.writer.streaming.StreamWriter; -import org.apache.spark.sql.types.StructType; -import org.springframework.core.io.ClassPathResource; - -import java.io.IOException; -import java.util.Map; -import java.util.stream.Stream; - -public class HubDataSourceWriter extends LoggingObject implements StreamWriter { - - private final Map options; - private final StructType sparkSchema; - private final boolean streaming; - private final HubClient hubClient; - private final HubClientConfig hubClientConfig; - private final JsonNode endpointParams; - private final String jobId; - private final ObjectMapper objectMapper; - private CustomWriteApiDefinitions customWriteApiDefinitions; - private ModuleWriter moduleWriter; - - public HubDataSourceWriter(Map options, StructType schema, Boolean streaming) { - this.options = options; - this.sparkSchema = schema; - this.streaming = streaming; - this.objectMapper = new ObjectMapper(); - this.hubClientConfig = Util.buildHubClientConfig(options); - this.hubClient = HubClient.withHubClientConfig(hubClientConfig); - this.moduleWriter = new ModuleWriter(hubClient, hubClientConfig); - verifyUserIsAuthorized(); - validateUriTemplateIfPresent(); - this.endpointParams = determineWriteRecordsEndpointParams(options); - - this.customWriteApiDefinitions = readCustomJobApiDefinitions(options); - if (customWriteApiDefinitions.getInitializeWriteApiDefinition() == null) { - loadInitializeModulesIfNotPresent(); - } - if (customWriteApiDefinitions.getFinalizeWriteApiDefinition() == null) { - loadFinalizeModulesIfNotPresent(); - } - - this.jobId = initializeWrite(schema); - addJobIdToEndpointConstants(); - } - - @Override - public DataWriterFactory createWriterFactory() { - return new HubDataWriterFactory(options, this.sparkSchema, endpointParams); - } - - @Override - public void commit(long epochId, WriterCommitMessage[] messages) { - commit(messages); - } - - @Override - public void abort(long epochId, WriterCommitMessage[] messages) { - abort(messages); - } - - @Override - public void commit(WriterCommitMessage[] messages) { - String status = atLeastOneWriteFailed(messages) ? "finished_with_errors" : "finished"; - finalizeWrite(status); - } - - @Override - public void abort(WriterCommitMessage[] messages) { - // Because an aborted job maps to a "canceled" DHF job, there's no use case yet for the messages - logger.error("Aborting job"); - finalizeWrite("canceled"); - } - - private boolean atLeastOneWriteFailed(WriterCommitMessage[] messages) { - if (messages != null) { - for (WriterCommitMessage message : messages) { - if (message instanceof AtLeastOneWriteFailedMessage) { - return true; - } - } - } - return false; - } - - /** - * Validate the URI template if present in the options. - * - * A valid URI template: - * - Has no missing opening or closing curly brackets. - * - Each token has >0 characters. - * - Has no nested curcly brackets. - */ - private void validateUriTemplateIfPresent() { - String uriTemplate = options.get("uritemplate"); - if ( uriTemplate == null ) { - return; - } - boolean inToken = false; - int tokenSize = 0; - char[] chars = uriTemplate.toCharArray(); - for ( char ch : chars ) { - if ( ch == '}' ) { - if ( !inToken ) { - throw new IllegalArgumentException(format("Invalid uritemplate: %s; closing brace found before opening brace", uriTemplate)); - } - if ( tokenSize == 0 ) { - throw new IllegalArgumentException(format("Invalid uritemplate: %s; no column name within opening and closing brace", uriTemplate)); - } - inToken = false; - } else if ( ch == '{' ) { - if ( inToken ) { - throw new IllegalArgumentException(format("Invalid uritemplate: %s; expected closing brace, but found opening brace", uriTemplate)); - } - inToken = true; - tokenSize = 0; - } else { - if (inToken) { - tokenSize++; - } - } - } - if ( inToken ) { - throw new IllegalArgumentException(format("Invalid uritemplate: %s; opening brace without closing brace", uriTemplate)); - } - } - - /** - * Note that this is only verifying that the user is able to authorized to connect to MarkLogic. A later call made - * by the connector to ML may fail because the call requires additional privileges that the user does not have. - */ - private void verifyUserIsAuthorized() { - DatabaseClient.ConnectionResult result = hubClient.getStagingClient().checkConnection(); - if (result.getStatusCode() == 401) { - throw new RuntimeException("User is unauthorized; " + - "please ensure you have the correct username and password for a MarkLogic user that has at least the data-hub-operator role"); - } - logger.info("Created HubClient for host: " + hubClient.getStagingClient().getHost()); - } - - private JsonNode determineWriteRecordsEndpointParams(Map options) { - ObjectNode endpointParams; - if (options.containsKey("writerecordsendpointparams")) { - try { - endpointParams = (ObjectNode) objectMapper.readTree(options.get("writerecordsendpointparams")); - } catch (IOException e) { - throw new IllegalArgumentException("Unable to parse writerecordsendpointparams, cause: " + e.getMessage(), e); - } - } else { - endpointParams = objectMapper.createObjectNode(); - } - - boolean doesNotHaveApiPath = (!endpointParams.hasNonNull("apiPath") || StringUtils.isEmpty(endpointParams.get("apiPath").asText())); - boolean hasEndpointConstantsOrEndpointState = endpointParams.hasNonNull("endpointConstants") || endpointParams.hasNonNull("endpointState"); - if (doesNotHaveApiPath && hasEndpointConstantsOrEndpointState) { - throw new IllegalArgumentException("Cannot set endpointConstants or endpointState in writerecordsendpointparams unless apiPath is defined as well."); - } - - // Always load writeLib, as a custom endpoint may need it - moduleWriter.loadModuleIfNotPresent("/marklogic-data-hub-spark-connector/writeLib.sjs", Format.TEXT); - - if (doesNotHaveApiPath) { - String apiPath = "/marklogic-data-hub-spark-connector/writeRecords.api"; - String scriptPath = "/marklogic-data-hub-spark-connector/writeRecords.sjs"; - moduleWriter.loadModuleIfNotPresent(scriptPath, Format.TEXT); - moduleWriter.loadModuleIfNotPresent(apiPath, Format.JSON); - - - endpointParams.put("apiPath", apiPath); - } - - if (!endpointParams.hasNonNull("endpointConstants")) { - ObjectNode endpointConstants = objectMapper.createObjectNode(); - applyOptionsToEndpointConstants(endpointConstants, options); - endpointParams.set("endpointConstants", endpointConstants); - } - - return endpointParams; - } - - /** - * Options that influence the default ingestion endpoint are copied to the endpoint constants object. - * - * @param endpointConstants - * @param options - */ - private void applyOptionsToEndpointConstants(ObjectNode endpointConstants, Map options) { - Stream.of("collections", "permissions", "sourcename", "sourcetype", "uriprefix","uritemplate").forEach(key -> { - if (options.containsKey(key)) { - endpointConstants.put(key, options.get(key)); - } - }); - } - - private String initializeWrite(StructType schema) { - ObjectNode externalMetadata = objectMapper.createObjectNode(); - try { - if (options.get("additionalexternalmetadata") != null) { - externalMetadata = (ObjectNode) objectMapper.readTree(options.get("additionalexternalmetadata")); - } - } catch (Exception e) { - throw new IllegalArgumentException("Unable to parse additionalExternalMetadata option as a JSON object; " + - "cause: " + e.getMessage(), e); - } - try { - externalMetadata.set("sparkSchema", objectMapper.readTree(schema.json())); - - } catch (Exception e) { - logger.warn("Unable to read Spark schema as a JSON object; cause: " + e.getMessage() + "; the schema will not " + - "be persisted on the job document"); - } - - String jobId = SparkService.on(hubClient.getJobsClient(), customWriteApiDefinitions.getInitializeWriteApiDefinition()).initializeWrite(externalMetadata); - logger.info("Initialized write; job ID: " + jobId); - return jobId; - } - - private CustomWriteApiDefinitions readCustomJobApiDefinitions(Map options) { - InputStreamHandle initializeDefinition = null; - String key = "initializewriteapipath"; - if (options.containsKey(key)) { - try { - initializeDefinition = hubClient.getModulesClient().newDocumentManager().read(options.get(key), new InputStreamHandle()); - } catch (Exception ex) { - throw new RuntimeException("Unable to read custom API module for initializing a job: " + options.get(key) + "; cause: " + ex.getMessage(), ex); - } - } - - InputStreamHandle finalizeDefinition = null; - key = "finalizewriteapipath"; - if (options.containsKey(key)) { - try { - finalizeDefinition = hubClient.getModulesClient().newDocumentManager().read(options.get(key), new InputStreamHandle()); - } catch (Exception ex) { - throw new RuntimeException("Unable to read custom API module for finalizing a job: " + options.get(key) + "; cause: " + ex.getMessage(), ex); - } - } - - return new CustomWriteApiDefinitions(initializeDefinition, finalizeDefinition); - } - - private void loadInitializeModulesIfNotPresent() { - moduleWriter.loadModuleIfNotPresent("/marklogic-data-hub-spark-connector/initializeWrite.sjs", Format.TEXT); - moduleWriter.loadModuleIfNotPresent("/marklogic-data-hub-spark-connector/initializeWrite.api", Format.JSON); - } - - private void loadFinalizeModulesIfNotPresent() { - moduleWriter.loadModuleIfNotPresent("/marklogic-data-hub-spark-connector/finalizeWrite.sjs", Format.TEXT); - moduleWriter.loadModuleIfNotPresent("/marklogic-data-hub-spark-connector/finalizeWrite.api", Format.JSON); - } - - private void addJobIdToEndpointConstants() { - if (endpointParams != null && endpointParams.has("endpointConstants")) { - JsonNode endpointConstants = endpointParams.get("endpointConstants"); - if (endpointConstants instanceof ObjectNode) { - ((ObjectNode) endpointConstants).put("jobId", this.jobId); - } - } - } - - private void finalizeWrite(String status) { - logger.info(format("Finalizing write; job ID: %s; status: %s", jobId, status)); - SparkService.on(hubClient.getJobsClient(), customWriteApiDefinitions.getFinalizeWriteApiDefinition()).finalizeWrite(jobId, status); - } -} - -class CustomWriteApiDefinitions { - - private InputStreamHandle initializeWriteApiDefinition; - private InputStreamHandle finalizeWriteApiDefinition; - - public CustomWriteApiDefinitions(InputStreamHandle initializeWriteApiDefinition, InputStreamHandle finalizeWriteApiDefinition) { - this.initializeWriteApiDefinition = initializeWriteApiDefinition; - this.finalizeWriteApiDefinition = finalizeWriteApiDefinition; - } - - public InputStreamHandle getInitializeWriteApiDefinition() { - return initializeWriteApiDefinition; - } - - public InputStreamHandle getFinalizeWriteApiDefinition() { - return finalizeWriteApiDefinition; - } -} diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataWriter.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataWriter.java deleted file mode 100644 index 66b226487c..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataWriter.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2021 MarkLogic Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.fasterxml.jackson.databind.JsonNode; -import com.marklogic.client.dataservices.IOEndpoint; -import com.marklogic.client.dataservices.InputCaller; -import com.marklogic.client.ext.helper.LoggingObject; -import com.marklogic.client.io.Format; -import com.marklogic.client.io.JacksonHandle; -import com.marklogic.client.io.StringHandle; -import com.marklogic.hub.HubClient; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.catalyst.json.JSONOptions; -import org.apache.spark.sql.catalyst.json.JacksonGenerator; -import org.apache.spark.sql.catalyst.util.DateTimeUtils; -import org.apache.spark.sql.sources.v2.writer.DataWriter; -import org.apache.spark.sql.sources.v2.writer.WriterCommitMessage; -import org.apache.spark.sql.types.StructType; - -import java.io.StringWriter; -import java.util.Map; - -public class HubDataWriter extends LoggingObject implements DataWriter { - - private InputCaller.BulkInputCaller bulkInputCaller; - private StructType sparkSchema; - - private Throwable writeException; - - /** - * @param hubClient - * @param schema - * @param options contains all the options provided by Spark, which will include all connector-specific properties - * @param endpointParams - */ - public HubDataWriter(HubClient hubClient, StructType schema, Map options, JsonNode endpointParams) { - this.sparkSchema = schema; - - final String apiPath = endpointParams.get("apiPath").asText(); - logger.info("Will write to endpoint defined by: " + apiPath); - InputCaller inputCaller = InputCaller.on( - hubClient.getStagingClient(), - hubClient.getModulesClient().newJSONDocumentManager().read(apiPath, new StringHandle()), - new StringHandle().withFormat(Format.JSON) - ); - - IOEndpoint.CallContext callContext = inputCaller.newCallContext(); - if (endpointParams.hasNonNull("endpointState")) { - callContext.withEndpointState(new JacksonHandle(endpointParams.get("endpointState"))); - } - if (endpointParams.hasNonNull("endpointConstants")) { - callContext.withEndpointConstants(new JacksonHandle(endpointParams.get("endpointConstants"))); - } - this.bulkInputCaller = inputCaller.bulkCaller(callContext); - configureErrorListenerOnBulkInputCaller(); - } - - @Override - public void write(InternalRow record) { - bulkInputCaller.accept(convertRowToJSONString(record)); - } - - @Override - public WriterCommitMessage commit() { - logger.info("Committing; awaiting completion of all writes"); - bulkInputCaller.awaitCompletion(); - if (writeException != null) { - logger.info("At least one write failed"); - return new AtLeastOneWriteFailedMessage(); - } - return null; - } - - /** - * The most likely reason for this to be called is due to an uncaught exception from the write() method. - */ - @Override - public void abort() { - logger.info("Abort called, so interrupting BulkInputCaller"); - try { - bulkInputCaller.interrupt(); - logger.info("Finished interrupting BulkInputCaller"); - } catch (Exception ex) { - logger.warn("Unexpected error while interrupting BulkInputCaller: " + ex.getMessage(), ex); - } - } - - private void configureErrorListenerOnBulkInputCaller() { - this.bulkInputCaller.setErrorListener((retryCount, throwable, callContext1, input) -> { - if (this.writeException == null) { - this.writeException = throwable; - } - logger.error("Skipping failed write; cause: " + throwable.getMessage()); - return IOEndpoint.BulkIOEndpointCaller.ErrorDisposition.SKIP_CALL; - }); - } - - private String convertRowToJSONString(InternalRow record) { - StringWriter jsonObjectWriter = new StringWriter(); - scala.collection.immutable.Map emptyMap = scala.collection.immutable.Map$.MODULE$.empty(); - JacksonGenerator jacksonGenerator = new JacksonGenerator( - sparkSchema, - jsonObjectWriter, - new JSONOptions(emptyMap, DateTimeUtils.TimeZoneUTC().getID(), "") - ); - jacksonGenerator.write(record); - jacksonGenerator.flush(); - return jsonObjectWriter.toString(); - } -} diff --git a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataWriterFactory.java b/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataWriterFactory.java deleted file mode 100644 index 592cd48d7e..0000000000 --- a/marklogic-data-hub-spark-connector/src/main/java/com/marklogic/hub/spark/sql/sources/v2/writer/HubDataWriterFactory.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2021 MarkLogic Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.fasterxml.jackson.databind.JsonNode; -import com.marklogic.client.ext.helper.LoggingObject; -import com.marklogic.hub.HubClient; -import com.marklogic.hub.spark.sql.sources.v2.DefaultSource; -import com.marklogic.hub.spark.sql.sources.v2.Util; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.sources.v2.writer.DataWriter; -import org.apache.spark.sql.sources.v2.writer.DataWriterFactory; -import org.apache.spark.sql.types.StructType; - -import java.util.Map; - -public class HubDataWriterFactory extends LoggingObject implements DataWriterFactory { - - private StructType sparkSchema; - private Map options; - private JsonNode endpointParams; - - /** - * @param options a map of options containing both DHF-supported properties (most likely prefixed with ml* or - * hub*) and connector-specific properties. The DHF-supported properties will be used to construct a - * HubClient for communicating with MarkLogic. - * @param schema - */ - public HubDataWriterFactory(Map options, StructType schema, JsonNode endpointParams) { - this.options = options; - this.sparkSchema = schema; - this.endpointParams = endpointParams; - } - - @Override - public DataWriter createDataWriter(int partitionId, long taskId, long epochId) { - HubClient client = HubClient.withHubClientConfig(Util.buildHubClientConfig(options)); - return new HubDataWriter(client, sparkSchema, options, endpointParams); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/AbstractSparkConnectorTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/AbstractSparkConnectorTest.java deleted file mode 100644 index aaff216a0a..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/AbstractSparkConnectorTest.java +++ /dev/null @@ -1,280 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2; - -import com.fasterxml.jackson.databind.JsonNode; -import com.marklogic.client.document.GenericDocumentManager; -import com.marklogic.client.io.DocumentMetadataHandle; -import com.marklogic.client.io.FileHandle; -import com.marklogic.client.io.Format; -import com.marklogic.hub.HubClient; -import com.marklogic.hub.HubClientConfig; -import com.marklogic.hub.MarkLogicVersion; -import com.marklogic.hub.impl.HubClientImpl; -import com.marklogic.hub.spark.sql.sources.v2.writer.HubDataSourceWriter; -import com.marklogic.hub.spark.sql.sources.v2.writer.HubDataWriter; -import com.marklogic.hub.test.AbstractHubClientTest; -import com.marklogic.mgmt.ManageConfig; -import org.apache.spark.sql.SaveMode; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.catalyst.expressions.GenericInternalRow; -import org.apache.spark.sql.sources.v2.DataSourceOptions; -import org.apache.spark.sql.sources.v2.writer.DataWriterFactory; -import org.apache.spark.sql.sources.v2.writer.WriterCommitMessage; -import org.apache.spark.sql.types.DataTypes; -import org.apache.spark.sql.types.Metadata; -import org.apache.spark.sql.types.StructField; -import org.apache.spark.sql.types.StructType; -import org.apache.spark.unsafe.types.UTF8String; -import org.junit.jupiter.api.BeforeEach; -import org.springframework.core.io.ClassPathResource; - -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Base class for all connector tests. - */ -public abstract class AbstractSparkConnectorTest extends AbstractHubClientTest { - - protected final static StructType FRUIT_SCHEMA = new StructType(new StructField[]{ - new StructField("fruitName", DataTypes.StringType, true, Metadata.empty()), - new StructField("fruitColor", DataTypes.StringType, true, Metadata.empty()), - }); - - protected final static String CUSTOM_INGESTION_API_PATH = "/custom-ingestion-endpoint/endpoint.api"; - protected final static String CUSTOM_INGESTION_ENDPOINT_PATH = "/custom-ingestion-endpoint/endpoint.sjs"; - - protected HubDataWriter hubDataWriter; - protected HubDataSourceWriter dataSourceWriter; - private HubClientConfig hubClientConfig; - private HubClient hubClient; - private Properties testProperties; - - /** - * Reset the databases, then run every test by default as a data-hub-operator. Ernie the ETL engineer will typically - * have this role. - */ - @BeforeEach - void beforeEachTest() { - hubClientConfig = new HubClientConfig(); - resetDatabases(); - runAsDataHubOperator(); - } - - @Override - protected HubClient getHubClient() { - if (hubClient == null) { - hubClient = new HubClientImpl(hubClientConfig); - } - return hubClient; - } - - @Override - protected HubClient doRunAsUser(String username, String password) { - testProperties = new Properties(); - String mlHost = "localhost"; - String hubDhs = "false"; - boolean isDhs = false; - //Can override if we want to run tests on DHS - if (System.getProperty("mlHost") != null) { - mlHost = System.getProperty("mlHost"); - } - if (System.getProperty("isDhs") != null) { - isDhs = Boolean.parseBoolean(System.getProperty("isDhs")); - } - if (isDhs) { - hubDhs = "true"; - } - testProperties.setProperty("mlHost", mlHost); - testProperties.setProperty("mlUsername", username); - testProperties.setProperty("mlPassword", password); - testProperties.setProperty("hubDhs", hubDhs); - hubClient = new HubClientImpl(new HubClientConfig(testProperties)); - return hubClient; - } - - @Override - protected void doRunWithHubClient(HubClient hubClient) { - this.hubClient = hubClient; - testProperties = new Properties(); - String mlHost = "localhost"; - String hubDhs = "false"; - boolean isDhs = false; - //Can override if we want to run tests on DHS - if (System.getProperty("mlHost") != null) { - mlHost = System.getProperty("mlHost"); - } - if (System.getProperty("isDhs") != null) { - isDhs = Boolean.parseBoolean(System.getProperty("isDhs")); - } - if (isDhs) { - hubDhs = "true"; - } - ManageConfig manageConfig = hubClient.getManageClient().getManageConfig(); - testProperties.setProperty("mlHost", mlHost); - testProperties.setProperty("mlUsername", manageConfig.getUsername()); - testProperties.setProperty("mlPassword", manageConfig.getPassword()); - testProperties.setProperty("hubDhs", hubDhs); - } - - /** - * Convert the set of properties used to initialize HubConfigImpl into a map of parameters that can be easil reused - * with our Spark classes. - * - * @return - */ - protected Map getHubPropertiesAsMap() { - Map params = new HashMap<>(); - testProperties.keySet().forEach(key -> params.put((String) key, testProperties.getProperty((String) key))); - return params; - } - - protected Options newOptions() { - return new Options(getHubPropertiesAsMap()); - } - - /** - * @return a default set of fruit-specific options to simplify writing tests - */ - protected Options newFruitOptions() { - return newOptions().withCollections("fruits"); - } - - /** - * @return all the URIs of docs in the 'fruits' collection, which assumes usage of newFruitOptions - */ - protected String[] getFruitUris() { - return getHubClient().getStagingClient().newServerEval() - .javascript("cts.uris(null, null, cts.collectionQuery('fruits'))") - .evalAs(String.class).split("\n"); - } - - protected int getFruitCount() { - return Integer.parseInt(getHubClient().getStagingClient().newServerEval() - .javascript("cts.estimate(cts.collectionQuery('fruits'))") - .evalAs(String.class)); - } - - /** - * @return Document Metadata - */ - protected DocumentMetadataHandle getFirstFruitMetadata() { - String[] uris = getFruitUris(); - assertTrue(uris.length > 0, "Expected at least one fruit URI, found zero"); - return getHubClient().getStagingClient().newDocumentManager().readMetadata(uris[0], new DocumentMetadataHandle()); - } - - /** - * Convenience method for building a DataWriter based on our Options convenience class. - * - * @param options - */ - protected void initializeDataWriter(Options options) { - initializeDataWriter(options.toDataSourceOptions()); - } - - /** - * Spark will do all of this in the real world - i.e. a user will specify the entry class and the set of options. - * But in a test, we need to do that ourselves. So we create the DataSource class, build up the params, and then - * call the factory/writer methods ourselves. - * - * @param dataSourceOptions - */ - protected void initializeDataWriter(DataSourceOptions dataSourceOptions) { - initializeDataSourceWriter(dataSourceOptions); - - DataWriterFactory dataWriterFactory = dataSourceWriter.createWriterFactory(); - - final int partitionIdDoesntMatter = 0; - final long taskId = 2; - final int epochIdDoesntMatter = 0; - this.hubDataWriter = (HubDataWriter)dataWriterFactory.createDataWriter(partitionIdDoesntMatter, taskId, epochIdDoesntMatter); - } - - protected void initializeDataSourceWriter(DataSourceOptions dataSourceOptions) { - DefaultSource dataSource = new DefaultSource(); - final String writeUUID = "doesntMatter"; - final SaveMode saveModeDoesntMatter = SaveMode.Overwrite; - this.dataSourceWriter = (HubDataSourceWriter)dataSource.createWriter(writeUUID, FRUIT_SCHEMA, saveModeDoesntMatter, dataSourceOptions).get(); - } - - /** - * @param values - * @return a row that can be ingested via HubDataWriter for testing purposes - */ - protected GenericInternalRow buildRow(String... values) { - Object[] rowValues = new Object[values.length]; - for (int i = 0; i < values.length; i++) { - rowValues[i] = UTF8String.fromString(values[i]); - } - return new GenericInternalRow(rowValues); - } - - protected WriterCommitMessage writeRows(GenericInternalRow... rows) { - Arrays.stream(rows).forEach(row -> hubDataWriter.write(row)); - return hubDataWriter.commit(); - } - - protected WriterCommitMessage writeRowsAndCommitWithSourceWriter(GenericInternalRow... rows) { - WriterCommitMessage message = writeRows(rows); - dataSourceWriter.commit(new WriterCommitMessage[]{message}); - return message; - } - - /** - * Tests that need a custom ingestion endpoint can make use of this. - */ - protected void installCustomIngestionEndpoint() { - installCustomEndpoint("custom-ingestion-endpoint/endpoint.api", "custom-ingestion-endpoint/endpoint.sjs"); - } - - protected void installCustomEndpoint(String apiPath, String sjsPath) { - GenericDocumentManager mgr = getHubClient().getModulesClient().newDocumentManager(); - DocumentMetadataHandle metadata = new DocumentMetadataHandle() - .withPermission("data-hub-operator", DocumentMetadataHandle.Capability.READ, DocumentMetadataHandle.Capability.UPDATE, DocumentMetadataHandle.Capability.EXECUTE); - - try { - mgr.write("/" + apiPath, metadata, new FileHandle(new ClassPathResource(apiPath).getFile()).withFormat(Format.JSON)); - mgr.write("/" + sjsPath, metadata, new FileHandle(new ClassPathResource(sjsPath).getFile()).withFormat(Format.TEXT)); - } catch (IOException ex) { - throw new RuntimeException(ex); - } - } - - /** - * Use then you know there's only a single job document. - * - * @return - */ - protected JsonNode getJobDocument() { - return getHubClient().getJobsClient().newServerEval() - .javascript("fn.head(cts.search(cts.collectionQuery('Job')))") - .evalAs(JsonNode.class); - } - - /** - * Convenience method for getting the status when you know there's only one job document. - * - * @return - */ - protected String getJobDocumentStatus() { - JsonNode job = getJobDocument(); - assertTrue(job.has("job")); - assertTrue(job.get("job").has("jobStatus")); - return job.get("job").get("jobStatus").asText(); - } - - protected boolean canUpdateJobDoc(){ - MarkLogicVersion version = new MarkLogicVersion(getHubClient().getManageClient()); - return version.getMajor().equals(9) ? false : true; - } - - protected void verifyJobDocumentWasNotUpdated(String status){ - assertEquals("started", status, "Status will remain 'started' as calling amped sjs function fails in 9.0-x server"); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/BuildHubClientConfigTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/BuildHubClientConfigTest.java deleted file mode 100644 index 239124db26..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/BuildHubClientConfigTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2; - -import com.marklogic.hub.HubClientConfig; -import org.junit.jupiter.api.Test; - -import java.util.HashMap; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.*; - -public class BuildHubClientConfigTest { - - private Map options = new HashMap<>(); - - @Test - void defaults() { - HubClientConfig config = Util.buildHubClientConfig(options); - verifyAuth(config, "basic", "Should default to basic auth for DHS usage"); - - final String sslMessage = "Should default to SSL for DHS usage"; - assertNotNull(config.getStagingSslContext(), sslMessage); - assertNotNull(config.getStagingSslHostnameVerifier(), sslMessage); - assertNotNull(config.getStagingTrustManager(), sslMessage); - assertNotNull(config.getFinalSslContext(), sslMessage); - assertNotNull(config.getFinalSslHostnameVerifier(), sslMessage); - assertNotNull(config.getFinalTrustManager(), sslMessage); - assertNotNull(config.getJobSslContext(), sslMessage); - assertNotNull(config.getJobSslHostnameVerifier(), sslMessage); - assertNotNull(config.getJobTrustManager(), sslMessage); - } - - /** - * Note that we don't need to test hubDhs/hubSsl, nor can we test those, as Spark will always lowercase everything - * that is in the options map. - */ - @Test - void digestAndNoSsl() { - options.put("hubdhs", "false"); - options.put("hubssl", "false"); - - HubClientConfig config = Util.buildHubClientConfig(options); - verifyAuth(config, "digest", "Should default to digest since hubDhs is false"); - - final String sslMessage = "Should default to no SSL when hubSsl is false"; - assertNull(config.getStagingSslContext(), sslMessage); - assertNull(config.getStagingSslHostnameVerifier(), sslMessage); - assertNull(config.getStagingTrustManager(), sslMessage); - assertNull(config.getFinalSslContext(), sslMessage); - assertNull(config.getFinalSslHostnameVerifier(), sslMessage); - assertNull(config.getFinalTrustManager(), sslMessage); - assertNull(config.getJobSslContext(), sslMessage); - assertNull(config.getJobSslHostnameVerifier(), sslMessage); - assertNull(config.getJobTrustManager(), sslMessage); - } - - private void verifyAuth(HubClientConfig config, String auth, String message) { - assertEquals(auth, config.getFinalAuthMethod(), message); - assertEquals(auth, config.getJobAuthMethod(), message); - assertEquals(auth, config.getStagingAuthMethod(), message); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/Options.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/Options.java deleted file mode 100644 index 06b1ee9d8c..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/Options.java +++ /dev/null @@ -1,246 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import org.apache.spark.sql.sources.v2.DataSourceOptions; - -import java.util.HashMap; -import java.util.Map; - -/** - * Test class for encapsulating all the options that can be passed to our connector. Provides a simple interface for - * setting each option and then producing a DataSourceOptions from this class. - */ -public class Options { - - // All connector-specific options - private String uriTemplate; - private String uriPrefix; - private String collections; - private String permissions; - private String sourceName; - private String sourceType; - private ObjectNode writerecordsendpointparams; - private String initializeWriteApiPath; - private String finalizeWriteApiPath; - private JsonNode additionalExternalMetadata; - private String initializeReadApiPath; - private String optimizationlevel; - - // Can contain any DHF properties - e.g. mlHost, mlUsername, etc - private Map hubProperties; - - // Not an option, but rather used for testing an invalid JSON object - private String additionalExternalMetadataAsString; - - // Read options - private String view; - private String schema; - private String sqlCondition; - private String selectedColumns; - private String serializedPlan; - private String sparkSchema; - private ObjectNode readrowsendpointparams; - - // Has a default value so that tests don't depend on a Spark cluster running to determine minDefaultPartitions - private String numPartitions = "2"; - - public Options() { - } - - public Options(Map hubProperties) { - this.hubProperties = hubProperties; - } - - public DataSourceOptions toDataSourceOptions() { - Map params = new HashMap<>(); - if (hubProperties != null) { - params.putAll(hubProperties); - } - if (uriTemplate != null) { - params.put("uritemplate", uriTemplate); - } - - if (uriPrefix != null) { - params.put("uriprefix", uriPrefix); - } - - if (collections != null) { - params.put("collections", collections); - } - - if (permissions != null) { - params.put("permissions", permissions); - } - - if (sourceName != null) { - params.put("sourceName", sourceName); - } - - if (sourceType != null) { - params.put("sourceType", sourceType); - } - - if(writerecordsendpointparams != null) { - params.put("writerecordsendpointparams", writerecordsendpointparams.toString()); - } - - if (initializeWriteApiPath != null) { - params.put("initializewriteapipath", initializeWriteApiPath); - } - if (finalizeWriteApiPath != null) { - params.put("finalizewriteapipath", finalizeWriteApiPath); - } - - if (additionalExternalMetadata != null) { - params.put("additionalexternalmetadata", additionalExternalMetadata.toString()); - } - if (additionalExternalMetadataAsString != null) { - params.put("additionalexternalmetadata", additionalExternalMetadataAsString); - } - - if (view != null) { - params.put("view", view); - } - if (schema != null) { - params.put("schema", schema); - } - if (sqlCondition != null) { - params.put("sqlcondition", sqlCondition); - } - if (serializedPlan != null) { - params.put("serializedplan", serializedPlan); - } - if (selectedColumns != null) { - params.put("selectedcolumns", selectedColumns); - } - if (sparkSchema != null) { - params.put("sparkschema", sparkSchema); - } - if(initializeReadApiPath != null) { - params.put("initializereadapipath", initializeReadApiPath); - } - - if(readrowsendpointparams !=null) { - params.put("readrowsendpointparams", readrowsendpointparams.toString()); - } - - if(optimizationlevel !=null){ - params.put("optimizationlevel", optimizationlevel); - } - - params.put("numpartitions", numPartitions); - - return new DataSourceOptions(params); - } - - public Options withUriTemplate(String uriTemplate) { - this.uriTemplate = uriTemplate; - return this; - } - - public Options withUriPrefix(String uriPrefix) { - this.uriPrefix = uriPrefix; - return this; - } - - public Options withCollections(String collections) { - this.collections = collections; - return this; - } - - public Options withPermissions(String permissions) { - this.permissions = permissions; - return this; - } - - public Options withSourceName(String sourceName) { - this.sourceName = sourceName; - return this; - } - - public Options withSourceType(String sourceType) { - this.sourceType = sourceType; - return this; - } - - public Options withInitializeWriteApiPath(String initializeWriteApiPath) { - this.initializeWriteApiPath = initializeWriteApiPath; - return this; - } - - public Options withFinalizeWriteApiPath(String finalizeWriteApiPath) { - this.finalizeWriteApiPath = finalizeWriteApiPath; - return this; - } - - public Options withAdditionalExternalMetadata(JsonNode additionalExternalMetadata) { - this.additionalExternalMetadata = additionalExternalMetadata; - return this; - } - - public Options withAdditionalExternalMetadataAsString(String additionalExternalMetadataAsString) { - this.additionalExternalMetadataAsString = additionalExternalMetadataAsString; - return this; - } - - public Options withView(String view) { - this.view = view; - return this; - } - - public Options withSchema(String schema) { - this.schema = schema; - return this; - } - - public Options withSqlCondition(String sqlCondition) { - this.sqlCondition = sqlCondition; - return this; - } - - public Options withSerializedPlan(String serializedPlan) { - this.serializedPlan = serializedPlan; - return this; - } - - public Options withSelectedColumns(String columns) { - this.selectedColumns = columns; - return this; - } - - public Options withNumPartitions(String numPartitions) { - this.numPartitions = numPartitions; - return this; - } - - public Options withSparkSchema(String sparkSchema) { - this.sparkSchema = sparkSchema; - return this; - } - - public Options withInitializeReadApiPath(String initializeReadApiPath) { - this.initializeReadApiPath = initializeReadApiPath; - return this; - } - - public Options withReadRowsEndpointparams(ObjectNode readrowsendpointparams) { - this.readrowsendpointparams = readrowsendpointparams; - return this; - } - - public Options withWriteRecordsEndpointparams(ObjectNode writerecordsendpointparams) { - this.writerecordsendpointparams = writerecordsendpointparams; - return this; - } - - public Options withStringOptimizationlevel(String optimizationlevel) { - this.optimizationlevel = optimizationlevel; - return this; - } - - public Options withIntegerOptimizationlevel(int optimizationlevel) { - this.optimizationlevel = String.valueOf(optimizationlevel); - return this; - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/AbstractSparkReadTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/AbstractSparkReadTest.java deleted file mode 100644 index 8a327e9759..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/AbstractSparkReadTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.marklogic.client.io.DocumentMetadataHandle; -import com.marklogic.client.io.Format; -import com.marklogic.client.io.StringHandle; -import com.marklogic.hub.MarkLogicVersion; -import com.marklogic.hub.spark.sql.sources.v2.AbstractSparkConnectorTest; -import com.marklogic.hub.spark.sql.sources.v2.Options; -import com.marklogic.hub.test.Customer; -import com.marklogic.hub.test.ReferenceModelProject; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.sources.v2.reader.InputPartition; -import org.apache.spark.sql.sources.v2.reader.InputPartitionReader; -import org.apache.spark.sql.types.DataTypes; -import org.junit.jupiter.api.Assumptions; -import org.junit.jupiter.api.BeforeEach; -import org.springframework.util.FileCopyUtils; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -abstract class AbstractSparkReadTest extends AbstractSparkConnectorTest { - - @BeforeEach - void verifyMarkLogicSupportsRowID() { - MarkLogicVersion version = new MarkLogicVersion(getHubClient().getManageClient()); - Assumptions.assumeTrue(version.getMajor() >= 10 && - (version.isNightly() || version.getMinor() >= 500), - "The Read capability depends on rowID support in Optic, which was added to ML in 10.0-5; version: " - ); - } - - protected void setupTenSimpleCustomers() { - runAsDataHubDeveloper(); - loadSimpleCustomerTDE(); - - runAsDataHubOperator(); - loadTenSimpleCustomers(); - } - - // TODO Will soon have a nice convenience method for doing this - protected void loadTDE(String name) { - String template; - try { - template = new String(FileCopyUtils.copyToByteArray(readInputStreamFromClasspath("tde-views/" + name + ".tdex")), StandardCharsets.UTF_8); - } catch (IOException ex) { - throw new RuntimeException(ex); - } - String query = "declareUpdate(); var tde = require('/MarkLogic/tde.xqy'); var template; " + - "tde.templateInsert('/tde/" + name + "-0.0.1.tdex', template, " + - "[xdmp.permission('data-hub-operator', 'read'), xdmp.permission('data-hub-operator', 'update')]);"; - getHubClient().getFinalClient().newServerEval() - .javascript(query).addVariable("template", new StringHandle(template).withFormat(Format.XML)).evalAs(String.class); - } - - protected void loadSimpleCustomerTDE(){ - loadTDE("Customer"); - } - - protected void loadTenSimpleCustomers() { - loadSimpleCustomers(10); - } - - protected void loadSimpleCustomers(int count) { - ReferenceModelProject project = new ReferenceModelProject(getHubClient()); - - // Gotta use data-hub-operator so that these tests can pass on 5.2.x - project.setCustomerDocumentMetadata(new DocumentMetadataHandle() - .withCollections(ReferenceModelProject.CUSTOMER_ENTITY_TYPE) - .withPermission("data-hub-operator", DocumentMetadataHandle.Capability.READ, DocumentMetadataHandle.Capability.UPDATE)); - - for (int i = 0; i < count; i++) { - Customer c = new Customer(i, "Customer" + i); - c.setCustomerSince("2020-01-1" + i); - project.createCustomerInstance(c); - } - } - - protected List readRows(Options options) { - // Uses a single partition count for reliable ordering of results when an orderBy is used - HubDataSourceReader dataSourceReader = new HubDataSourceReader(options.withNumPartitions("1").toDataSourceOptions()); - return readRows(dataSourceReader); - } - - protected List readRows(HubDataSourceReader dataSourceReader) { - List rows = new ArrayList<>(); - - List> inputPartitions = dataSourceReader.planInputPartitions(); - - for (InputPartition inputPartition : inputPartitions) { - try (InputPartitionReader reader = inputPartition.createPartitionReader()) { - while (reader.next()) { - rows.add(reader.get()); - } - } catch (IOException ex) { - throw new RuntimeException(ex); - } - } - - return rows; - } - - /** - * Can be used to verify customer rows loaded via loadTenSimpleCustomers. - * - * @param rows - */ - protected void verifySimpleCustomerRows(List rows) { - final int firstDateValueAsInt = 18271; - for (InternalRow row : rows) { - int customerId = row.getInt(0); - assertEquals("Customer" + customerId, row.getString(1)); - assertEquals(firstDateValueAsInt + customerId, row.get(2, DataTypes.DateType), - "2020-01-10 as a java.sql.Date is 18271, so the value of 'customerSince' is expected to be relative to that"); - } - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ParseJsonRowTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ParseJsonRowTest.java deleted file mode 100644 index b8a6554a05..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ParseJsonRowTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.types.DataTypes; -import org.apache.spark.sql.types.Metadata; -import org.apache.spark.sql.types.StructField; -import org.apache.spark.sql.types.StructType; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class ParseJsonRowTest { - - /** - * Verifies that the RowJsonParser class is correctly using Scala's JacksonParser class outside the context of - * reading Optic rows. - */ - @Test - void test() { - Metadata metadata = new Metadata(); - StructType sparkSchema = new StructType(new StructField[]{ - new StructField("customerId", DataTypes.IntegerType, false, metadata), - new StructField("myStrings", DataTypes.createArrayType(DataTypes.StringType), true, metadata) - }); - - String json = "{ \"customerId\": 123, \"myStrings\": [\"hello\", \"world\"] }"; - - InternalRow row = new JsonRowParser(sparkSchema).parseJsonRow(json).head(); - - assertEquals(123, row.getInt(0)); - List strings = Arrays.asList(row.getArray(1).toObjectArray(DataTypes.StringType)); - assertEquals(2, strings.size()); - assertEquals("hello", strings.get(0).toString()); - assertEquals("world", strings.get(1).toString()); - } - -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadAllDataTypesTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadAllDataTypesTest.java deleted file mode 100644 index 7c4c42830d..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadAllDataTypesTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.marklogic.client.io.DocumentMetadataHandle; -import com.marklogic.client.io.Format; -import com.marklogic.client.io.InputStreamHandle; -import com.marklogic.hub.MarkLogicVersion; -import com.marklogic.hub.spark.sql.sources.v2.Options; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.types.DataTypes; -import org.junit.jupiter.api.Test; - -import java.text.SimpleDateFormat; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class ReadAllDataTypesTest extends AbstractSparkReadTest { - - @Test - void readAllDataTypes() throws Exception { - runAsDataHubDeveloper(); - loadTDE("User"); - runAsDataHubOperator(); - writeSingleUserToFinal(); - Options options = newOptions().withView("User").withNumPartitions("2"); - HubDataSourceReader dataSourceReader = new HubDataSourceReader(options.toDataSourceOptions()); - List rows = readRows(dataSourceReader); - assertEquals(1, rows.size()); - InternalRow row = rows.get(0); - - //The comment in the assertions will have the datatype of the property in TDE template - assertEquals(1, row.getInt(0), "integer"); - assertEquals(1, row.getInt(1), "int"); - assertEquals(Byte.decode("1"), row.getByte(2), "byte"); - assertEquals(1, row.getInt(3), "positiveInteger"); - assertEquals(1, row.getInt(4), "nonNegativeInteger"); - assertEquals(1L, row.getLong(5), "long"); - assertEquals(1L, row.getLong(6), "unsignedLong"); - assertEquals(1L, row.getLong(7), "unsignedInt"); - assertEquals(Short.decode("1"), row.getShort(8), "short"); - assertEquals(Short.decode("1"), row.getShort(9), "unsignedByte"); - assertEquals(Short.decode("1"), row.getShort(10), "unsignedShort"); - assertEquals("John", row.getString(11), "string"); - assertEquals(6218, row.get(12, DataTypes.DateType), "date; Spark accepts java.sql.Date." + - "1987-01-10 translates to 6218"); - - final String expectedDateTimeOfBirth = "1987-01-10T12:13:14-00:00"; - final long dateTimeAsNanoseconds = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX").parse(expectedDateTimeOfBirth).getTime() * 1000; - assertEquals(dateTimeAsNanoseconds, row.get(13, DataTypes.LongType), "For a timestamp, the Scala JacksonParser will " + - "return a long value in nanoseconds corresponding to the given timestamp; "); - - assertEquals("20:12:38", row.getString(14), "time"); - assertEquals("/John/IRI", row.getString(15), "IRI"); - assertEquals("/John/IRI", row.getString(16), "anyURI"); - assertEquals(true, row.getBoolean(17), "boolean"); - assertEquals(-10, row.getInt(18), "negativeInteger"); - assertEquals(-10, row.getInt(19), "nonPositiveInteger"); - assertEquals(30.5f, row.getFloat(20), "float"); - assertEquals(30.5d, row.getDouble(21), "double"); - assertEquals(30.5d, row.getDouble(22), "decimal"); - assertEquals("1987-01", row.getString(23), "gYearMonth"); - assertEquals("1987+02:00", row.getString(24), "gYear"); - assertEquals("--01+02:00", row.getString(25), "gMonth"); - assertEquals("---10", row.getString(26), "gDay"); - assertEquals("--01-10", row.getString(27), "gMonthDay"); - assertEquals("P1M", row.getString(28), "duration"); - assertEquals("P1M", row.getString(29), "yearMonthDuration"); - assertEquals("P30DT1H", row.getString(30), "dayTimeDuration"); - assertTrue("POINT(-122.07858 37.389965)".equals(row.getString(31)) || "37.389965,-122.07858".equals(row.getString(31)) , "point"); - assertTrue("POINT(-122.07858 37.389965)".equals(row.getString(32)) || "37.389965,-122.07858".equals(row.getString(32)) , "longLatPoint"); - - - assertEquals("Dum spiro spero", new String(row.getBinary(33), "UTF-8"), "The Scala JacksonParser is able to " + - "convert the value of mottoBase64 into a byte array, so we can build a String with it and assert " + - "against the original value of that base64Binary value"); - assertEquals("44756D20737069726F20737065726F", row.getString(34), "The Scala " + - "JacksonParser is not able to convert hexBinary values into a byte array, so the original value is " + - "returned as a string"); - } - - private void writeSingleUserToFinal() { - InputStreamHandle handle = new InputStreamHandle(readInputStreamFromClasspath("entityInstances/User/user1.json")); - handle.withFormat(Format.JSON); - getHubClient().getFinalClient().newJSONDocumentManager().write("/doc1.json", new DocumentMetadataHandle() - .withCollections("User") - .withPermission("data-hub-operator", DocumentMetadataHandle.Capability.READ, DocumentMetadataHandle.Capability.UPDATE), - handle); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadArraysAndMapsTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadArraysAndMapsTest.java deleted file mode 100644 index 9bfc2e4ce5..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadArraysAndMapsTest.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.marklogic.hub.MarkLogicVersion; -import com.marklogic.hub.spark.sql.sources.v2.Options; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.catalyst.util.ArrayData; -import org.apache.spark.sql.catalyst.util.MapData; -import org.apache.spark.sql.types.DataTypes; -import org.apache.spark.sql.types.Metadata; -import org.apache.spark.sql.types.StructField; -import org.apache.spark.sql.types.StructType; -import org.junit.jupiter.api.Assumptions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.OS; -import scala.collection.immutable.HashMap; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -public class ReadArraysAndMapsTest extends AbstractSparkReadTest { - - // When building a Spark schema to be used, a Metadata object is needed; an empty one suffices for these tests - private Metadata emptySchemaMetadata = new Metadata(new HashMap<>()); - - @BeforeEach - void setup() { - runAsDataHubDeveloper(); - loadSimpleCustomerTDE(); - runAsDataHubOperator(); - } - - @Test - void arrayOfStrings() { - MarkLogicVersion version = new MarkLogicVersion(getHubClient().getManageClient()); - assumeTrue(OS.LINUX.isCurrentOs() || (version.getMajor() >= 10 && - version.isNightly()), "Running this test on Windows and mac used to result in SEGFAULT when trying to get" + - " partition's row count. The server bug https://bugtrack.marklogic.com/55743 is fixed so the test should run" + - " fine on any version > 10.0-5 on Linux and on 10.0-nightly in other platforms."); - loadSimpleCustomers(1); - - StructType sparkSchema = new StructType(new StructField[]{ - new StructField("customerId", DataTypes.IntegerType, false, emptySchemaMetadata), - new StructField("myStrings", DataTypes.createArrayType(DataTypes.StringType), true, emptySchemaMetadata) - }); - - Options options = newOptions() - .withSerializedPlan(buildPlanForArrayOfStrings()) - .withSparkSchema(sparkSchema.json()); - - List rows = readRows(options); - assertEquals(1, rows.size()); - assertEquals(0, rows.get(0).getInt(0)); - Object[] strings = rows.get(0).getArray(1).toObjectArray(DataTypes.StringType); - assertEquals("hello", strings[0].toString(), "The type of the string is a UTF8String, so need to call " + - "toString on it to get the actual value"); - assertEquals("Customer0", strings[1].toString()); - } - - @Test - void mapOfIntegers() { - loadSimpleCustomers(2); - - StructType sparkSchema = new StructType(new StructField[]{ - new StructField("myObject", DataTypes.createMapType(DataTypes.StringType, DataTypes.IntegerType), true, emptySchemaMetadata) - }); - - Options options = newOptions() - .withSerializedPlan(buildPlanForObjectOfStringsAndIntegers()) - .withSparkSchema(sparkSchema.json()); - - List rows = readRows(options); - assertEquals(1, rows.size(), "Expecting a single row containing myObject"); - MapData mapData = rows.get(0).getMap(0); - Object[] keys = mapData.keyArray().toObjectArray(DataTypes.StringType); - assertEquals("customerIdCount", keys[0].toString()); - assertEquals("otherCustomerIdCount", keys[1].toString()); - Object[] values = mapData.valueArray().toObjectArray(DataTypes.IntegerType); - assertEquals(2, values[0]); - assertEquals(2, values[1]); - } - - @Test - void arrayOfObjects() { - loadSimpleCustomers(3); - - StructType sparkSchema = new StructType(new StructField[]{ - new StructField("customerId", DataTypes.IntegerType, false, emptySchemaMetadata), - new StructField("myArrayOfObjects", DataTypes.createArrayType( - DataTypes.createMapType(DataTypes.StringType, DataTypes.StringType) - ), true, emptySchemaMetadata) - }); - - Options options = newOptions() - .withSerializedPlan(buildPlanForArrayOfObjects()) - .withSparkSchema(sparkSchema.json()); - - List rows = readRows(options); - assertEquals(3, rows.size(), "Expecting one row for each customer since customerId is one of the columns being selected"); - - for (InternalRow row : rows) { - ArrayData array = row.getArray(1); - MapData mapData = array.getMap(0); - Object[] keys = mapData.keyArray().toObjectArray(DataTypes.StringType); - assertEquals("hello", keys[0].toString()); - assertEquals("and", keys[1].toString()); - Object[] values = mapData.valueArray().toObjectArray(DataTypes.StringType); - assertEquals("world", values[0].toString()); - assertEquals("hello again", values[1].toString()); - } - - } - - private String buildPlanForArrayOfStrings() { - return exportQueryToPlan("const op = require('/MarkLogic/optic');\n" + - "op.fromView(null, 'Customer', '')\n" + - " .select(['customerId', \n" + - " op.as('myStrings', op.jsonArray([\n" + - " op.jsonString('hello'),\n" + - " op.col('name')\n" + - " ]))\n" + - " ])\n" + - " .export()"); - } - - private String buildPlanForObjectOfStringsAndIntegers() { - return exportQueryToPlan("const op = require('/MarkLogic/optic');\n" + - "op.fromView(null, 'Customer', '')\n" + - " .groupBy(null, op.count('customerIdCount'))\n" + - " .select([\n" + - " op.as('myObject', op.jsonObject([\n" + - " op.prop('customerIdCount', op.col('customerIdCount')),\n" + - " op.prop('otherCustomerIdCount', op.col('customerIdCount'))\n" + - " ]))\n" + - " ])\n" + - " .export()"); - } - - - private String buildPlanForArrayOfObjects() { - return exportQueryToPlan("const op = require('/MarkLogic/optic');\n" + - "op.fromView(null, 'Customer', '')\n" + - " .groupBy('customerId', op.count('customerIdCount'))\n" + - " .select(['customerId',\n" + - " op.as('myArrayOfObjects', op.jsonArray([\n" + - " op.jsonObject([\n" + - " op.prop('hello', 'world'),\n" + - " op.prop('and', 'hello again'),\n" + - " ])\n" + - " ]))\n" + - " ])\n" + - " .export()"); - } - - private String exportQueryToPlan(String query) { - return getHubClient().getFinalClient().newServerEval().javascript(query).evalAs(String.class); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadModulesWrittenToModulesDatabaseTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadModulesWrittenToModulesDatabaseTest.java deleted file mode 100644 index 2281540013..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadModulesWrittenToModulesDatabaseTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.marklogic.client.document.DocumentManager; -import com.marklogic.client.io.StringHandle; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -public class ReadModulesWrittenToModulesDatabaseTest extends AbstractSparkReadTest { - - private String[] uris = {"/marklogic-data-hub-spark-connector/readLib.sjs", "/marklogic-data-hub-spark-connector/partition-lib.xqy", - "/marklogic-data-hub-spark-connector/readRows.sjs", "/marklogic-data-hub-spark-connector/readRows.api", - "/marklogic-data-hub-spark-connector/initializeRead.sjs", "/marklogic-data-hub-spark-connector/initializeRead.api"}; - - @Test - void testReadModulesAreWrittenToModulesDatabase() { - runAsDataHubDeveloper(); - DocumentManager dm = getHubClient().getModulesClient().newDocumentManager(); - - dm.delete(uris); - for(String i:uris) { - assertFalse(dm.exists(i)!=null, - i+" was not deleted from Modules database"); - } - - loadSimpleCustomerTDE(); - new HubDataSourceReader(newOptions().withView("Customer").toDataSourceOptions()); - - for(String i:uris) { - assertTrue(dm.exists(i)!=null, - i+" was not written to Modules database"); - } - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadSimpleCustomersTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadSimpleCustomersTest.java deleted file mode 100644 index 830f5dcd66..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadSimpleCustomersTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.marklogic.hub.spark.sql.sources.v2.Options; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.types.DataTypes; -import org.apache.spark.sql.types.StructField; -import org.apache.spark.sql.types.StructType; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * This test just focuses on some basic queries and mapping support for a simple Customer TDE that only has 3 - * columns - an int, a string, and a date. - */ -public class ReadSimpleCustomersTest extends AbstractSparkReadTest { - - @Test - void differentSqlConditionsAndPartitionCounts() { - setupTenSimpleCustomers(); - - verifyRowCountForSqlCondition(null, 10); - verifyRowCountForSqlCondition("customerId > 3 and customerId < 7", 3); - verifyRowCountForSqlCondition("customerId > 11", 0); - } - - @Test - void noCustomersExist() { - runAsDataHubDeveloper(); - loadSimpleCustomerTDE(); - - runAsDataHubOperator(); - verifyRowCountForSqlCondition(null, 0); - } - - @Test - void noViewProvided() { - RuntimeException ex = assertThrows(RuntimeException.class, () -> { - new HubDataSourceReader(newOptions().toDataSourceOptions()); - }); - assertEquals("The 'view' option must define a TDE view name from which to retrieve rows", ex.getMessage(), - "The reader currently requires a TDE view to be specified; this will change in the future when " + - "additional query inputs are supported"); - } - - private void verifyRowCountForSqlCondition(String sqlCondition, int expectedRowCount) { - // Use different partition values to ensure they all return the same results. - // We don't care how many partitions end up being used - that's random, based on the randomly-generated row ID - // for each row. Just want to make sure we get the correct result regardless of the partition count. - Stream.of("1", "2", "10").forEach(partitionCount -> { - Options options = newOptions().withView("Customer").withSqlCondition(sqlCondition).withNumPartitions(partitionCount); - HubDataSourceReader dataSourceReader = new HubDataSourceReader(options.toDataSourceOptions()); - - if (expectedRowCount > 0) { - verifySparkSchema(dataSourceReader); - } - - List rows = readRows(dataSourceReader); - assertEquals(expectedRowCount, rows.size()); - verifySimpleCustomerRows(rows); - }); - } - - private void verifySparkSchema(HubDataSourceReader hubDataSourceReader) { - StructType schema = hubDataSourceReader.readSchema(); - assertEquals(3, schema.fields().length); - - StructField field = schema.fields()[0]; - assertEquals("customerId", field.name()); - assertEquals(DataTypes.IntegerType, field.dataType()); - assertFalse(field.nullable()); - - field = schema.fields()[1]; - assertEquals("name", field.name()); - assertEquals(DataTypes.StringType, field.dataType()); - assertTrue(field.nullable()); - - field = schema.fields()[2]; - assertEquals("customerSince", field.name()); - assertEquals(DataTypes.DateType, field.dataType()); - assertTrue(field.nullable()); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadViaSerializedPlanTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadViaSerializedPlanTest.java deleted file mode 100644 index 969eb80856..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadViaSerializedPlanTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import org.apache.spark.sql.catalyst.InternalRow; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -public class ReadViaSerializedPlanTest extends AbstractSparkReadTest { - - @Test - void customerIdLessThanFive() { - setupTenSimpleCustomers(); - - List rows = readRows(newOptions() - .withSerializedPlan(getCustomerIdLessThanFivePlan())); - assertEquals(5, rows.size()); - verifySimpleCustomerRows(rows); - } - - @Test - void groupAndOrderByCustomerId() { - setupTenSimpleCustomers(); - - List rows = readRows(newOptions() - .withSerializedPlan(readStringFromClasspath("serialized-plans/GroupAndOrderByCustomerId.json"))); - assertEquals(2, rows.size(), "The plan is expected to constrain on customerId < 2"); - - assertEquals(0, rows.get(0).getInt(0), "Expected customerId of zero"); - assertEquals(3, rows.get(0).numFields(), "Although Ernie's plan only returns one column, the Spark schema is " + - "still being built on the 3 columns in the TDE view. Thus, 3 columns are still returned, but with null as " + - "the value for columns 1 and 2. This will likely be improved in the near future so that the user can " + - "specify the Spark schema to use."); - assertEquals(1, rows.get(1).getInt(0), "Expected customerId of one"); - assertEquals(3, rows.get(1).numFields()); - } - - @Test - void invalidJSONInSerializedPlan() { - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> - readRows(newOptions().withSerializedPlan("this-is-not-valid-json"))); - assertTrue(ex.getMessage().startsWith("Unable to read serializedplan as a JSON object"), - "Unexpected error message: " + ex.getMessage()); - } - - @Test - void invalidOpticPlan() { - RuntimeException ex = assertThrows(RuntimeException.class, () -> - readRows(newOptions().withSerializedPlan("{\"hello\":\"world\"}"))); - assertTrue(ex.getMessage().startsWith("Unable to initialize read, cause: "), - "Unexpected error message: " + ex.getMessage()); - } - - @Test - void serializedPlanAndView() { - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> - readRows(newOptions() - .withSerializedPlan(getCustomerIdLessThanFivePlan()) - .withView("Customer") - )); - assertEquals("The 'view' option may not be specified when 'serializedplan' is also specified", ex.getMessage()); - } - - @Test - void serializedPlanAndSchema() { - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> - readRows(newOptions() - .withSerializedPlan(getCustomerIdLessThanFivePlan()) - .withSchema("Customer") - )); - assertEquals("The 'schema' option may not be specified when 'serializedplan' is also specified", ex.getMessage()); - } - - @Test - void serializedPlanAndSqlCondition() { - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> - readRows(newOptions() - .withSerializedPlan(getCustomerIdLessThanFivePlan()) - .withSqlCondition("customerId < 10") - )); - assertEquals("The 'sqlcondition' option may not be specified when 'serializedplan' is also specified", ex.getMessage()); - } - - private String getCustomerIdLessThanFivePlan() { - return readStringFromClasspath("serialized-plans/CustomerIdLessThanFive.json"); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomEndpointsTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomEndpointsTest.java deleted file mode 100644 index 1c14a6f035..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomEndpointsTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.marklogic.hub.spark.sql.sources.v2.Options; -import org.apache.spark.sql.catalyst.InternalRow; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -public class ReadWithCustomEndpointsTest extends AbstractSparkReadTest { - - @BeforeEach - void setup() { - installCustomEndpoint("custom-read-endpoints/initializeRead.api", "custom-read-endpoints/initializeRead.sjs"); - installCustomEndpoint("custom-read-endpoints/customReadRows.api", "custom-read-endpoints/customReadRows.sjs"); - } - - @Test - void test() { - ObjectNode endpointState = objectMapper.createObjectNode(); - ObjectNode testRow = endpointState.putObject("testRow"); - testRow.put("myId", 12345); - testRow.put("myName", "This is a test row"); - - ObjectNode readrowsendpointparams = objectMapper.createObjectNode().put("apiPath", - "/custom-read-endpoints/customReadRows.api").set("endpointState", endpointState); - - Options options = newOptions() - .withInitializeReadApiPath("/custom-read-endpoints/initializeRead.api") - .withReadRowsEndpointparams(readrowsendpointparams); - - List rows = readRows(new HubDataSourceReader(options.toDataSourceOptions())); - assertEquals(1, rows.size(), "Expecting a single row back, which should be the testRow in endpointState. And the " + - "row is expected to conform to the static schema defined in our custom initializeRead.sjs endpoint."); - InternalRow row = rows.get(0); - assertEquals(12345, row.getInt(1)); - assertEquals("This is a test row", row.getString(0)); - } - - @Test - public void testHasEndpointStateWithoutApiPath() { - ObjectNode readrowsendpointparams = objectMapper.createObjectNode(); - readrowsendpointparams.put("endpointState", "testValue"); - Options options = newOptions().withView("Customer").withReadRowsEndpointparams(readrowsendpointparams); - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, - () -> new HubDataSourceReader(options.toDataSourceOptions())); - assertEquals("Cannot set endpointState in readrowsendpointparams option unless apiPath is defined as well.", - ex.getMessage()); - } - - @Test - public void testHasEndpointConstants() { - ObjectNode readrowsendpointparams = objectMapper.createObjectNode(); - readrowsendpointparams.put("endpointConstants", "testValue"); - Options options = newOptions().withView("Customer").withReadRowsEndpointparams(readrowsendpointparams); - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, - () -> new HubDataSourceReader(options.toDataSourceOptions())); - assertEquals("Cannot set endpointConstants in readrowsendpointparams option; can only set apiPath and endpointState.", - ex.getMessage()); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomOptimizationlevelTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomOptimizationlevelTest.java deleted file mode 100644 index 37cee87548..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomOptimizationlevelTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.marklogic.hub.spark.sql.sources.v2.Options; -import org.apache.spark.sql.catalyst.InternalRow; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -public class ReadWithCustomOptimizationlevelTest extends AbstractSparkReadTest { - - @BeforeEach - public void setUp() { - runAsDataHubDeveloper(); - loadSimpleCustomerTDE(); - - runAsDataHubOperator(); - loadTenSimpleCustomers(); - } - - @Test - public void testStringOptimizationlevel() { - Options options = newOptions().withView("Customer").withStringOptimizationlevel("2"); - List rows = readRows(new HubDataSourceReader(options.toDataSourceOptions())); - assertEquals(10, rows.size(), rows.size()+" were read."); - } - - @Test - public void testIntegerOptimizationlevel() { - Options options = newOptions().withView("Customer").withIntegerOptimizationlevel(2); - List rows = readRows(new HubDataSourceReader(options.toDataSourceOptions())); - assertEquals(10, rows.size(), rows.size()+" were read."); - } - - @Test - public void testInvalidOptimizationlevel() { - Options options = newOptions().withView("Customer").withIntegerOptimizationlevel(6); - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, - () -> readRows(new HubDataSourceReader(options.toDataSourceOptions()))); - assertEquals("optimizationlevel needs to be 0,1 or 2", - ex.getMessage()); - - Options newOptions = newOptions().withView("Customer").withIntegerOptimizationlevel(-1); - ex = assertThrows(IllegalArgumentException.class, - () -> readRows(new HubDataSourceReader(newOptions.toDataSourceOptions()))); - assertEquals("optimizationlevel needs to be 0,1 or 2", - ex.getMessage()); - } - - @Test - public void testDecimalOptimizationlevel() { - Options options = newOptions().withView("Customer").withStringOptimizationlevel("1.5"); - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, - () -> readRows(new HubDataSourceReader(options.toDataSourceOptions()))); - assertEquals("optimizationlevel needs to be 0,1 or 2", - ex.getMessage()); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomPartitionCountTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomPartitionCountTest.java deleted file mode 100644 index 9e9988cd2a..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomPartitionCountTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.marklogic.hub.spark.sql.sources.v2.Options; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -public class ReadWithCustomPartitionCountTest extends AbstractSparkReadTest { - - /** - * We can't rely on calling planInputPartitions on HubDataSourceReader because the number of actual partitions is - * based on random distribution of Optic rowIDs. So instead, this test verifies that the numpartitions input that is - * sent to the initialize input is correct based on user input. - */ - @Test - void test() { - Options options = newOptions().withView("Customer"); - - // Need to construct a reader, can then use it to test that it populates numpartitions correctly - HubDataSourceReader reader = new HubDataSourceReader(options.toDataSourceOptions()); - - ObjectNode inputs = reader.buildInitializeReadInputs(options.withNumPartitions("1").toDataSourceOptions().asMap()); - assertEquals(1, inputs.get("numpartitions").asInt()); - - inputs = reader.buildInitializeReadInputs(options.withNumPartitions("720").toDataSourceOptions().asMap()); - assertEquals(720, inputs.get("numpartitions").asInt()); - - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, - () -> reader.buildInitializeReadInputs(options.withNumPartitions("0").toDataSourceOptions().asMap())); - assertEquals("numpartitions must be an integer greater than or equal to 1", ex.getMessage()); - - ex = assertThrows(IllegalArgumentException.class, - () -> reader.buildInitializeReadInputs(options.withNumPartitions("not a number").toDataSourceOptions().asMap())); - assertEquals("numpartitions must be an integer greater than or equal to 1", ex.getMessage()); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomSparkSchemaTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomSparkSchemaTest.java deleted file mode 100644 index 215919d339..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithCustomSparkSchemaTest.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.marklogic.hub.MarkLogicVersion; -import com.marklogic.hub.spark.sql.sources.v2.Options; -import org.apache.spark.sql.catalyst.InternalRow; -import org.apache.spark.sql.types.DataTypes; -import org.apache.spark.sql.types.Metadata; -import org.apache.spark.sql.types.StructField; -import org.apache.spark.sql.types.StructType; -import static org.junit.jupiter.api.Assumptions.*; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.OS; -import scala.collection.immutable.HashMap; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -public class ReadWithCustomSparkSchemaTest extends AbstractSparkReadTest { - - - @Test - void validCustomSparkSchema() { - MarkLogicVersion version = new MarkLogicVersion(getHubClient().getManageClient()); - assumeTrue(OS.LINUX.isCurrentOs() || (version.getMajor() >= 10 && - version.isNightly()), "Running this test on Windows and mac used to result in SEGFAULT when trying to get" + - " partition's row count. The server bug https://bugtrack.marklogic.com/55743 is fixed so the test should run" + - " fine on any version > 10.0-5 on Linux and on 10.0-nightly in other platforms."); - setupTenSimpleCustomers(); - - Options options = newOptions() - .withSparkSchema(buildCustomSparkSchema()) - .withSerializedPlan(buildSerializedPlanThatMatchesCustomSparkSchema()); - - verifyRowsConfirmToCustomSparkSchema(options); - } - - @Test - void invalidJsonForSparkSchema() { - Options options = newOptions() - .withSparkSchema("not-valid-json") - .withSerializedPlan(buildSerializedPlanThatMatchesCustomSparkSchema()); - - RuntimeException ex = assertThrows(RuntimeException.class, () -> readRows(options)); - assertTrue(ex.getMessage().contains("Unable to initialize read")); - assertTrue(ex.getMessage().contains("Unable to read 'sparkschema' input as JSON"), - "Expecting the error message from the ML endpoint to identify the exact reason why initialization failed"); - } - - private String buildCustomSparkSchema() { - Metadata metadata = new Metadata(new HashMap<>()); - return new StructType(new StructField[]{ - new StructField("myName", DataTypes.StringType, false, metadata), - new StructField("myId", DataTypes.IntegerType, false, metadata) - }).json(); - } - - private String buildSerializedPlanThatMatchesCustomSparkSchema() { - return getHubClient().getFinalClient().newServerEval().javascript("const op = require('/MarkLogic/optic');\n" + - "op.fromView(null, 'Customer', '')\n" + - " .select([\n" + - " op.as('myName', op.col('name')),\n" + - " op.as('myId', op.col('customerId'))\n" + - " ])\n" + - " .export()").evalAs(String.class); - } - - private void verifyRowsConfirmToCustomSparkSchema(Options options) { - List rows = readRows(new HubDataSourceReader(options.toDataSourceOptions())); - assertEquals(10, rows.size()); - for (InternalRow row : rows) { - int customerId = row.getInt(1); - assertEquals("Customer" + customerId, row.getString(0), - "Per the custom schema, 'myName' is expected to be the first column and 'myId' is second"); - } - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithSelectedColumnsTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithSelectedColumnsTest.java deleted file mode 100644 index cb20028af8..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/reader/ReadWithSelectedColumnsTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.reader; - -import com.marklogic.hub.spark.sql.sources.v2.Options; -import org.apache.spark.sql.catalyst.InternalRow; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -public class ReadWithSelectedColumnsTest extends AbstractSparkReadTest { - - /** - * Using one test method so the setup only has to be done once. - */ - @Test - void test() { - setupTenSimpleCustomers(); - - verifyTwoColumnsSelected(); - verifyOneColumnSelected(); - verifyInvalidColumnName(); - } - - private void verifyTwoColumnsSelected() { - readRows("customerId,name").forEach(row -> { - assertEquals(2, row.numFields()); - int customerId = row.getInt(0); - assertEquals("Customer" + customerId, row.getString(1)); - }); - } - - private void verifyOneColumnSelected() { - readRows("customerId").forEach(row -> { - assertEquals(1, row.numFields()); - assertTrue(row.getInt(0) > -1, "Just verifying we get an integer customerId back"); - }); - } - - private void verifyInvalidColumnName() { - RuntimeException ex = assertThrows(RuntimeException.class, () -> readRows("customerId,unrecognizedColumn")); - assertTrue(ex.getMessage().startsWith("Unable to initialize read")); - assertTrue(ex.getMessage().contains("Unable to get row count for partition, which may be due to invalid user input; cause: Column not found"), - "Expected message about a column not being found. Unfortunately the ML error doesn't specify which column is not found. Message: " + ex.getMessage()); - } - - private List readRows(String selectedColumns) { - Options options = newOptions().withView("Customer") - .withSelectedColumns(selectedColumns) - .withSqlCondition("customerId < 3"); - HubDataSourceReader dataSourceReader = new HubDataSourceReader(options.toDataSourceOptions()); - - List rows = readRows(dataSourceReader); - assertEquals(3, rows.size(), "Expecting 3 rows due to the SQL condition"); - return rows; - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/HandleAbortedWriterTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/HandleAbortedWriterTest.java deleted file mode 100644 index 0e3d40b5b4..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/HandleAbortedWriterTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.marklogic.hub.spark.sql.sources.v2.AbstractSparkConnectorTest; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class HandleAbortedWriterTest extends AbstractSparkConnectorTest { - - @Test - void dataWriterIsAborted() { - initializeDataWriter(newFruitOptions()); - assertEquals("started", getJobDocumentStatus()); - - hubDataWriter.write(buildRow("apple", "red")); - hubDataWriter.abort(); - logger.info("This test is only verifying that abort doesn't throw an error. It is expected to interrupt " + - "the BulkInputCaller, but it's not clear what impact that has - as of Java Client 5.3.0, it's possible to " + - "keep using the caller by calling accept and awaitCompletion on it."); - - assertEquals("started", getJobDocumentStatus(), "Aborting the DataWriter won't impact the job document; it's " + - "still on the DataSourceWriter to take care of updating the job doc"); - } - - @Test - void dataSourceWriterIsAborted() { - initializeDataWriter(newFruitOptions()); - assertEquals("started", getJobDocumentStatus()); - - writeRows(buildRow("apple", "red"), buildRow("blueberry", "blue")); - assertEquals(2, getFruitCount(), "Just verifying the two fruits were written"); - - dataSourceWriter.abort(null); - if(canUpdateJobDoc()){ - assertEquals("canceled", getJobDocumentStatus(), "If the DataSourceWriter is aborted for any reason, the job " + - "document should have a status of 'canceled'. Note that this does not imply whether any writes failed. " + - "But that is a limitation of the JobStatus class in DHF."); - } - else{ - verifyJobDocumentWasNotUpdated(getJobDocumentStatus()); - } - - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/HandleFailedWriteTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/HandleFailedWriteTest.java deleted file mode 100644 index b1b60617cc..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/HandleFailedWriteTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.fasterxml.jackson.databind.JsonNode; -import com.marklogic.client.io.BytesHandle; -import com.marklogic.client.io.Format; -import com.marklogic.hub.spark.sql.sources.v2.AbstractSparkConnectorTest; -import org.apache.spark.sql.sources.v2.writer.WriterCommitMessage; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.nio.charset.StandardCharsets; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class HandleFailedWriteTest extends AbstractSparkConnectorTest { - - @BeforeEach - void setupCustomIngestionEndpointThatThrowsAnErrorForBanana() { - installCustomIngestionEndpoint(); - - String moduleTextThatCanThrowError = "declareUpdate(); var input; " + - "let role = 'data-hub-operator'; " + - "var inputArray; " + - "if (input instanceof Sequence) { " + - " inputArray = input.toArray().map(item => fn.head(xdmp.fromJSON(item))); " + - "} else { " + - " inputArray = [fn.head(xdmp.fromJSON(input))]; " + - "} " + - "for (var fruit of inputArray) {" + - " if (fruit.fruitName == 'banana') { fn.error(null, 'RESTAPI-SRVEXERR', Sequence.from([400, 'Throwing error because fruitName is banana'])); } " + - " else {" + - " xdmp.documentInsert('/test/' + fruit.fruitName + '.json', fruit, [xdmp.permission(role, 'read'), xdmp.permission(role, 'update')], 'fruits');" + - " }" + - "}"; - - getHubClient().getModulesClient().newDocumentManager().write(CUSTOM_INGESTION_ENDPOINT_PATH, - new BytesHandle(moduleTextThatCanThrowError.getBytes(StandardCharsets.UTF_8)).withFormat(Format.TEXT)); - - } - - @Test - void errorDispositionShouldDefaultToSkipCall() { - initializeDataWriter(newFruitOptions().withWriteRecordsEndpointparams(objectMapper.createObjectNode() - .put("apiPath",CUSTOM_INGESTION_API_PATH))); - - WriterCommitMessage message = writeRowsAndCommitWithSourceWriter( - buildRow("apple", "red"), - buildRow("banana", "yellow"), - buildRow("carrot", "orange") - ); - - assertTrue(message instanceof AtLeastOneWriteFailedMessage, - "Because the call to write a banana failed, and because the default error disposition is SKIP_CALL, the " + - "call to write a carrot after banana should have completed, but a FailedWriteSkipMessage should " + - "have been returned so that the DataSourceWriter knows that the job finished but with errors"); - - verifyJobFinishedWithErrors(); - verifyOneFruitWasWritten(); - } - - private void verifyJobFinishedWithErrors() { - JsonNode job = getJobDocument(); - String status = job.get("job").get("jobStatus").asText(); - if(canUpdateJobDoc()){ - assertEquals("finished_with_errors", status, "Since the DataSourceWriter received at least one FailedWriteSkipMessage, the job should have a status " + - "of finished_with_errors"); - } - else{ - verifyJobDocumentWasNotUpdated(status); - } - } - - private void verifyOneFruitWasWritten() { - assertEquals(1, getFruitCount(), "With a batch size of 2 (as defined in the custom endpoint API file), " + - "the first batch containing banana should have failed, but the second batch containing only carrot " + - "should have worked"); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/VerifyUserIsAuthorizedTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/VerifyUserIsAuthorizedTest.java deleted file mode 100644 index ecc7d48e34..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/VerifyUserIsAuthorizedTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.marklogic.hub.spark.sql.sources.v2.AbstractSparkConnectorTest; -import com.marklogic.hub.spark.sql.sources.v2.Options; -import org.junit.jupiter.api.Test; - -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -public class VerifyUserIsAuthorizedTest extends AbstractSparkConnectorTest { - - @Test - void validCredentials() { - initializeDataSourceWriter(new Options(getHubPropertiesAsMap()).toDataSourceOptions()); - logger.info("The lack of an exception indicates that the user was authorized when checking the connection to ML"); - } - - @Test - void invalidCredentials() { - Map props = getHubPropertiesAsMap(); - props.put("mlUsername", "unknown-user"); - props.put("mlPassword", "bad-password"); - - RuntimeException ex = assertThrows(RuntimeException.class, - () -> initializeDataSourceWriter(new Options(props).toDataSourceOptions())); - - assertEquals("User is unauthorized; please ensure you have the correct username and password for a MarkLogic user that has at least the data-hub-operator role", - ex.getMessage()); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataTest.java deleted file mode 100644 index ebe78744a2..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataTest.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.marklogic.client.ResourceNotFoundException; -import com.marklogic.client.document.GenericDocumentManager; -import com.marklogic.client.io.DocumentMetadataHandle; -import com.marklogic.hub.spark.sql.sources.v2.AbstractSparkConnectorTest; -import com.marklogic.hub.spark.sql.sources.v2.Options; -import org.apache.spark.sql.sources.v2.DataSourceOptions; -import org.apache.spark.sql.sources.v2.writer.WriterCommitMessage; -import org.junit.jupiter.api.Test; - -import java.util.HashMap; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.*; - -public class WriteDataTest extends AbstractSparkConnectorTest { - - @Test - public void ingestWithoutCustomApiWithCustomEndpointConstants() { - ObjectNode customEndpointConstants = objectMapper.createObjectNode(); - customEndpointConstants.put("userDefinedValue", 0); - - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, - () -> initializeDataWriter(new Options(getHubPropertiesAsMap()).withWriteRecordsEndpointparams(objectMapper.createObjectNode() - .set("endpointConstants", customEndpointConstants))), - "Expected an error because a custom work unit was provided without a custom API path" - ); - assertEquals("Cannot set endpointConstants or endpointState in writerecordsendpointparams unless apiPath is defined as well.", ex.getMessage()); - } - - @Test - public void ingestWithIncorrectApi() { - ResourceNotFoundException ex = assertThrows(ResourceNotFoundException.class, - () -> initializeDataWriter(new Options(getHubPropertiesAsMap()).withWriteRecordsEndpointparams(objectMapper.createObjectNode() - .put("apiPath","/incorrect.api"))), - "Expected an error because a custom work unit was provided without a custom API path" - ); - System.out.println(ex.getMessage()); - assertTrue(ex.getMessage().contains("Could not read non-existent document.")); - } - - @Test - public void ingestWithEmptyApiWithCustomEndpointConstants() { - ObjectNode customEndpointConstants = objectMapper.createObjectNode(); - customEndpointConstants.put("userDefinedValue", 0); - - ObjectNode writeRecordsEndpointParams = objectMapper.createObjectNode().put("apiPath", "") - .set("endpointConstants", customEndpointConstants); - - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, - () -> initializeDataWriter(new Options(getHubPropertiesAsMap()).withWriteRecordsEndpointparams(writeRecordsEndpointParams)), - "Expected an error because a custom work unit was provided without a custom API path" - ); - assertEquals("Cannot set endpointConstants or endpointState in writerecordsendpointparams unless apiPath is defined as well.", ex.getMessage()); - } - - @Test - public void ingestWithEmptyApiWithCustomEndpointState() { - ObjectNode customEndpointState = objectMapper.createObjectNode(); - customEndpointState.put("userDefinedValue", 0); - - ObjectNode writeRecordsEndpointParams = objectMapper.createObjectNode().put("apiPath", "") - .set("endpointState", customEndpointState); - - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, - () -> initializeDataWriter(new Options(getHubPropertiesAsMap()).withWriteRecordsEndpointparams(writeRecordsEndpointParams)), - "Expected an error because a custom work unit was provided without a custom API path" - ); - assertEquals("Cannot set endpointConstants or endpointState in writerecordsendpointparams unless apiPath is defined as well.", ex.getMessage()); - } - - @Test - void nullEndpointConstantsNoApiPath() { - Map params = new HashMap<>(); - params.putAll(getHubPropertiesAsMap()); - - ObjectNode node = objectMapper.createObjectNode(); - node.set("endpointState", null); - params.put("writerecordsendpointparams", node.toString()); - - initializeDataWriter(new DataSourceOptions(params)); - logger.info("No exception should have occurred because a null endpointConstant doesn't mean that Ernie tried to " + - "set an endpointConstant without an apiPath"); - } - - @Test - void nullEndpointStateNoApiPath() { - Map params = new HashMap<>(); - params.putAll(getHubPropertiesAsMap()); - - ObjectNode node = objectMapper.createObjectNode(); - node.set("endpointState", null); - params.put("writerecordsendpointparams", node.toString()); - - initializeDataWriter(new DataSourceOptions(params)); - logger.info("No exception should have occurred because a null endpointState doesn't mean that Ernie tried to " + - "set an endpointState without an apiPath"); - } - - @Test - void invalidJsonForIngestionParams() { - Map params = new HashMap<>(); - params.putAll(getHubPropertiesAsMap()); - - final String invalidJson = "{\"endpointConstants\":{}"; - params.put("writerecordsendpointparams", invalidJson); - - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> initializeDataWriter(new DataSourceOptions(params))); - assertTrue(ex.getMessage().contains("Unable to parse writerecordsendpointparams"), "Unexpected error message: " + ex.getMessage()); - } - - @Test - void invalidPermissionsString() { - initializeDataWriter(newFruitOptions().withPermissions("rest-reader,read,rest-writer")); - WriterCommitMessage message = writeRows(buildRow("apple", "red"), buildRow("apple2", "also red")); - assertTrue(message instanceof AtLeastOneWriteFailedMessage); - assertEquals(0, getFruitCount(), "No records should have been written since the permissions are invalid; " + - "rest-writer is missing a capability. TODO We may want to enhance this so that this failure occurs " + - "before the job document is written, though we'd likely need to verify that each role name is correct " + - "as well, not just that the string is formatted correctly."); - } - - @Test - public void testEndpointsAreLoaded() { - runAsAdmin().getModulesClient().newTextDocumentManager().delete( - "/marklogic-data-hub-spark-connector/writeLib.sjs", - "/marklogic-data-hub-spark-connector/writeRecords.api", - "/marklogic-data-hub-spark-connector/writeRecords.sjs", - "/marklogic-data-hub-spark-connector/initializeWrite.api", - "/marklogic-data-hub-spark-connector/initializeWrite.sjs", - "/marklogic-data-hub-spark-connector/finalizeWrite.api", - "/marklogic-data-hub-spark-connector/finalizeWrite.sjs"); - - - runAsDataHubOperator(); - initializeDataWriter(new Options(getHubPropertiesAsMap()).withUriPrefix("/testFruit")); - writeRows(buildRow("apple", "red")); - - verifyFruitCount(1, "Verifying the data was written"); - verifyModuleWasLoadedByConnector("/marklogic-data-hub-spark-connector/writeRecords.api"); - verifyModuleWasLoadedByConnector("/marklogic-data-hub-spark-connector/writeRecords.sjs"); - verifyModuleWasLoadedByConnector("/marklogic-data-hub-spark-connector/initializeWrite.api"); - verifyModuleWasLoadedByConnector("/marklogic-data-hub-spark-connector/initializeWrite.sjs"); - - dataSourceWriter.commit(null); - - verifyModuleWasLoadedByConnector("/marklogic-data-hub-spark-connector/finalizeWrite.api"); - verifyModuleWasLoadedByConnector("/marklogic-data-hub-spark-connector/finalizeWrite.sjs"); - } - - private void verifyModuleWasLoadedByConnector(String path) { - GenericDocumentManager mgr = getHubClient().getModulesClient().newDocumentManager(); - assertNotNull(mgr.exists(path), "Expected module to be loaded by connector: " + path); - - DocumentMetadataHandle metadata = mgr.readMetadata(path, new DocumentMetadataHandle()); - assertTrue(metadata.getCollections().contains("hub-core-module"), "The module should be in this collection so that when a " + - "user clears user modules, these modules are not deleted. They're not really user modules because they're " + - "not from the user's project."); - - DocumentMetadataHandle.DocumentPermissions perms = metadata.getPermissions(); - // Verify module has default DHF module permissions - assertTrue(perms.get("data-hub-module-reader").contains(DocumentMetadataHandle.Capability.READ)); - assertTrue(perms.get("data-hub-module-reader").contains(DocumentMetadataHandle.Capability.EXECUTE)); - assertTrue(perms.get("data-hub-module-writer").contains(DocumentMetadataHandle.Capability.UPDATE)); - assertTrue(perms.get("rest-extension-user").contains(DocumentMetadataHandle.Capability.EXECUTE)); - - - } - - private void verifyFruitCount(int expectedCount, String message) { - String query = "cts.uriMatch('/testFruit**').toArray().length"; - String count = getHubClient().getStagingClient().newServerEval().javascript(query).evalAs(String.class); - assertEquals(expectedCount, Integer.parseInt(count), message); - - // Assumes both apple and banana were written - if (expectedCount > 1) { - final String fruitQuery = "cts.search(cts.jsonPropertyValueQuery('fruitName', '%s'))"; - ObjectNode apple = readJsonObject(getHubClient().getStagingClient().newServerEval().javascript(format(fruitQuery, "apple")).evalAs(String.class)); - assertEquals("apple", apple.get("envelope").get("instance").get("fruitName").asText()); - ObjectNode banana = readJsonObject(getHubClient().getStagingClient().newServerEval().javascript(format(fruitQuery, "banana")).evalAs(String.class)); - assertEquals("banana", banana.get("envelope").get("instance").get("fruitName").asText()); - } - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataViaCustomEndpointTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataViaCustomEndpointTest.java deleted file mode 100644 index f19f7d8875..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataViaCustomEndpointTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeType; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.marklogic.client.io.JacksonHandle; -import com.marklogic.hub.spark.sql.sources.v2.AbstractSparkConnectorTest; -import com.marklogic.hub.spark.sql.sources.v2.Options; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -public class WriteDataViaCustomEndpointTest extends AbstractSparkConnectorTest { - - private JsonNode writtenDocument; - - @BeforeEach - void beforeEach() { - installCustomIngestionEndpoint(); - } - - @Test - void customEndpointStateAndEndpointConstants() { - ObjectNode endpointConstants = objectMapper.createObjectNode(); - endpointConstants.put("someString", "value"); - endpointConstants.put("someNumber", 123); - - ObjectNode endpointState = objectMapper.createObjectNode(); - endpointState.put("someState", "hello world"); - - writeRowUsingCustomEndpoint(endpointConstants, endpointState); - - // Verify custom constants and state data were added to document - assertEquals("value", writtenDocument.get("myEndpointConstants").get("someString").asText()); - assertEquals(123, writtenDocument.get("myEndpointConstants").get("someNumber").asInt()); - assertEquals("hello world", writtenDocument.get("myEndpointState").get("someState").asText()); - } - - @Test - void customEndpointNoEndpointStateAndNoEndpointConstants() { - writeRowUsingCustomEndpoint(null, null); - - verifyEndpointConstantsIsEmpty(); - assertTrue(writtenDocument.has("myEndpointState"), "myEndpointState should exist, but it should be null since " + - "we didn't pass anything to the endpoint"); - assertEquals(JsonNodeType.NULL, writtenDocument.get("myEndpointState").getNodeType()); - } - - @Test - void customEndpointWithEndpointStateAndNoEndpointConstants() { - ObjectNode customEndpointState = objectMapper.createObjectNode(); - customEndpointState.put("someState", "hello world"); - - writeRowUsingCustomEndpoint(null, customEndpointState); - - verifyEndpointConstantsIsEmpty(); - assertEquals("hello world", writtenDocument.get("myEndpointState").get("someState").asText()); - } - - private void writeRowUsingCustomEndpoint(ObjectNode customEndpointConstants, ObjectNode customEndpointState) { - ObjectNode writeRecordsEndpointparams = objectMapper.createObjectNode() - .put("apiPath", CUSTOM_INGESTION_API_PATH) - .set("endpointConstants", customEndpointConstants); - writeRecordsEndpointparams.set("endpointState", customEndpointState); - - initializeDataWriter(new Options(getHubPropertiesAsMap()) - .withWriteRecordsEndpointparams(writeRecordsEndpointparams)); - - try { - writeRows(buildRow("apple", "red")); - - } catch (Exception ex) { - throw new RuntimeException(ex); - } - - loadDocumentAndVerifyInputData(); - } - - private void loadDocumentAndVerifyInputData() { - writtenDocument = getHubClient().getStagingClient().newJSONDocumentManager().read("/test/doc.json", new JacksonHandle()).get(); - assertEquals("apple", writtenDocument.get("input").get("fruitName").asText()); - assertEquals("red", writtenDocument.get("input").get("fruitColor").asText()); - } - - private void verifyEndpointConstantsIsEmpty() { - assertEquals(1, writtenDocument.get("myEndpointConstants").size(), - "When the user provides empty ingestion endpointConstants, the jobId is still added to them so that it's " + - "available for the ingestion endpoint"); - assertNotNull(writtenDocument.get("myEndpointConstants").get("jobId").asText()); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataWithOptionsTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataWithOptionsTest.java deleted file mode 100644 index 32fa4704d7..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataWithOptionsTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.fasterxml.jackson.databind.JsonNode; -import com.marklogic.client.io.DocumentMetadataHandle; -import com.marklogic.client.io.JacksonHandle; -import com.marklogic.hub.spark.sql.sources.v2.AbstractSparkConnectorTest; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static org.junit.jupiter.api.Assertions.*; - -public class WriteDataWithOptionsTest extends AbstractSparkConnectorTest { - - @Test - void ingestDocsWithCollection() { - String collections = "fruits,stuff"; - initializeDataWriter(newFruitOptions().withCollections(collections)); - writeRows(buildRow("pineapple", "green")); - - DocumentMetadataHandle metadata = getFirstFruitMetadata(); - assertEquals(2, metadata.getCollections().size()); - assertTrue(metadata.getCollections().contains("fruits")); - assertTrue(metadata.getCollections().contains("stuff")); - - // Verify default permissions - DocumentMetadataHandle.DocumentPermissions perms = getFirstFruitMetadata().getPermissions(); - Set capabilities = perms.get("data-hub-operator"); - assertTrue(capabilities.contains(DocumentMetadataHandle.Capability.READ)); - assertTrue(capabilities.contains(DocumentMetadataHandle.Capability.UPDATE)); - } - - @Test - void ingestDocsWithSourceName() { - String sourceName = "spark"; - initializeDataWriter(newFruitOptions().withSourceName(sourceName)); - writeRows(buildRow("pineapple", "green")); - - JsonNode doc = getHubClient().getStagingClient().newJSONDocumentManager().read(getFruitUris()[0], new JacksonHandle()).get(); - JsonNode sources = doc.get("envelope").get("headers").get("sources"); - assertEquals(1, sources.size(), "Expecting one source"); - assertEquals(sourceName, sources.get(0).get("datahubSourceName").asText()); - assertFalse(sources.get(0).has("name"), "Starting in 5.4.0 DHF, datahubSourceName is the right field for " + - "capturing a user-provided source name"); - } - - @Test - void ingestDocsWithSourceType() { - String sourceType = "fruits"; - initializeDataWriter(newFruitOptions().withSourceType(sourceType)); - writeRows(buildRow("pineapple", "green")); - - JsonNode doc = getHubClient().getStagingClient().newJSONDocumentManager().read(getFruitUris()[0], new JacksonHandle()).get(); - assertEquals(sourceType, doc.get("envelope").get("headers").get("sources").get(0).get("datahubSourceType").asText()); - } - - @Test - void ingestDocsWithPermissions() { - String permissions = "rest-extension-user,read,rest-reader,update"; - initializeDataWriter(newFruitOptions().withPermissions(permissions)); - writeRows(buildRow("pineapple", "green")); - - DocumentMetadataHandle.DocumentPermissions perms = getFirstFruitMetadata().getPermissions(); - assertEquals(DocumentMetadataHandle.Capability.READ, perms.get("rest-extension-user").iterator().next()); - assertEquals(DocumentMetadataHandle.Capability.UPDATE, perms.get("rest-reader").iterator().next()); - } - -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataWithUriTemplateTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataWithUriTemplateTest.java deleted file mode 100644 index 7e19242e6e..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteDataWithUriTemplateTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.fasterxml.jackson.databind.JsonNode; -import com.marklogic.client.io.DocumentMetadataHandle; -import com.marklogic.client.io.JacksonHandle; -import com.marklogic.hub.spark.sql.sources.v2.AbstractSparkConnectorTest; -import org.junit.jupiter.api.Test; -import org.apache.spark.sql.sources.v2.writer.WriterCommitMessage; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -public class WriteDataWithUriTemplateTest extends AbstractSparkConnectorTest { - - @Test - void openingBraceWithoutClosingBrace() { - String uriTemplate = "{property1.json"; - RuntimeException e = assertThrows(RuntimeException.class, () -> initializeDataWriter(newFruitOptions().withUriTemplate(uriTemplate))); - assertEquals("Invalid uritemplate: {property1.json; opening brace without closing brace", e.getMessage()); - } - - @Test - void closingBraceBeforeOpeningBrace() { - String uriTemplate = "property2}.json"; - RuntimeException e = assertThrows(RuntimeException.class, () -> initializeDataWriter(newFruitOptions().withUriTemplate(uriTemplate))); - assertEquals("Invalid uritemplate: property2}.json; closing brace found before opening brace", e.getMessage()); - } - - @Test - void openingBraceInsteadOfClosingBraceWithEqualCountsOfBraces() { - String uriTemplate = "{{property1}property2}.json"; - RuntimeException e = assertThrows(RuntimeException.class, () -> initializeDataWriter(newFruitOptions().withUriTemplate(uriTemplate))); - assertEquals("Invalid uritemplate: {{property1}property2}.json; expected closing brace, but found opening brace", e.getMessage()); - } - - @Test - void openingBraceInsteadOfClosingBrace() { - String uriTemplate = "{property1{}.json"; - RuntimeException e = assertThrows(RuntimeException.class, () -> initializeDataWriter(newFruitOptions().withUriTemplate(uriTemplate))); - assertEquals("Invalid uritemplate: {property1{}.json; expected closing brace, but found opening brace", e.getMessage()); - } - - @Test - void noColumnNameInBraces() { - String uriTemplate = "/a/b/c/{}.json"; - RuntimeException e = assertThrows(RuntimeException.class, () -> initializeDataWriter(newFruitOptions().withUriTemplate(uriTemplate))); - assertEquals("Invalid uritemplate: /a/b/c/{}.json; no column name within opening and closing brace", e.getMessage()); - } - - @Test - void ingestDocWithUriTemplate() { - initializeDataWriter(newFruitOptions().withUriTemplate("/fruit/{fruitColor}/{fruitName}.json")); - writeRows(buildRow("pineapple", "green")); - String uri = getFruitUris()[0]; - assertEquals("/fruit/green/pineapple.json", uri); - } - - @Test - void ingestDocWithUriTemplateNullInContent() { - initializeDataWriter(newFruitOptions().withUriTemplate("/fruit/{fruitColor}/{fruitName}.json")); - WriterCommitMessage response = writeRows(buildRow("pineapple", null)); - assertNotNull(response); - assertEquals(AtLeastOneWriteFailedMessage.class, response.getClass()); - } - - @Test - void ingestDocWithUriTemplateUndefinedInContent() { - initializeDataWriter(newFruitOptions().withUriTemplate("/fruit/{fruitColor}/{fruitName}/{doesnotexist}.json")); - WriterCommitMessage response = writeRows(buildRow("pineapple", null)); - assertNotNull(response); - assertEquals(AtLeastOneWriteFailedMessage.class, response.getClass()); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteJobWithCustomEndpointsTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteJobWithCustomEndpointsTest.java deleted file mode 100644 index 2011140ebc..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteJobWithCustomEndpointsTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.marklogic.hub.spark.sql.sources.v2.AbstractSparkConnectorTest; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -public class WriteJobWithCustomEndpointsTest extends AbstractSparkConnectorTest { - - @BeforeEach - void installCustomJobEndpoints() { - installCustomEndpoint("custom-job-endpoints/initializeWrite.api", "custom-job-endpoints/initializeWrite.sjs"); - installCustomEndpoint("custom-job-endpoints/finalizeWrite.api", "custom-job-endpoints/finalizeWrite.sjs"); - } - - @Test - void bothEndpointsAreCustom() { - initializeDataWriter(newFruitOptions() - .withInitializeWriteApiPath("/custom-job-endpoints/initializeWrite.api") - .withFinalizeWriteApiPath("/custom-job-endpoints/finalizeWrite.api") - ); - - verifyCustomInitializeEndpointIsUsed(); - dataSourceWriter.commit(null); - verifyStatusIsStopOnError(); - } - - @Test - void customInitializeEndpoint() { - initializeDataWriter(newFruitOptions() - .withInitializeWriteApiPath("/custom-job-endpoints/initializeWrite.api") - ); - - verifyCustomInitializeEndpointIsUsed(); - dataSourceWriter.commit(null); - assertEquals("finished", getJobDocumentStatus()); - } - - @Test - void customFinalizeEndpoint() { - initializeDataWriter(newFruitOptions() - .withFinalizeWriteApiPath("/custom-job-endpoints/finalizeWrite.api") - ); - - assertFalse("customId".equals(getJobDocument().get("job").get("jobId")), "Verifying that the custom initialization endpoint is not used"); - dataSourceWriter.commit(null); - verifyCustomFinalizeEndpointIsUsed(); - } - - @Test - void invalidInitializeEndpoint() { - RuntimeException ex = assertThrows(RuntimeException.class, () -> - initializeDataWriter(newFruitOptions().withInitializeWriteApiPath("/missing.api"))); - assertTrue(ex.getMessage().startsWith("Unable to read custom API module for initializing a job"), - "Expected friendly error message for when the API module is invalid (in this case, it's not found)"); - } - - @Test - void invalidFinalizeEndpoint() { - RuntimeException ex = assertThrows(RuntimeException.class, () -> - initializeDataWriter(newFruitOptions().withFinalizeWriteApiPath("/missing.api"))); - assertTrue(ex.getMessage().startsWith("Unable to read custom API module for finalizing a job"), - "Expected friendly error message for when the API module is invalid (in this case, it's not found)"); - } - - private void verifyCustomInitializeEndpointIsUsed() { - assertEquals("customId", getJobDocument().get("job").get("jobId").asText(), - "The custom initializeWrite endpoint is expected to always use 'customId' as the jobId"); - } - - private void verifyCustomFinalizeEndpointIsUsed() { - if (canUpdateJobDoc()) { - verifyStatusIsStopOnError(); - } else { - verifyJobDocumentWasNotUpdated(getJobDocumentStatus()); - } - } - - private void verifyStatusIsStopOnError() { - assertEquals("stop-on-error", getJobDocumentStatus(), - "The custom finalizeWrite endpoint is expected to always set 'stop-on-error' as the status. This is done " + - "so that the jobs.sjs module doesn't see some unrecognized status and then try to update the job " + - "document, which fails when running this test against DHF 5.2.x."); - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteJobsDataTest.java b/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteJobsDataTest.java deleted file mode 100644 index 6c46c47751..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/java/com/marklogic/hub/spark/sql/sources/v2/writer/WriteJobsDataTest.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.marklogic.hub.spark.sql.sources.v2.writer; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.marklogic.client.io.DocumentMetadataHandle; -import com.marklogic.hub.spark.sql.sources.v2.AbstractSparkConnectorTest; -import org.junit.jupiter.api.Test; - -import java.util.Iterator; -import java.util.concurrent.atomic.AtomicInteger; - -import static org.junit.jupiter.api.Assertions.*; - -public class WriteJobsDataTest extends AbstractSparkConnectorTest { - - @Test - void ingestDocsWithJobDoc() { - initializeDataWriter(newFruitOptions()); - writeRows(buildRow("pineapple", "green")); - - DocumentMetadataHandle metadata = getFirstFruitMetadata(); - String jobId = metadata.getMetadataValues().get("datahubCreatedByJob"); - String jobUri = "/jobs/" + jobId + ".json"; - assertEquals("test-data-hub-operator", metadata.getMetadataValues().get("datahubCreatedBy")); - assertNotNull(metadata.getMetadataValues().get("datahubCreatedOn")); - assertNotNull(jobId); - - JsonNode jobDoc = getJobDoc(jobUri); - assertEquals(jobId, jobDoc.get("job").get("jobId").asText()); - assertEquals("started", jobDoc.get("job").get("jobStatus").asText()); - assertEquals("test-data-hub-operator", jobDoc.get("job").get("user").asText()); - assertNotNull(jobDoc.get("job").get("timeStarted")); - assertNotNull(jobDoc.get("job").get("externalMetadata")); - assertNotNull(jobDoc.get("job").get("externalMetadata").get("sparkSchema")); - assertEquals("struct", jobDoc.get("job").get("externalMetadata").get("sparkSchema").get("type").asText()); - - DocumentMetadataHandle jobDocMetaData = getJobMetaData(jobUri); - assertEquals(2, jobDocMetaData.getCollections().size()); - assertTrue(jobDocMetaData.getCollections().contains("Jobs")); - assertTrue(jobDocMetaData.getCollections().contains("Job")); - - DocumentMetadataHandle.DocumentPermissions perms = jobDocMetaData.getPermissions(); - assertEquals(DocumentMetadataHandle.Capability.READ, perms.get("data-hub-job-reader").iterator().next()); - assertEquals(DocumentMetadataHandle.Capability.UPDATE, perms.get("flow-developer-role").iterator().next()); - assertEquals(DocumentMetadataHandle.Capability.UPDATE, perms.get("flow-operator-role").iterator().next()); - Iterator internalPermissions = perms.get("data-hub-job-internal").iterator(); - AtomicInteger internalPermissionsCount = new AtomicInteger(); - internalPermissions.forEachRemaining((internalPermission) -> { - assertTrue(DocumentMetadataHandle.Capability.UPDATE.equals(internalPermission) || DocumentMetadataHandle.Capability.READ.equals(internalPermission)); - internalPermissionsCount.getAndIncrement(); - }); - assertEquals(2, internalPermissionsCount.get()); - - dataSourceWriter.commit(null); - - jobDoc = getJobDoc(jobUri); - String status = jobDoc.get("job").get("jobStatus").asText(); - if(canUpdateJobDoc()){ - assertEquals("finished", status); - assertNotNull(jobDoc.get("job").get("timeEnded")); - } - else{ - verifyJobDocumentWasNotUpdated(status); - } - } - - @Test - void testDocsWithAdditionalExternalMetadata() { - ObjectNode additionalExternalMetadata = objectMapper.createObjectNode(); - additionalExternalMetadata.put("jobName", "testJob"); - initializeDataWriter(newFruitOptions().withAdditionalExternalMetadata(additionalExternalMetadata)); - writeRows(buildRow("pineapple", "green")); - - DocumentMetadataHandle metadata = getFirstFruitMetadata(); - String jobId = metadata.getMetadataValues().get("datahubCreatedByJob"); - String jobUri = "/jobs/" + jobId + ".json"; - assertNotNull(jobId); - - JsonNode jobDoc = getJobDoc(jobUri); - assertEquals(jobId, jobDoc.get("job").get("jobId").asText()); - assertNotNull(jobDoc.get("job").get("externalMetadata")); - assertNotNull(jobDoc.get("job").get("externalMetadata").get("jobName")); - assertEquals("testJob", jobDoc.get("job").get("externalMetadata").get("jobName").asText()); - - } - - @Test - void testDocsWithInvalidAdditionalExternalMetadata() { - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, - () -> initializeDataWriter(newFruitOptions().withAdditionalExternalMetadataAsString("testString")), - "Expected an error because additionalExternalMetadata is a String instead of Json" - ); - assertTrue(ex.getMessage().contains("Unable to parse additionalExternalMetadata option as a JSON object; cause: Unrecognized token 'testString': " + - "was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')")); - - } - - private JsonNode getJobDoc(String jobUrl) { - return getHubClient().getJobsClient().newServerEval() - .javascript("fn.doc('" + jobUrl + "')") - .evalAs(JsonNode.class); - } - - private DocumentMetadataHandle getJobMetaData(String jobUrl) { - return getHubClient().getJobsClient().newDocumentManager().readMetadata(jobUrl, new DocumentMetadataHandle()); - } - -} diff --git a/marklogic-data-hub-spark-connector/src/test/resources/custom-ingestion-endpoint/endpoint.api b/marklogic-data-hub-spark-connector/src/test/resources/custom-ingestion-endpoint/endpoint.api deleted file mode 100644 index 715ca6256b..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/custom-ingestion-endpoint/endpoint.api +++ /dev/null @@ -1,32 +0,0 @@ -{ - "endpoint": "/custom-ingestion-endpoint/endpoint.sjs", - "desc": "This is for testing a custom ingestion endpoint", - "params": [ - { - "name": "endpointState", - "datatype": "jsonDocument", - "multiple": false, - "nullable": true - }, - { - "name": "endpointConstants", - "datatype": "jsonDocument", - "multiple": false, - "nullable": true - }, - { - "name": "input", - "datatype": "jsonDocument", - "multiple": true, - "nullable": true - } - ], - "return": { - "datatype": "jsonDocument", - "multiple": false, - "nullable": true - }, - "$bulk": { - "inputBatchSize": 2 - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/resources/custom-ingestion-endpoint/endpoint.sjs b/marklogic-data-hub-spark-connector/src/test/resources/custom-ingestion-endpoint/endpoint.sjs deleted file mode 100644 index 75e34dd84a..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/custom-ingestion-endpoint/endpoint.sjs +++ /dev/null @@ -1,37 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -declareUpdate(); - -var input; - -const doc = { - input: input, - myEndpointState: fn.head(xdmp.fromJSON(endpointState)), - myEndpointConstants: fn.head(xdmp.fromJSON(endpointConstants)) -}; - -xdmp.documentInsert( - "/test/doc.json", - doc, - { - permissions: [ - xdmp.permission('data-hub-operator', 'read'), - xdmp.permission('data-hub-operator', 'update') - ] - } -); diff --git a/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/finalizeWrite.api b/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/finalizeWrite.api deleted file mode 100644 index 0075484b0f..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/finalizeWrite.api +++ /dev/null @@ -1,14 +0,0 @@ -{ - "functionName": "finalizeWrite", - "endpointDirectory": "/custom-job-endpoints/", - "params": [ - { - "name": "jobId", - "datatype": "string" - }, - { - "name": "status", - "datatype": "string" - } - ] -} diff --git a/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/finalizeWrite.sjs b/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/finalizeWrite.sjs deleted file mode 100644 index dea62e59c1..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/finalizeWrite.sjs +++ /dev/null @@ -1,37 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -var jobId; -var status; - -// This is just for testing purposes -const mjsProxy = require("/data-hub/core/util/mjsProxy.sjs"); -const jobs = mjsProxy.requireMjsModule("/data-hub/5/impl/jobs.mjs"); - -const alwaysUseThisStatus = "stop-on-error"; -try { - const jobDoc = jobs.getJob(jobId); - if (jobDoc) { - jobDoc.job.jobStatus = alwaysUseThisStatus; - jobDoc.job.timeEnded = fn.currentDateTime(); - jobs.updateJob(jobDoc); - } -} catch (ex) { - console.log("Failed to update job document; cause: " + ex); -} - - diff --git a/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/initializeWrite.api b/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/initializeWrite.api deleted file mode 100644 index 8b12f88db4..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/initializeWrite.api +++ /dev/null @@ -1,15 +0,0 @@ -{ - "functionName": "initializeWrite", - "endpointDirectory": "/custom-job-endpoints/", - "params": [ - { - "name": "externalMetadata", - "datatype": "jsonDocument", - "$javaClass": "com.fasterxml.jackson.databind.JsonNode", - "nullable": true - } - ], - "return": { - "datatype": "string" - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/initializeWrite.sjs b/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/initializeWrite.sjs deleted file mode 100644 index 26aef2f9a7..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/custom-job-endpoints/initializeWrite.sjs +++ /dev/null @@ -1,41 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -declareUpdate(); - -// This is just for testing purposes - -var externalMetadata = externalMetadata != null ? fn.head(xdmp.fromJSON(externalMetadata)) : {}; - -const id = "customId"; - -xdmp.documentInsert( - "/jobs/" + id + ".json", - { - job: { - jobId: id, - user: xdmp.getCurrentUser(), - jobStatus: "started", - timeStarted: fn.currentDateTime(), - externalMetadata - } - }, - [xdmp.permission("data-hub-operator", "read"), xdmp.permission("data-hub-operator", "update")], - ['Jobs', 'Job'] -); - -id; diff --git a/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/customReadRows.api b/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/customReadRows.api deleted file mode 100644 index ae883d371a..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/customReadRows.api +++ /dev/null @@ -1,23 +0,0 @@ -{ - "endpoint": "/custom-read-endpoints/customReadRows.sjs", - "functionName": "readRows", - "params": [ - { - "name": "endpointState", - "datatype": "jsonDocument", - "multiple": false, - "nullable": true - }, - { - "name": "endpointConstants", - "datatype": "jsonDocument", - "multiple": false, - "nullable": true - } - ], - "return": { - "datatype": "jsonDocument", - "multiple": true, - "nullable": true - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/customReadRows.sjs b/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/customReadRows.sjs deleted file mode 100644 index 856843ff46..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/customReadRows.sjs +++ /dev/null @@ -1,32 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -var endpointState = fn.head(xdmp.fromJSON(endpointState)); - -const results = [endpointState]; - -/** - * This endpoint simply says - if hasRunOnce doesn't equal true in endpointState, then add "testRow" to the results and - * return it. Otherwise, only return the endpointState, which tells HubInputPartitionReader that there are no more rows - * to read. - */ -if (true != endpointState.hasRunOnce) { - results.push(endpointState.testRow); - endpointState.hasRunOnce = true; -} - -Sequence.from(results); diff --git a/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/initializeRead.api b/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/initializeRead.api deleted file mode 100644 index 5ad8e9097a..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/initializeRead.api +++ /dev/null @@ -1,15 +0,0 @@ -{ - "functionName": "initializeRead", - "endpointDirectory": "/custom-read-endpoints/", - "params": [ - { - "name": "inputs", - "datatype": "jsonDocument", - "$javaClass": "com.fasterxml.jackson.databind.JsonNode" - } - ], - "return": { - "datatype": "jsonDocument", - "$javaClass": "com.fasterxml.jackson.databind.JsonNode" - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/initializeRead.sjs b/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/initializeRead.sjs deleted file mode 100644 index d1a9c33dde..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/custom-read-endpoints/initializeRead.sjs +++ /dev/null @@ -1,49 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -/** - * This custom endpoint simply returns a static schema and partitions array. The parameterizedPlan is empty because - * our custom readRows endpoint doesn't need it, since it also is returning static data. - */ - -const response = { - "sparkSchema": { - "type": "struct", - "fields": [{ - "name": "myName", - "type": "string", - "nullable": false, - "metadata": {} - }, { - "name": "myId", - "type": "integer", - "nullable": false, - "metadata": {} - },] - }, - "partitions": [{ - "min": 0, - "max": "18446744073709551615", - "rowCount": 10, - "batchCount": 1, - "partitionBatchSize": "18446744073709551615" - }], - "parameterizedPlan": {} -}; - -response - diff --git a/marklogic-data-hub-spark-connector/src/test/resources/entityInstances/User/user1.json b/marklogic-data-hub-spark-connector/src/test/resources/entityInstances/User/user1.json deleted file mode 100644 index 4c392347ef..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/entityInstances/User/user1.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "envelope": { - "instance": { - "info": { - "title": "User", - "version": "0.0.1", - "baseUri": "http://example.org/" - }, - "User": { - "id": 1, - "name": "John", - "salary": 30.5, - "debt": -10, - "userIRI": "/John/IRI", - "isActive": true, - "mottoBase64": "RHVtIHNwaXJvIHNwZXJv", - "mottoHex": "44756D20737069726F20737065726F", - "dob": "1987-01-10", - "dateTimeOfBirth": "1987-01-10T12:13:14-00:00", - "timeOfBirth": "20:12:38", - "birthYearMonth": "1987-01", - "birthYear": "1987+02:00", - "birthMonth": "--01+02:00", - "birthMonthDay": "--01-10", - "birthDay": "---10", - "lastLogin": "P0Y1M", - "lastLoginDays": "P30DT1H", - "location": "37.389965,-122.07858", - "locationLongLat": "-122.07858 37.389965" - } - } - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/resources/junit-platform.properties b/marklogic-data-hub-spark-connector/src/test/resources/junit-platform.properties deleted file mode 100644 index 676d32ceb1..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/junit-platform.properties +++ /dev/null @@ -1,2 +0,0 @@ -junit.jupiter.execution.parallel.enabled = false -#junit.jupiter.execution.parallel.mode.default = concurrent diff --git a/marklogic-data-hub-spark-connector/src/test/resources/log4j.properties b/marklogic-data-hub-spark-connector/src/test/resources/log4j.properties deleted file mode 100644 index 527b5d1220..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/log4j.properties +++ /dev/null @@ -1,18 +0,0 @@ -# Have to use log4j, as the spark jars bring along log4j as a dependency -# This file is just used for tests, so feel free to configure it in any manner - -# Root logger option -log4j.rootLogger=WARN, stdout - -log4j.logger.com.marklogic.hub=INFO, stdout -log4j.additivity.com.marklogic.hub=false - -log4j.logger.com.marklogic.client.dataservices=INFO, stdout -log4j.additivity.com.marklogic.client.dataservices=false - -# Direct log messages to stdout -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Target=System.out -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n - diff --git a/marklogic-data-hub-spark-connector/src/test/resources/serialized-plans/CustomerIdLessThanFive.json b/marklogic-data-hub-spark-connector/src/test/resources/serialized-plans/CustomerIdLessThanFive.json deleted file mode 100644 index 353bacbb45..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/serialized-plans/CustomerIdLessThanFive.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$optic": { - "ns": "op", - "fn": "operators", - "args": [ - { - "ns": "op", - "fn": "from-view", - "args": [ - "Customer", - "Customer", - "", - null - ] - }, - { - "ns": "op", - "fn": "where", - "args": [ - { - "ns": "op", - "fn": "sql-condition", - "args": [ - "customerId < 5" - ] - } - ] - } - ] - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/resources/serialized-plans/GroupAndOrderByCustomerId.json b/marklogic-data-hub-spark-connector/src/test/resources/serialized-plans/GroupAndOrderByCustomerId.json deleted file mode 100644 index 1813df2037..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/serialized-plans/GroupAndOrderByCustomerId.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "$optic": { - "ns": "op", - "fn": "operators", - "args": [ - { - "ns": "op", - "fn": "from-view", - "args": [ - "Customer", - "Customer", - null, - null - ] - }, - { - "ns": "op", - "fn": "where", - "args": [ - { - "ns": "op", - "fn": "sql-condition", - "args": [ - "customerId < 2" - ] - } - ] - }, - { - "ns": "op", - "fn": "group-by", - "args": [ - [ - { - "ns": "op", - "fn": "col", - "args": [ - "customerId" - ] - } - ], - null - ] - }, - { - "ns": "op", - "fn": "order-by", - "args": [ - [ - { - "ns": "op", - "fn": "col", - "args": [ - "customerId" - ] - } - ] - ] - } - ] - } -} diff --git a/marklogic-data-hub-spark-connector/src/test/resources/tde-views/Customer.tdex b/marklogic-data-hub-spark-connector/src/test/resources/tde-views/Customer.tdex deleted file mode 100644 index e765635c1e..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/tde-views/Customer.tdex +++ /dev/null @@ -1,98 +0,0 @@ - - - Simplified version of the TDE template that's generated in the reference-entity-model project - - /*:envelope/*:instance[*:info/*:version = "0.0.1"][*:Customer] - - - RDF - "http://www.w3.org/1999/02/22-rdf-syntax-ns#" - - - RDF_TYPE - sem:iri(concat($RDF, "type")) - - - - - es - http://marklogic.com/entity-services - - - - - .//Customer[node()] - - - subject-iri - sem:iri(concat("http://example.org/Customer-0.0.1/Customer/", - fn:encode-for-uri(xs:string(./customerId)))) - - - - - - - $subject-iri - ignore - - - $RDF_TYPE - ignore - - - sem:iri("http://example.org/Customer-0.0.1/Customer") - ignore - - - - - $subject-iri - ignore - - - sem:iri("http://www.w3.org/2000/01/rdf-schema#isDefinedBy") - ignore - - - fn:base-uri(.) - ignore - - - - - - .//Customer[node()] - - - Customer - Customer - sparse - - - customerId - integer - customerId - false - ignore - - - name - string - name - true - ignore - - - customerSince - date - customerSince - true - ignore - - - - - - - diff --git a/marklogic-data-hub-spark-connector/src/test/resources/tde-views/User.tdex b/marklogic-data-hub-spark-connector/src/test/resources/tde-views/User.tdex deleted file mode 100644 index 363f583eeb..0000000000 --- a/marklogic-data-hub-spark-connector/src/test/resources/tde-views/User.tdex +++ /dev/null @@ -1,265 +0,0 @@ - - - Simplified version of the TDE template that's generated in the reference-entity-model project - - /*:envelope/*:instance[*:info/*:version = "0.0.1"][*:User] - - - .//User[node()] - - - User - User - sparse - - - id - integer - id - false - reject - - - idInt - int - id - true - reject - - - idByte - byte - id - true - reject - - - idPositiveInteger - positiveInteger - id - true - reject - - - idNonNegativeInteger - nonNegativeInteger - id - true - reject - - - idLong - long - id - true - reject - - - idUnsignedLong - unsignedLong - id - true - reject - - - idUnsignedInt - unsignedInt - id - true - reject - - - idShort - short - id - true - reject - - - idUnsignedByte - unsignedByte - id - true - reject - - - idUnsignedShort - unsignedShort - id - true - reject - - - name - string - name - true - reject - - - dob - date - dob - true - reject - - - dateTimeOfBirth - dateTime - dateTimeOfBirth - true - reject - - - timeOfBirth - time - timeOfBirth - true - reject - - - userIRI - IRI - userIRI - true - reject - - - userURI - anyURI - userIRI - true - reject - - - isActive - boolean - isActive - true - reject - - - debtNegativeInteger - negativeInteger - debt - true - reject - - - debtNonPositiveInteger - nonPositiveInteger - debt - true - reject - - - salaryFloat - float - salary - true - reject - - - salaryDouble - double - salary - true - reject - - - salaryDecimal - decimal - salary - true - reject - - - birthYearMonth - gYearMonth - birthYearMonth - true - reject - - - birthYear - gYear - birthYear - true - reject - - - birthMonth - gMonth - birthMonth - true - reject - - - birthDay - gDay - birthDay - true - reject - - - birthMonthDay - gMonthDay - birthMonthDay - true - reject - - - lastLoginDuration - duration - lastLogin - true - reject - - - lastLoginYearMonthDuration - yearMonthDuration - lastLogin - true - reject - - - lastLoginDays - dayTimeDuration - lastLoginDays - true - reject - - - location - point - location - true - reject - - - locationLongLat - longLatPoint - locationLongLat - true - reject - - - mottoBase64 - base64Binary - mottoBase64 - true - reject - - - mottoHex - hexBinary - mottoHex - true - reject - - - - - - - diff --git a/marklogic-data-hub/build.gradle b/marklogic-data-hub/build.gradle index 5c7ed595a1..788477d9c4 100644 --- a/marklogic-data-hub/build.gradle +++ b/marklogic-data-hub/build.gradle @@ -185,12 +185,6 @@ task generateDataServiceInterfaces { } } -task generateSparkInterface(type: com.marklogic.client.tools.gradle.EndpointProxiesGenTask, group: dataServicesGroup) { - description = "Must run this from the ./marklogic-data-hub directory" - serviceDeclarationFile = "src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/service.json" - javaBaseDirectory = "../marklogic-data-hub-spark-connector/src/main/java" -} - jar{ enabled = true } diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/finalizeWrite.api b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/finalizeWrite.api deleted file mode 100644 index 75205421a9..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/finalizeWrite.api +++ /dev/null @@ -1,16 +0,0 @@ -{ - "functionName": "finalizeWrite", - "desc": "Finalize a write process, which includes updating the job document", - "params": [ - { - "name": "jobId", - "datatype": "string", - "desc": "ID of the job document" - }, - { - "name": "status", - "datatype": "string", - "desc": "Status of the job" - } - ] -} diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/finalizeWrite.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/finalizeWrite.sjs deleted file mode 100644 index d451c5a7f9..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/finalizeWrite.sjs +++ /dev/null @@ -1,36 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -// No privilege required: This endpoint is called by the spark connector. - -var jobId; -var status; - -const mjsProxy = require("/data-hub/core/util/mjsProxy.sjs"); -const jobs = mjsProxy.requireMjsModule("/data-hub/5/impl/jobs.mjs"); - -try { - const jobDoc = jobs.getJob(jobId); - if (jobDoc) { - jobDoc.job.jobStatus = status; - jobDoc.job.timeEnded = fn.currentDateTime(); - jobs.updateJob(jobDoc); - } -} catch (ex) { - console.log("Failed to update job document; cause: " + ex); -} - diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeRead.api b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeRead.api deleted file mode 100644 index 8fc438478a..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeRead.api +++ /dev/null @@ -1,17 +0,0 @@ -{ - "functionName": "initializeRead", - "desc": "Determines the schema and set of partitions based on the user's inputs", - "params": [ - { - "name": "inputs", - "datatype": "jsonDocument", - "$javaClass": "com.fasterxml.jackson.databind.JsonNode", - "desc": "JSON object defining the inputs for the rows to be read" - } - ], - "return": { - "datatype": "jsonDocument", - "$javaClass": "com.fasterxml.jackson.databind.JsonNode", - "desc": "JSON object containing a 'schema' object, 'partitions' array, and a 'parameterizedPlan' object" - } -} diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeRead.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeRead.sjs deleted file mode 100644 index 9b87a51663..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeRead.sjs +++ /dev/null @@ -1,120 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -const op = require('/MarkLogic/optic'); -const readLib = require("readLib.sjs"); - -/** - * Build an Optic plan based on the user's inputs. - * - * @param inputs - * @returns {*|void|string} - */ -function buildPlanBasedOnUserInputs(inputs) { - if (inputs.serializedPlan) { - return op.import(inputs.serializedPlan); - } - - // The qualifier of "" will only work for non-joins; it's intended to provide simple column names for Spark - let thePlan = op.fromView(inputs.schema, inputs.view, ""); - if (inputs.sqlcondition) { - thePlan = thePlan.where(op.sqlCondition(inputs.sqlcondition)); - } - - const selectedColumns = getSelectedColumnsFromUserInputs(inputs); - if (selectedColumns) { - thePlan = thePlan.select(selectedColumns); - } - - return thePlan; -} - -function getSelectedColumnsFromUserInputs(inputs) { - return inputs.selectedcolumns ? inputs.selectedcolumns.split(",") : null; -} - -/** - * If sparkschema is not provided by the user, then a schema is dynamically generated based on the parameterized - * plan and any columns selected by the user. - * - * @param inputs - * @param parameterizedPlan - * @param partitions - * @returns {{type: string, fields: (*|*[])}|undefined} - */ -function buildSparkSchema(inputs, parameterizedPlan, partitions) { - if (inputs.sparkschema) { - return readCustomSparkSchemaAsJson(inputs); - } - let fields = []; - const someMatchingRowsExist = partitions.length > 0; - if (someMatchingRowsExist) { - fields = buildSchemaFieldsFromParameterizedPlan(parameterizedPlan, getSelectedColumnsFromUserInputs(inputs)); - } - return {"type": "struct", fields}; -} - -/** - * Builds the array of Spark schema fields based on the parameterized plan and the optional array of selected columns. - * - * @param parameterizedPlan - * @param selectedColumns - * @returns {*} - */ -function buildSchemaFieldsFromParameterizedPlan(parameterizedPlan, selectedColumns) { - const schemaName = readLib.getSchemaName(parameterizedPlan); - const viewName = readLib.getViewName(parameterizedPlan); - return readLib.buildSchemaFieldsBasedOnTdeColumns(schemaName, viewName, selectedColumns); -} - -/** - * If user provides a custom Spark schema as a string, throw a nice error if it's not valid JSON. - * - * @param inputs - * @returns {*|this|this} - */ -function readCustomSparkSchemaAsJson(inputs) { - try { - return fn.head(xdmp.fromJsonString(inputs.sparkschema)); - } catch (e) { - // Can't use http-utils.sjs as we want to support 5.2.x - fn.error(null, 'RESTAPI-SRVEXERR', Sequence.from([400, "Unable to read 'sparkschema' input as JSON; cause: " + e.message])); - } -} - - -var inputs = fn.head(xdmp.fromJSON(inputs)); - -// Based on the user inputs, build an Optic plan -const originalPlan = buildPlanBasedOnUserInputs(inputs); - -// Now parameterize the plan so it can be used to query for maching rows in partitions. -// Null may be returned here, which means there are no matching rows. -const parameterizedPlan = readLib.parameterizePlan(originalPlan.export()); - -// Determine the partitions, only including the ones that have matching rows in them -const partitions = parameterizedPlan != null ? readLib.makePartitionsWithRows(parameterizedPlan, inputs.numpartitions) : []; - -const sparkSchema = buildSparkSchema(inputs, parameterizedPlan, partitions); - -const response = { - sparkSchema, - partitions, - parameterizedPlan -}; - -response; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeWrite.api b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeWrite.api deleted file mode 100644 index 05264feeb8..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeWrite.api +++ /dev/null @@ -1,17 +0,0 @@ -{ - "functionName": "initializeWrite", - "desc": "Initializes a write process, which includes creating a job document", - "params": [ - { - "name": "externalMetadata", - "desc": "Optional JSON object that will be added to the job document if not null", - "datatype": "jsonDocument", - "$javaClass": "com.fasterxml.jackson.databind.JsonNode", - "nullable": true - } - ], - "return": { - "datatype": "string", - "desc": "The ID of the created job" - } -} diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeWrite.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeWrite.sjs deleted file mode 100644 index 7082d1f8b2..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/initializeWrite.sjs +++ /dev/null @@ -1,45 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -declareUpdate(); - -// No privilege required: This endpoint is called by the spark connector. - -var externalMetadata = externalMetadata != null ? fn.head(xdmp.fromJSON(externalMetadata)) : {}; - - -const mjsProxy = require("/data-hub/core/util/mjsProxy.sjs"); -const jobs = mjsProxy.requireMjsModule("/data-hub/5/impl/jobs.mjs"); - -const id = sem.uuidString(); - -xdmp.documentInsert( - "/jobs/" + id + ".json", - { - job: { - jobId: id, - user: xdmp.getCurrentUser(), - jobStatus: "started", - timeStarted: fn.currentDateTime(), - externalMetadata - } - }, - jobs.buildJobPermissions(), - ['Jobs', 'Job'] -); - -id; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/partition-lib.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/partition-lib.xqy deleted file mode 100644 index b5fdad3a1d..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/partition-lib.xqy +++ /dev/null @@ -1,87 +0,0 @@ -xquery version "1.0-ml"; - -(: -This library is written in XQuery to safely handle unsignedLong values, which are a bit trickier to handle -correctly in SJS. -:) - -module namespace partition = "org:example:partition"; - -(: -Returns an "initial" set of partitions that just defines a min and max for each partition. -:) -declare function make-partitions($num-partitions as xs:integer) as json:array -{ - let $partitions := json:array() - - let $max-long as xs:unsignedLong := 18446744073709551615 - let $partition-size := xs:unsignedLong($max-long div $num-partitions) - - let $_ := - for $i in 1 to $num-partitions - let $min := ($i - 1) * $partition-size - let $max := if ($i = $num-partitions) then $max-long else ($i * $partition-size - 1) - let $partition := json:object() - let $_ := ( - map:put($partition, "min", $min), - map:put($partition, "max", $max) - ) - return json:array-push($partitions, $partition) - - return $partitions -}; - -(: -Handles the math for figuring out the number of batches in the given partition based on the given batch-size. -The keys batchCount and partitionBatchSize will be added to the partition object. -:) -declare function add-batch-info-to-partition( - $partition as json:object, - $batch-size as xs:unsignedLong -) as empty-sequence() -{ - let $row-count := xs:unsignedLong(map:get($partition, "rowCount")) - let $partition-min := xs:unsignedLong(map:get($partition, "min")) - let $partition-max := xs:unsignedLong(map:get($partition, "max")) - - let $batch-count := xs:unsignedLong(math:ceil($row-count div $batch-size)) - let $partition-size := xs:unsignedLong($partition-max - $partition-min) - let $partition-batch-size := - if ($batch-count > 0) then xs:unsignedLong($partition-size div $batch-count) - else 0 - - return ( - map:put($partition, "batchCount", $batch-count), - map:put($partition, "partitionBatchSize", $partition-batch-size) - ) -}; - -(: -For the given partition, which must define min, max, batchCount, and partitionBatchSize, return a JSON object -that defines a min and max rowID. Those rows IDs constitute a "partition batch". -:) -declare function get-partition-batch($partition as json:object, $batch-number as xs:integer) as json:object -{ - let $partition-batch-size := xs:unsignedLong(map:get($partition, "partitionBatchSize")) - let $partition-min := xs:unsignedLong(map:get($partition, "min")) - let $partition-max := xs:unsignedLong(map:get($partition, "max")) - let $batch-count := xs:unsignedLong(map:get($partition, "batchCount")) - - let $batch-number := - if ($batch-number > $batch-count) then $batch-count - else $batch-number - - let $min-offset := xs:unsignedLong(($batch-number - 1) * $partition-batch-size) - let $min := xs:unsignedLong($min-offset + $partition-min) - let $max-offset := xs:unsignedLong($batch-number * $partition-batch-size) - let $max := - if ($batch-number = $batch-count) then $partition-max - else $max-offset + $partition-min - 1 - let $batch := json:object() - let $_ := ( - map:put($batch, "min", xs:string($min)), - map:put($batch, "max", xs:string($max)) - ) - return $batch -}; - diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readLib.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readLib.sjs deleted file mode 100644 index ad91b8a50d..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readLib.sjs +++ /dev/null @@ -1,275 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -const partitionLib = require('partition-lib.xqy'); -const tdeToSparkDataTypeMap = new Map([ - ["int", "integer"], - ["unsignedInt", "long"], - ["long", "long"], - ["unsignedLong", "long"], - ["float", "float"], - ["double", "double"], - ["decimal", "double"], - ["dateTime", "timestamp"], - ["time", "string"], - ["date", "date"], - ["gYearMonth", "string"], - ["gYear", "string"], - ["gMonth", "string"], - ["gDay", "string"], - ["yearMonthDuration", "string"], - ["dayTimeDuration", "string"], - ["string", "string"], - ["anyURI", "string"], - ["point", "string"], - ["longLatPoint", "string"], - ["boolean", "boolean"], - ["base64Binary", "binary"], - ["hexBinary", "string"], - ["byte", "byte"], - ["duration", "string"], - ["gMonthDay", "string"], - ["integer", "integer"], - ["negativeInteger", "integer"], - ["nonNegativeInteger", "integer"], - ["nonPositiveInteger", "integer"], - ["positiveInteger", "integer"], - ["short", "short"], - ["unsignedByte", "short"], - ["unsignedShort", "short"], - ["IRI", "string"] -]); - -/** - * Parameterize the given plan with a where clause that constrains on a min and max rowID. If no rows are found that - * match the given plan, then null is returned. - * - * By parameterizing the plan, it can then be used by the partition reader endpoint to constrain on a set of row IDs - * without knowing anything about the actual query in the plan. It just needs to set the min and max rowID params for - * each batch within its given partition. - * - * @param originalPlan - * @returns {{$optic: {args: (*|*[]), ns: *, fn: *}}|null} - */ -function parameterizePlan(originalPlan) { - const schemaName = getSchemaName(originalPlan); - const viewName = getViewName(originalPlan); - const tableId = findTableId(schemaName, viewName); - - if (tableId == null) { - return null; - } - - return makeParameterizedPlan(originalPlan, tableId); -} - -/** - * Given a tableId, parameterizes the original plan by adding a where clause that constrains on a min and max rowID. - * - * @param originalPlan - * @param tableId - * @returns {{$optic: {args: (*|*[]), ns: *, fn: *}}} - */ -function makeParameterizedPlan(originalPlan, tableId) { - // Construct a new plan with the "from" operator and the rowID where clause - const updatedPlan = { - "$optic": makeArg("op", "operators", [ - getFromOperator(originalPlan), - makeArg("op", "where", - makeArg("op", "and", [ - makeRowIdComparator(tableId, "ge", "MIN"), - makeRowIdComparator(tableId, "le", "MAX") - ]) - ) - ]) - }; - - // Add all of the original plan's other arguments to the updated plan - originalPlan["$optic"].args.slice(1).forEach(arg => { - updatedPlan["$optic"].args.push(arg); - }); - - return updatedPlan; -} - -/** - * The "from" operator is assumed to always be the first arg in a plan. - * - * @param thePlan - * @returns {string | RemoteObject} - */ -function getFromOperator(thePlan) { - return thePlan["$optic"].args[0]; -} - -/** - * Convenience function for getting the name of a schema from a plan. Since the schema is optional, this may return - * null. - * - * @param thePlan - * @returns {string | RemoteObject} - */ -function getSchemaName(thePlan) { - return getFromOperator(thePlan).args[0]; -} - -/** - * Convenience function for getting the name of a view from a plan. - * - * @param thePlan - * @returns {string | RemoteObject} - */ -function getViewName(thePlan) { - return getFromOperator(thePlan).args[1]; -} - -/** - * Returns the tableId (sometimes called "view ID") associated with the given schema and view. - * - * @param schema optional - * @param view required - * @returns {*|string|null} - */ -function findTableId(schema, view) { - const result = fn.head(op.fromView(schema, view).limit(1) - .select(op.as("tableId", op.fn.string(op.col("rowID")))) - .result()); - return result ? result.tableId.split(":")[0] : null; -} - -/** - * Convenience function for constructing an argument in a serialized JSON plan. - * - * @param ns - * @param fn - * @param args - * @returns {{args: (*|*[]), ns: *, fn: *}} - */ -function makeArg(ns, fn, args) { - args = Array.isArray(args) ? args : [args]; - return {ns, fn, args}; -} - -/** - * Convenience function for building a "le" or "ge" clause on rowID. - * - * @param tableId - * @param comparator "le" or "ge" - * @param paramPrefix "MIN" or "MAX" - * @returns {{args: (*|*[]), ns: *, fn: *}} - */ -function makeRowIdComparator(tableId, comparator, paramPrefix) { - return makeArg("op", comparator, [ - makeArg("op", "col", makeArg("xs", "string", "rowID")), - makeArg("sql", "rowID", [ - makeArg("fn", "concat", [ - makeArg("xs", "string", tableId + ":"), - makeArg("op", "param", makeArg("xs", "string", paramPrefix + "_ROW_ID")) - ]) - ]) - ]); -} - -/** - * Queries the internal sys/sys_columns table to get information about each of the columns in the given view/schema. - * - * @param schemaName optional TDE schema name - * @param viewName required TDE view name - * @param selectedColumns optional array of selected columns (null array means all columns) - * @returns a JSON object for each column in a format that Spark understands as mapping to a StructField - */ -function buildSchemaFieldsBasedOnTdeColumns(schemaName, viewName, selectedColumns) { - let columnsSqlCondition = "table = '" + viewName + "'"; - if (schemaName) { - columnsSqlCondition += " and schema = '" + schemaName + "'"; - } - - const schemaFields = []; - - op.fromView("sys", "sys_columns") - .where(op.sqlCondition(columnsSqlCondition)) - .result().toArray().forEach(column => { - const columnName = column["sys.sys_columns.name"]; - if (selectedColumns == null || selectedColumns.includes(columnName)) { - schemaFields.push({ - name: columnName, - type: tdeToSparkDataTypeMap.get(column["sys.sys_columns.type"]) ? tdeToSparkDataTypeMap.get(column["sys.sys_columns.type"]) : "string", - nullable: column["sys.sys_columns.notnull"] == 0 ? true : false, - metadata: {} - }); - } - }); - - return schemaFields; -} - -/** - * For the given plan, first divide it up into partitions based on the numPartitions (this uses the XQuery library to - * handle unsignedLong math). Then for each partition, use the parameterizedPlan to determine if there are any matching - * rows within the row ID boundaries for the partition. If so, return it with the rowCount added to the partition. If - * not, discard it. - * - * @param parameterizedPlan - * @param numPartitions - * @returns {[]} - */ -function makePartitionsWithRows(parameterizedPlan, numPartitions) { - const groupByPlan = op.import(parameterizedPlan).groupBy(null, op.count("rowCount")); - - // Will make this configurable soon. Assuming 10k rows in a batch is reasonable for now, knowing that Optic - // can often retrieve far larger amounts in less than a second. - // The purpose of batchSize is to give the user another mechanism for controlling how many rows are returned on - // average by a call to the readRows endpoint. For example, if a partition has 100m matching rows in it, it is likely - // not desirable to return all of those in a single call to readRows. The batchSize is then used to split the partition - // up into N batches, such that instead of 100m rows, each call may return on average a more acceptable number of rows - // from a performane perspective. - const batchSize = 10000; - - // Determine which partitions contain rows - const partitions = []; - partitionLib.makePartitions(numPartitions).forEach(partition => { - const rowCount = getRowCountForPartition(groupByPlan, partition); - if (rowCount > 0) { - partition.rowCount = rowCount; - partitionLib.addBatchInfoToPartition(partition, batchSize); - partitions.push(partition); - } - }); - - return partitions; -} - -function getRowCountForPartition(groupByPlan, partition) { - try { - return fn.head(groupByPlan.result(null, { - "MIN_ROW_ID": partition.min, - "MAX_ROW_ID": partition.max - })).rowCount; - } catch (e) { - // Can't use http-utils.sjs, as we want to support DHF 5.2.x - fn.error(null, 'RESTAPI-SRVEXERR', Sequence.from([400, - "Unable to get row count for partition, which may be due to invalid user input; cause: " + e.message])); - } -} - -module.exports = { - buildSchemaFieldsBasedOnTdeColumns, - getSchemaName, - getViewName, - makePartitionsWithRows, - parameterizePlan -} diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readRows.api b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readRows.api deleted file mode 100644 index 376fdc9c1d..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readRows.api +++ /dev/null @@ -1,25 +0,0 @@ -{ - "endpoint": "/marklogic-data-hub-spark-connector/readRows.sjs", - "desc": "Return a JSON array for each row that matches the user's query, as defined by the endpointConstants", - "functionName": "readRows", - "params": [ - { - "name": "endpointState", - "datatype": "jsonDocument", - "multiple": false, - "nullable": true - }, - { - "name": "endpointConstants", - "datatype": "jsonDocument", - "multiple": false, - "nullable": true - } - ], - "return": { - "datatype": "jsonDocument", - "desc": "A JSON array for each matching row for the given partition batch", - "multiple": true, - "nullable": true - } -} diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readRows.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readRows.sjs deleted file mode 100644 index 3ad649cc07..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/readRows.sjs +++ /dev/null @@ -1,49 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -const op = require('/MarkLogic/optic'); -const partitionLib = require('/marklogic-data-hub-spark-connector/partition-lib.xqy'); - -var endpointState = fn.head(xdmp.fromJSON(endpointState)); -var endpointConstants = fn.head(xdmp.fromJSON(endpointConstants)); - -const results = [endpointState]; - -const partitionNumber = endpointConstants.partitionNumber; -const partition = endpointConstants.initializationResponse.partitions[partitionNumber]; -const optimizationlevel = endpointConstants.optimizationlevel; - -if (endpointState.batchNumber <= partition.batchCount) { - // Determine the min/max rowID of the current batch number - const batch = partitionLib.getPartitionBatch(partition, endpointState.batchNumber); - - // Run the parameterized plan, constraining it to the min and max row ID of the current batch - const thePlan = op.import(endpointConstants.initializationResponse.parameterizedPlan); - if(optimizationlevel >= 0) { - thePlan.prepare(optimizationlevel); - } - thePlan.result(null, { - "MIN_ROW_ID": batch.min, - "MAX_ROW_ID": batch.max - }) - .toArray() - .forEach(row => results.push(row)); - - endpointState.batchNumber = endpointState.batchNumber + 1; -} - -Sequence.from(results); diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/service.json b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/service.json deleted file mode 100644 index a2ad66a3dd..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/service.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "desc": "Defines endpoints needed by the Spark connector", - "endpointDirectory": "/marklogic-data-hub-spark-connector/", - "$javaClass": "com.marklogic.hub.spark.dataservices.SparkService" -} diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeLib.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeLib.sjs deleted file mode 100644 index b3acae6fb0..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeLib.sjs +++ /dev/null @@ -1,149 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -/** - * Contains functions for both implementing the default endpoint for writing records and for supporting customization of - * a new endpoint for writing records. - */ -const mjsProxy = require("/data-hub/core/util/mjsProxy.sjs"); -const consts = mjsProxy.requireMjsModule("/data-hub/5/impl/consts.mjs"); -const flowUtils = mjsProxy.requireMjsModule("/data-hub/5/impl/flow-utils.mjs"); -const hubUtils = mjsProxy.requireMjsModule("/data-hub/5/impl/hub-utils.mjs"); -const temporal = require("/MarkLogic/temporal.xqy"); - -function buildHeaders(endpointConstants) { - const headers = {}; - headers.createdOn = consts.CURRENT_DATE_TIME - headers.createdBy = consts.CURRENT_USER - - if(endpointConstants.sourcename != null || endpointConstants.sourcetype != null){ - const sources = []; - const source = {}; - source.datahubSourceName = endpointConstants.sourcename - source.datahubSourceType = endpointConstants.sourcetype - sources[0] = source; - headers.sources = sources - } - - return flowUtils.createHeaders({headers}); -} - -function buildInsertOptions(endpointConstants) { - const userCollections = endpointConstants.collections != null ? endpointConstants.collections.split(',') : []; - - const temporalCollections = temporal.collections().toArray().reduce((acc, col) => { - acc[col] = true; - return acc; - }, {}); - - let temporalCollection = userCollections.find((col) => temporalCollections[col]); - const collectionsReservedForTemporal = ['latest']; - const collectionsToUse = temporalCollection ? - userCollections.filter((col) => !(temporalCollections[col] || collectionsReservedForTemporal.includes(col))) : - userCollections; - - // To ensure this endpoint can work with DHF 5.2.x, must use data-hub-operator, which is the least-privileged role in 5.2.x - const permissions = endpointConstants.permissions != null ? endpointConstants.permissions : 'data-hub-operator,read,data-hub-operator,update' - const permissionsArray = hubUtils.parsePermissions(permissions); - - return { - temporalCollection, - options: { - permissions: permissionsArray, - collections: collectionsToUse, - metadata: buildMetadata(endpointConstants) - } - } -} - -function buildMetadata(endpointConstants) { - const metadata = {}; - metadata.datahubCreatedByJob = endpointConstants.jobId != null ? endpointConstants.jobId : ''; - metadata.datahubCreatedBy = xdmp.getCurrentUser(); - metadata.datahubCreatedOn = fn.currentDateTime(); - return metadata; -} - -/** - * Generate an uri for an input object. - * - * @param uriTemplateRegEx The precompiled URI regular expression or null if not used. - * @param record The record we want to create an URI for. - * @param endpointConstants The input options - * @returns A random or template generated URI based on the options. - */ -function generateUri(record, endpointConstants) { - let uriTemplateRegEx = endpointConstants.uriTemplateRegEx; - if ( !uriTemplateRegEx ) { - // we cache the regex for this batch.s - uriTemplateRegEx = endpointConstants.uritemplate ? new RegExp("{([^}]+)}", 'gi') : null; - endpointConstants.uriTemplateRegEx = uriTemplateRegEx; - } - if ( uriTemplateRegEx === null ) { - const uriPrefix = endpointConstants.uriprefix != null ? endpointConstants.uriprefix : ""; - return uriPrefix + sem.uuidString() + ".json"; - } else { - const uriTemplate = endpointConstants.uritemplate; - return uriTemplate.replace(uriTemplateRegEx, function (match, group) { - return convertPropertyValueToString(record, group, uriTemplate); - }); - } -} - -/** - * Used when replacing property references in a uriTemplate. - * - * @param record - * @param propertyName - * @param uriTemplate - * @returns {string} - */ -function convertPropertyValueToString(record, propertyName, uriTemplate) { - let propertyValue = record[propertyName]; - const type = typeof propertyValue; - if (propertyValue === null) { - throw new Error("Property '" + propertyName + "' is null, but is required by uriTemplate: " + uriTemplate); - } else if (type === "undefined") { - throw new Error("Property '" + propertyName + "' is undefined, but is required by uriTemplate: " + uriTemplate); - } else if (type === "object") { - throw new Error("Property '" + propertyName + "' is an object, but must be a scalar value as it is used in uriTemplate: " + uriTemplate); - } else if (type === "function") { - throw new Error("Property '" + propertyName + "' is a function, but must be a scalar value as it is used in uriTemplate: " + uriTemplate); - } - return String(propertyValue); -} - -function normalizeInputToArray(input) { - var inputArray; - if (input instanceof Sequence) { - inputArray = input.toArray().map(item => fn.head(xdmp.fromJSON(item))); - } else if (input instanceof Document) { - inputArray = [fn.head(xdmp.fromJSON(input))]; - } else { - // Assumed to be an array at this point, which is the case for unit tests - inputArray = fn.head(xdmp.fromJSON(input)); - } - return inputArray; -} - -module.exports = { - buildHeaders, - buildInsertOptions, - convertPropertyValueToString, - generateUri, - normalizeInputToArray -} diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeRecords.api b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeRecords.api deleted file mode 100644 index 5c5b634ec4..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeRecords.api +++ /dev/null @@ -1,22 +0,0 @@ -{ - "endpoint": "/marklogic-data-hub-spark-connector/writeRecords.sjs", - "functionName": "writeRecords", - "desc": "Supports the Spark connector in writing many records at once", - "params": [ - { - "name": "endpointConstants", - "datatype": "jsonDocument", - "multiple": false, - "nullable": true - }, - { - "name": "input", - "datatype": "jsonDocument", - "multiple": true, - "nullable": true - } - ], - "$bulk": { - "inputBatchSize": 100 - } -} diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeRecords.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeRecords.sjs deleted file mode 100644 index 3d094d06ad..0000000000 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/marklogic-data-hub-spark-connector/writeRecords.sjs +++ /dev/null @@ -1,43 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -declareUpdate(); - -// No privilege required: This endpoint is called by the spark connector. - -const mjsProxy = require("/data-hub/core/util/mjsProxy.sjs"); -const consts = mjsProxy.requireMjsModule("/data-hub/5/impl/consts.mjs"); -const flowUtils = mjsProxy.requireMjsModule("/data-hub/5/impl/flow-utils.mjs"); -const temporal = require("/MarkLogic/temporal.xqy"); -const writeLib = require("writeLib.sjs"); - -var endpointConstants = fn.head(xdmp.fromJSON(endpointConstants)); -const inputArray = writeLib.normalizeInputToArray(input); - -const insertOptions = writeLib.buildInsertOptions(endpointConstants); -const headers = writeLib.buildHeaders(endpointConstants); - -inputArray.forEach(record => { - const uri = writeLib.generateUri(record, endpointConstants); - const envelope = flowUtils.makeEnvelope(record, headers, [], consts.JSON); - - if (insertOptions.temporalCollection) { - temporal.documentInsert(insertOptions.temporalCollection, uri, envelope, insertOptions.options); - } else { - xdmp.documentInsert(uri, envelope, insertOptions.options); - } -}); diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/flow/TemporalWriteTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/flow/TemporalWriteTest.java index 73cd33a1ea..1d0fe26816 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/flow/TemporalWriteTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/flow/TemporalWriteTest.java @@ -88,45 +88,6 @@ void writeTemporalFile() { } } - @Test - void ingestDocWithTemporalCollection() { - String collections = "fruits,stuff,temporal/test"; - ObjectNode endpointConstants = objectMapper.createObjectNode(); - endpointConstants.put("uriprefix", "/bulkJavaTest/"); - endpointConstants.put("collections", collections); - - /** - * Because the endpoint and the Spark connector must work on 5.2.x, the endpoint cannot rely on hub-temporal.sjs, - * which does not exist in 5.2.x. So this test depends on the user having the temporal-admin role, which is the - * only way that temporal documents can be inserted by a DHF user prior to 5.2.x. - */ - runAsTestUserWithRoles("data-hub-operator", "temporal-admin"); - - InputCaller endpoint = InputCaller.on( - getHubClient().getStagingClient(), - getHubClient().getModulesClient().newTextDocumentManager() - .read("/marklogic-data-hub-spark-connector/writeRecords.api", new StringHandle()), - new StringHandle().withFormat(Format.JSON) - ); - InputCaller.BulkInputCaller bulkInputCaller = endpoint.bulkCaller(endpoint.newCallContext() - .withEndpointConstants(new JacksonHandle(endpointConstants))); - - List input = new ArrayList<>(); - input.add("{\"fruitName\":\"pineapple\", \"fruitColor\":\"green\"}"); - - input.forEach(bulkInputCaller::accept); - bulkInputCaller.awaitCompletion(); - - DocumentMetadataHandle metadata = getDocumentMetadata(); - assertEquals(collections.split(",").length + 2, metadata.getCollections().size(), "documents inserted via temporal collection has 2 new collections 'latest and uri'"); - assertTrue(metadata.getCollections().contains("fruits")); - assertTrue(metadata.getCollections().contains("stuff")); - assertTrue(metadata.getCollections().contains("temporal/test")); - assertTrue(metadata.getCollections().contains("latest"), "As the document is in Lastest collection, temporal/test was recognized as a temporal collection and document was invserted via temporal insert"); - - - } - private void removeIndexesAndFields() { String indexesDeletion = " const admin = require('/MarkLogic/admin.xqy');\n" + " var config = admin.getConfiguration();\n" + diff --git a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/lib/ingestionService.mjs b/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/lib/ingestionService.mjs deleted file mode 100644 index c56f244d34..0000000000 --- a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/lib/ingestionService.mjs +++ /dev/null @@ -1,10 +0,0 @@ -function ingest(endpointConstants, endpointState, input) { - return fn.head(xdmp.invoke( - "/marklogic-data-hub-spark-connector/writeRecords.sjs", - {endpointConstants, endpointState, input} - )); -} - -export default { - ingest -}; diff --git a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/partitionLib/getPartitionBatchTest.mjs b/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/partitionLib/getPartitionBatchTest.mjs deleted file mode 100644 index 557fbdea42..0000000000 --- a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/partitionLib/getPartitionBatchTest.mjs +++ /dev/null @@ -1,52 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -const partitionLib = require('/marklogic-data-hub-spark-connector/partition-lib.xqy'); -const test = require("/test/test-helper.xqy"); - -const assertions = []; - -// We don't need huge unsignedLong's here to test the math -const partition = { - min: 10, - max: 95, - partitionBatchSize: 10, - batchCount: 9 -}; - -const firstBatch = partitionLib.getPartitionBatch(partition, 1); -assertions.push( - test.assertEqual("10", firstBatch.min, "A string is returned to ensure the SJS code doesn't have any " + - "problem with an unsignedLong that it can't handle"), - test.assertEqual("19", firstBatch.max) -); - -const lastBatch = partitionLib.getPartitionBatch(partition, 9); -assertions.push( - test.assertEqual("90", lastBatch.min), - test.assertEqual("95", lastBatch.max, "The last batch should have a max value equal to the max of the partition") -); - -const afterLastBatch = partitionLib.getPartitionBatch(partition, 10); -assertions.push( - test.assertEqual("90", afterLastBatch.min, "If the client specifies a batchNumber higher than batchCount, " + - "then the batch associated with the value of batchCount should be returned. This seems better than throwing an " + - "error or returning an invalid partition"), - test.assertEqual("95", afterLastBatch.max) -); - -assertions diff --git a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/partitionLib/makePartitionsTest.mjs b/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/partitionLib/makePartitionsTest.mjs deleted file mode 100644 index 1d305a2d6e..0000000000 --- a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/partitionLib/makePartitionsTest.mjs +++ /dev/null @@ -1,51 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -const partitionLib = require('/marklogic-data-hub-spark-connector/partition-lib.xqy'); -const test = require("/test/test-helper.xqy"); - -const assertions = []; - -let partitions = partitionLib.makePartitions(1); -assertions.push( - test.assertEqual(1, partitions.length), - test.assertEqual(0, partitions[0].min), - test.assertEqual(xs.unsignedLong(18446744073709551615), partitions[0].max) -); - -partitions = partitionLib.makePartitions(2); -assertions.push( - test.assertEqual(2, partitions.length), - test.assertEqual(0, partitions[0].min), - test.assertEqual(9223372036854775806, partitions[0].max), - test.assertEqual(9223372036854775807, partitions[1].min), - test.assertEqual(xs.unsignedLong(18446744073709551615), partitions[1].max) -); - -partitions = partitionLib.makePartitions(10); -assertions.push( - test.assertEqual(10, partitions.length), - test.assertEqual(0, partitions[0].min), - test.assertEqual(1844674407370955160, partitions[0].max, - "Verifying that a decimal value isn't returned here, as if it were, the sql.rowID function would later throw an " + - "error because it does not allow decimals after the viewID"), - test.assertEqual(16602069666338596449, partitions[9].min), - test.assertEqual(18446744073709551615, partitions[9].max, - "The last partition should always have the max unsignedLong value as its max rowID") -); - -assertions; diff --git a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeLib/convertPropertyValueToString.mjs b/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeLib/convertPropertyValueToString.mjs deleted file mode 100644 index 7a65ae024b..0000000000 --- a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeLib/convertPropertyValueToString.mjs +++ /dev/null @@ -1,59 +0,0 @@ -/** - Copyright (c) 2021 MarkLogic Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ -'use strict'; - -const test = require("/test/test-helper.xqy"); -const writeLib = require('/marklogic-data-hub-spark-connector/writeLib.sjs'); - -const propertyName = "firstName"; - -// The template doesn't matter here, it's only used for producing a nicer error message -const uriTemplate = "doesnt-matter"; - -const assertions = [ - test.assertEqual("Jane", writeLib.convertPropertyValueToString({firstName: "Jane"}, propertyName, uriTemplate)), - test.assertEqual("3", writeLib.convertPropertyValueToString({firstName: 3}, propertyName, uriTemplate)) -]; - -try { - writeLib.convertPropertyValueToString({lastName: "Jane"}, propertyName, uriTemplate); - throw Error("Expected exception because firstName is undefined"); -} catch (e) { - assertions.push(test.assertEqual("Property 'firstName' is undefined, but is required by uriTemplate: doesnt-matter", e.message)); -} - -try { - writeLib.convertPropertyValueToString({firstName: null}, propertyName, uriTemplate); - throw Error("Expected exception because firstName is null"); -} catch (e) { - assertions.push(test.assertEqual("Property 'firstName' is null, but is required by uriTemplate: doesnt-matter", e.message)); -} - -try { - writeLib.convertPropertyValueToString({firstName: {"hello": "world"}}, propertyName, uriTemplate); - throw Error("Expected exception because firstName is an object"); -} catch (e) { - assertions.push(test.assertEqual("Property 'firstName' is an object, but must be a scalar value as it is used in uriTemplate: doesnt-matter", e.message)); -} - -try { - writeLib.convertPropertyValueToString({firstName: function(){}}, propertyName, uriTemplate); - throw Error("Expected exception because firstName is a function"); -} catch (e) { - assertions.push(test.assertEqual("Property 'firstName' is a function, but must be a scalar value as it is used in uriTemplate: doesnt-matter", e.message)); -} - -assertions diff --git a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestOnlySourceName.mjs b/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestOnlySourceName.mjs deleted file mode 100644 index 7a069363fb..0000000000 --- a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestOnlySourceName.mjs +++ /dev/null @@ -1,21 +0,0 @@ -const test = require("/test/test-helper.xqy"); -import hubTest from "/test/data-hub-test-helper.mjs"; -import ingestionService from "../lib/ingestionService.mjs"; - -ingestionService.ingest( - { - "sourcename": "bulkSourceName", - "collections": "bulkSourceTest" - }, - {}, [{"testDoc": "one"}] -); - -const record = hubTest.getRecordInCollection("bulkSourceTest"); -const envelope = record.document.envelope; - -[ - test.assertEqual(1, envelope.headers.sources.length), - test.assertEqual("bulkSourceName", envelope.headers.sources[0].datahubSourceName), - test.assertFalse(envelope.headers.sources[0].hasOwnProperty("datahubSourceType"), - "datahubSourceType should not be set since sourcetype was not set") -]; diff --git a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestOnlySourceType.mjs b/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestOnlySourceType.mjs deleted file mode 100644 index 91db52b101..0000000000 --- a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestOnlySourceType.mjs +++ /dev/null @@ -1,21 +0,0 @@ -const test = require("/test/test-helper.xqy"); -import hubTest from "/test/data-hub-test-helper.mjs"; -import ingestionService from "../lib/ingestionService.mjs"; - -ingestionService.ingest( - { - "sourcetype": "bulkSourceType", - "collections": "bulkSourceTest" - }, - {}, [{"testDoc": "one"}] -); - -const record = hubTest.getRecordInCollection("bulkSourceTest"); -const envelope = record.document.envelope; - -[ - test.assertEqual(1, envelope.headers.sources.length), - test.assertEqual("bulkSourceType", envelope.headers.sources[0].datahubSourceType), - test.assertFalse(envelope.headers.sources[0].hasOwnProperty("name"), - "name should not be set if sourcename was not set") -]; diff --git a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithAllWorkUnitParams.mjs b/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithAllWorkUnitParams.mjs deleted file mode 100644 index b8721ef49f..0000000000 --- a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithAllWorkUnitParams.mjs +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -const test = require("/test/test-helper.xqy"); -import hubTest from "/test/data-hub-test-helper.mjs"; -import ingestionService from "../lib/ingestionService.mjs"; - -// Intended to test every possible param in a workUnit in a single test -// Please add to this as new params are defined - -const workUnit = { - collections: "bulkOne,bulkTwo", - permissions: "rest-reader,read,rest-extension-user,update", - uriprefix: "/bulkTest/", - sourcename: "bulkSourceName", - sourcetype: "bulkSourceType" -}; - -ingestionService.ingest(workUnit, {}, [{"testDoc": "one"}]); - -const record = hubTest.getRecordInCollection("bulkOne"); -const envelope = record.document.envelope; - -[ - test.assertTrue(record.uri.endsWith(".json"), "The endpoint only supports JSON, so .json should be the suffix of the URI"), - - test.assertEqual(xdmp.getCurrentUser(), envelope.headers.createdBy), - test.assertTrue(envelope.headers.createdOn != null), - test.assertEqual(1, envelope.headers.sources.length), - test.assertEqual("bulkSourceName", envelope.headers.sources[0].datahubSourceName), - test.assertEqual("bulkSourceType", envelope.headers.sources[0].datahubSourceType), - test.assertEqual("one", envelope.instance.testDoc, "The ingested data should have been wrapped in envelope/instance"), - - test.assertEqual(2, record.collections.length), - test.assertEqual("bulkOne", record.collections[0]), - test.assertEqual("bulkTwo", record.collections[1]), - - test.assertEqual(2, Object.keys(record.permissions).length), - test.assertEqual("read", record.permissions["rest-reader"][0]), - test.assertEqual("update", record.permissions["rest-extension-user"][0]) -]; diff --git a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithOnlyCollections.mjs b/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithOnlyCollections.mjs deleted file mode 100644 index 0af6673523..0000000000 --- a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithOnlyCollections.mjs +++ /dev/null @@ -1,21 +0,0 @@ -const test = require("/test/test-helper.xqy"); -import hubTest from "/test/data-hub-test-helper.mjs"; -import ingestionService from "../lib/ingestionService.mjs"; - -const workUnit = { - collections: "bulkOne,bulkTwo" -}; - -ingestionService.ingest(workUnit, {}, [{"testDoc": "one"}]); - -const doc = hubTest.getRecordInCollection("bulkOne"); -const envelope = doc.document.envelope; - -[ - test.assertFalse(doc.uri.startsWith("/"), "If no uriprefix is specified, a '/' should be added by default, as the user may not want that"), - test.assertFalse(doc.uri.startsWith("null"), "If no uriprefix is specified, the URI should not start with 'null'"), - - test.assertEqual(2, doc.collections.length), - test.assertEqual("bulkOne", doc.collections[0]), - test.assertEqual("bulkTwo", doc.collections[1]) -]; diff --git a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithOnlyUriPrefix.mjs b/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithOnlyUriPrefix.mjs deleted file mode 100644 index 7cc65c95a4..0000000000 --- a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestWithOnlyUriPrefix.mjs +++ /dev/null @@ -1,24 +0,0 @@ -const test = require("/test/test-helper.xqy"); -import hubTest from "/test/data-hub-test-helper.mjs"; -import ingestionService from "../lib/ingestionService.mjs"; - -ingestionService.ingest({uriprefix: "/bulkTest/"}, {}, [ - {"testDoc": "one"}, - {"testDoc": "two"} -]); - -const uris = xdmp.eval('cts.uriMatch("/bulkTest/**")').toArray(); - -const assertions = [ - test.assertEqual(2, uris.length) -]; - -uris.forEach(uri => { - const record = hubTest.getRecord(uri); - assertions.push( - test.assertEqual(0, record.collections.length, - "Since no collections were specified, the URI should not in any collections by default") - ); -}); - -assertions; diff --git a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestionWithNullParams.mjs b/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestionWithNullParams.mjs deleted file mode 100644 index 98bc2be91c..0000000000 --- a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/ingestionWithNullParams.mjs +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -const test = require("/test/test-helper.xqy"); -import hubTest from "/test/data-hub-test-helper.mjs"; -import ingestionService from "../lib/ingestionService.mjs"; - -// Including collections so there's an easy way to find the doc -const workUnit = { - collections: "bulkTest", - permissions: null, - uriprefix: null, - sourcename: null, - sourcetype: null -}; - -ingestionService.ingest(workUnit, {}, [{"testDoc": "one"}]); - -const record = hubTest.getRecordInCollection("bulkTest"); -const envelope = record.document.envelope; - -[ - test.assertFalse(record.uri.startsWith("null"), - "When uriprefix is null, the string 'null' should not be added to the URI as a prefix"), - - test.assertEqual(null, envelope.headers.sources, - "No sources should have been created since sourcename and sourcetype are both null"), - test.assertEqual("one", envelope.instance.testDoc, "The ingested data should have been wrapped in envelope/instance"), - - // Should use default permissions - test.assertEqual(1, Object.keys(record.permissions).length), - test.assertEqual("read", record.permissions["data-hub-operator"][0]), - test.assertEqual("update", record.permissions["data-hub-operator"][1]), - - //should add default metadata - test.assertExists(record.metadata.datahubCreatedOn), - test.assertExists(record.metadata.datahubCreatedBy), - test.assertNotEqual('', record.metadata.datahubCreatedBy), - test.assertExists(record.metadata.datahubCreatedByJob) -]; diff --git a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/setup.xqy b/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/setup.xqy deleted file mode 100644 index 2efc54633d..0000000000 --- a/marklogic-data-hub/src/test/ml-modules/root/test/suites/marklogic-data-hub-spark-connector/writeRecords/setup.xqy +++ /dev/null @@ -1,3 +0,0 @@ -xquery version "1.0-ml"; -import module namespace hub-test = "http://marklogic.com/data-hub/test" at "/test/data-hub-test-helper.xqy"; -hub-test:reset-hub() diff --git a/settings.gradle b/settings.gradle index d8abfdee40..b3cebe6a71 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,7 +7,6 @@ include ':marklogic-data-hub-client-jar' include ':installer-for-dhs' include ':ml-data-hub-plugin' include ':marklogic-data-hub-central' -include ':marklogic-data-hub-spark-connector' include ':performance-tests' project(':ml-data-hub-plugin').name = 'ml-data-hub' diff --git a/specs/models/Job.schema.json b/specs/models/Job.schema.json index b25dc16120..7ced626a33 100644 --- a/specs/models/Job.schema.json +++ b/specs/models/Job.schema.json @@ -46,10 +46,6 @@ "type": "string", "description": "dateTime at which the job ended" }, - "externalMetadata": { - "type": "object", - "description": "Captures metadata related to Spark when a document is ingested via the Data Hub Spark connector" - }, "stepResponses": { "type": "object", "description": "For each step that was executed, a key with a name equaling the step number of the step will be present",