From 7aa620d93effabc8404d0005fba1f5c59bef64dc Mon Sep 17 00:00:00 2001 From: Florian Esser Date: Tue, 7 Jul 2020 14:10:13 +0200 Subject: [PATCH 01/24] build: new development snapshot --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index c4d2f1d..cc02779 100644 --- a/build.gradle +++ b/build.gradle @@ -24,10 +24,10 @@ sourceCompatibility = '1.8' group = 'to.wetransform' project.ext { - haleVersion = '4.0.0' + haleVersion = '4.1.0-SNAPSHOT' } -version = '4.0.1-SNAPSHOT' +version = '4.1.0-SNAPSHOT' /* * Dependencies From 7ca5a714bf96f734c25764e9adfd9472d6e651be Mon Sep 17 00:00:00 2001 From: Simon Templer Date: Mon, 10 Aug 2020 14:35:30 +0200 Subject: [PATCH 02/24] feat: support specifying filters when loading instance data This reuses the functionality found in the command for the transformation. SVC-516 --- .../halecli/util/InstanceCLI.groovy | 77 ++++- .../halecli/data/RewriteCommandTest.groovy | 268 ++++++++++++++++++ src/test/resources/testdata/inspire2.gml | 187 ++++++++++++ 3 files changed, 528 insertions(+), 4 deletions(-) create mode 100644 src/test/resources/testdata/inspire2.gml diff --git a/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy b/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy index c1623f3..d148d52 100644 --- a/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy +++ b/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy @@ -37,6 +37,7 @@ import eu.esdihumboldt.hale.common.core.io.supplier.LocatableInputSupplier import eu.esdihumboldt.hale.common.core.io.supplier.LocatableOutputSupplier import eu.esdihumboldt.hale.common.core.report.ReportHandler; import eu.esdihumboldt.hale.common.core.service.ServiceProvider; +import eu.esdihumboldt.hale.common.headless.transform.filter.InstanceFilterDefinition import eu.esdihumboldt.hale.common.instance.io.InstanceReader import eu.esdihumboldt.hale.common.instance.io.InstanceWriter; import eu.esdihumboldt.hale.common.instance.model.InstanceCollection @@ -58,12 +59,72 @@ import groovy.util.OptionAccessor */ class InstanceCLI { - static void loadOptions(CliBuilder cli, String argName = 'data', String descr = 'Data to load') { + static void loadOptions(CliBuilder cli, String argName = 'data', String descr = 'Data to load', boolean allowFilter = true) { cli._(longOpt: argName, args:1, argName:'file-or-URL', descr) cli._(longOpt: argName + '-setting', args:2, valueSeparator:'=', argName:'setting=value', 'Setting for instance reader (optional, repeatable)') cli._(longOpt: argName + '-reader', args:1, argName: 'provider-id', 'Identifier of instance reader to use (otherwise auto-detect)') + + // filter options + if (allowFilter) { + filterOptions(cli, argName) + } + } + + static void filterOptions(CliBuilder cli, String argName) { + def prefix = argName ? argName + '-' : '' + cli._(longOpt: prefix + 'filter', args: 1, argName: 'filter', + 'Filter expression that is checked against all objects read from the source. The filter language can be specified at the beginning of the filter expression, followed by a colon. If no language is provided explicitly, the expression is assumed to be CQL. If multiple filters are provided an object must only match one of them.') + cli._(longOpt: prefix + 'exclude', args: 1, argName: 'filter', + 'All objects matching the filter will be exlcuded.') + cli._(longOpt: prefix + 'filter-on', args: 2, valueSeparator:'=', argName: 'type=filter', + 'Filter on a specific type only. You can specify the type\'s name with or without namespace. If you want to specify the namespace, wrap it in curly braces and prepend it to the type name.') + cli._(longOpt: prefix + 'exclude-type', args: 1, argName: 'type', + 'Exclude a specific type') + } + + static InstanceFilterDefinition createFilter(OptionAccessor options, String argName) { + def prefix = argName ? argName + '-' : '' + InstanceFilterDefinition res = null + + def filter = options."${prefix}filters" // magic "s" at the end yields a list + if (filter) { + if (!res) res = new InstanceFilterDefinition(); + + filter.each { + res.addUnconditionalFilter(it) + } + } + + filter = options."${prefix}excludes" + if (filter) { + if (!res) res = new InstanceFilterDefinition(); + + filter.each { + res.addExcludeFilter(it) + } + } + + filter = options."${prefix}filter-ons" + if (filter) { + if (!res) res = new InstanceFilterDefinition(); + + filter.toSpreadMap().each { key, value -> + res.addTypeFilter(key, value) + } + } + + filter = options."${prefix}exclude-types" + if (filter) { + if (!res) res = new InstanceFilterDefinition(); + + filter.each { + res.addExcludedType(it) + } + } + + return res } static InstanceCollection load(OptionAccessor options, TypeIndex schema, String argName = 'data') { @@ -78,7 +139,9 @@ class InstanceCLI { String customProvider = options."${argName}-reader" ?: null - return load(loc, settings, customProvider, schema, reports) + InstanceFilterDefinition filter = createFilter(options, argName) + + return load(loc, settings, customProvider, schema, reports, filter) } else { return null @@ -87,7 +150,7 @@ class InstanceCLI { @CompileStatic static InstanceCollection load(URI loc, Map settings, String customProvider, - TypeIndex schema, ReportHandler reports) { + TypeIndex schema, ReportHandler reports, InstanceFilterDefinition filter = null) { Pair readerInfo = prepareReader(loc, InstanceReader, settings, customProvider) InstanceReader instanceReader = readerInfo.first @@ -99,7 +162,13 @@ class InstanceCLI { IOReport report = instanceReader.execute(null) reports?.publishReport(report) - instanceReader.getInstances() + InstanceCollection result = instanceReader.getInstances() + + if (filter) { + result = result.select(filter) + } + + return result } // save data diff --git a/src/test/groovy/to/wetransform/halecli/data/RewriteCommandTest.groovy b/src/test/groovy/to/wetransform/halecli/data/RewriteCommandTest.groovy index 00642c4..59e026d 100644 --- a/src/test/groovy/to/wetransform/halecli/data/RewriteCommandTest.groovy +++ b/src/test/groovy/to/wetransform/halecli/data/RewriteCommandTest.groovy @@ -18,6 +18,7 @@ package to.wetransform.halecli.data import static org.junit.Assert.* import org.junit.BeforeClass +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.contrib.java.lang.system.SystemOutRule @@ -139,4 +140,271 @@ class RewriteCommandTest { } } + @Test + void testRewriteFilter() { + + def args = ['data', 'rewrite']; + + args << '--data' + args << getClass().getClassLoader().getResource("testdata/inspire2.gml") + + args << '--data-filter' + args << "CQL:id = 'A1'" + + def targetFile = File.createTempFile('rewrite', '.gml') + args << '--target' + args << targetFile.absolutePath + args << '--target-writer' + args << 'eu.esdihumboldt.hale.io.gml.writer' + args << '--target-setting' + args << 'xml.pretty=true' + + try { + int code = new Runner('hale').run(args as String[]) + + // expecting a successful execution + assertEquals(0, code) + + assertTrue(targetFile.exists()) + assertTrue(targetFile.size() > 0) + + def xml = new XmlSlurper().parse(targetFile) + def objects = xml.featureMember + + assertEquals(1, objects.size()) + } finally { + targetFile.delete() + } + } + + @Test + void testRewriteFilterList() { + + def args = ['data', 'rewrite']; + + args << '--data' + args << getClass().getClassLoader().getResource("testdata/inspire2.gml") + + args << '--data-filter' + args << "CQL:id = 'SW1'" + + args << '--data-filter' + args << "CQL:id = 'A1'" + + def targetFile = File.createTempFile('rewrite', '.gml') + args << '--target' + args << targetFile.absolutePath + args << '--target-writer' + args << 'eu.esdihumboldt.hale.io.gml.writer' + args << '--target-setting' + args << 'xml.pretty=true' + + try { + int code = new Runner('hale').run(args as String[]) + + // expecting a successful execution + assertEquals(0, code) + + assertTrue(targetFile.exists()) + assertTrue(targetFile.size() > 0) + + def xml = new XmlSlurper().parse(targetFile) + def objects = xml.featureMember + + assertEquals(2, objects.size()) + def wcs = objects.Watercourse + assertEquals(1, wcs.size()) + def sws = objects.StandingWater + assertEquals(1, sws.size()) + } finally { + targetFile.delete() + } + } + + @Test + void testRewriteExcludeType() { + + def args = ['data', 'rewrite']; + + args << '--data' + args << getClass().getClassLoader().getResource("testdata/inspire2.gml") + + args << '--data-exclude-type' + args << 'Watercourse' + + def targetFile = File.createTempFile('rewrite', '.gml') + args << '--target' + args << targetFile.absolutePath + args << '--target-writer' + args << 'eu.esdihumboldt.hale.io.gml.writer' + args << '--target-setting' + args << 'xml.pretty=true' + + try { + int code = new Runner('hale').run(args as String[]) + + // expecting a successful execution + assertEquals(0, code) + + assertTrue(targetFile.exists()) + assertTrue(targetFile.size() > 0) + + def xml = new XmlSlurper().parse(targetFile) + def objects = xml.featureMember + + assertEquals(1, objects.size()) + def wcs = objects.Watercourse + assertEquals(0, wcs.size()) + def sws = objects.StandingWater + assertEquals(1, sws.size()) + } finally { + targetFile.delete() + } + } + + @Ignore('Does not succeed due to bug in hale InstanceFilterDefinition - exclude is ignored if no other filter is present') + @Test + void testRewriteExclude() { + + def args = ['data', 'rewrite']; + + args << '--data' + args << getClass().getClassLoader().getResource("testdata/inspire2.gml") + + args << '--data-exclude' + args << "\"id\" = 'A2'" + + def targetFile = File.createTempFile('rewrite', '.gml') + args << '--target' + args << targetFile.absolutePath + args << '--target-writer' + args << 'eu.esdihumboldt.hale.io.gml.writer' + args << '--target-setting' + args << 'xml.pretty=true' + + try { + int code = new Runner('hale').run(args as String[]) + + // expecting a successful execution + assertEquals(0, code) + + assertTrue(targetFile.exists()) + assertTrue(targetFile.size() > 0) + + def xml = new XmlSlurper().parse(targetFile) + def objects = xml.featureMember + + assertEquals(3, objects.size()) + def wcs = objects.Watercourse + assertEquals(2, wcs.size()) + def sws = objects.StandingWater + assertEquals(1, sws.size()) + } finally { + targetFile.delete() + } + } + + @Test + void testRewriteExcludeWorkaround() { + + def args = ['data', 'rewrite']; + + args << '--data' + args << getClass().getClassLoader().getResource("testdata/inspire2.gml") + + args << '--data-exclude' + args << "\"id\" = 'A2'" + + args << '--data-exclude-type' + args << 'DoesNotExist' + + def targetFile = File.createTempFile('rewrite', '.gml') + args << '--target' + args << targetFile.absolutePath + args << '--target-writer' + args << 'eu.esdihumboldt.hale.io.gml.writer' + args << '--target-setting' + args << 'xml.pretty=true' + + try { + int code = new Runner('hale').run(args as String[]) + + // expecting a successful execution + assertEquals(0, code) + + assertTrue(targetFile.exists()) + assertTrue(targetFile.size() > 0) + + def xml = new XmlSlurper().parse(targetFile) + def objects = xml.featureMember + + assertEquals(3, objects.size()) + def wcs = objects.Watercourse + assertEquals(2, wcs.size()) + def sws = objects.StandingWater + assertEquals(1, sws.size()) + } finally { + targetFile.delete() + } + } + + @Test + void testRewriteFilterContext() { + + def args = ['data', 'rewrite']; + + args << '--data' + args << getClass().getClassLoader().getResource("testdata/inspire2.gml") + + args << '--data-filter' + args << '''groovy: + def type = instance.definition.name + boolean rejected = false + if (type) { + withContext { c -> + def typeMap = c.typeCounts + if (!typeMap) { + typeMap = [:] + c.typeCounts = typeMap + } + def count = typeMap[type] ?: 0 + if (count >= 2) { // only keep max 2 per type + rejected = true + } + typeMap[type] = count + 1 + } + } + !rejected + ''' + + def targetFile = File.createTempFile('rewrite', '.gml') + args << '--target' + args << targetFile.absolutePath + args << '--target-writer' + args << 'eu.esdihumboldt.hale.io.gml.writer' + args << '--target-setting' + args << 'xml.pretty=true' + + try { + int code = new Runner('hale').run(args as String[]) + + // expecting a successful execution + assertEquals(0, code) + + assertTrue(targetFile.exists()) + assertTrue(targetFile.size() > 0) + + def xml = new XmlSlurper().parse(targetFile) + def objects = xml.featureMember + + assertEquals(3, objects.size()) + def wcs = objects.Watercourse + assertEquals(2, wcs.size()) + def sws = objects.StandingWater + assertEquals(1, sws.size()) + } finally { + targetFile.delete() + } + } + } diff --git a/src/test/resources/testdata/inspire2.gml b/src/test/resources/testdata/inspire2.gml new file mode 100644 index 0000000..773067e --- /dev/null +++ b/src/test/resources/testdata/inspire2.gml @@ -0,0 +1,187 @@ + + + + + Contains Ordnance Survey data © Crown copyright and database right 2011 + + + + eng + + + + + + + + Latn + + + + + + + + + + -207345.13554061973 6188201.421230434 -207088.75251305848 6188170.108745712 -207079.05134511134 6188169.882136189 -207069.49237461493 6188171.552484499 -207060.44294713344 6188175.05559922 -207052.25082646974 6188180.2568569295 -207045.2308303879 6188186.95637582 -207039.65273247706 6188194.896697085 -207035.7308950388 6188203.772678946 -207033.6160314005 6188213.243223019 -207033.38941418834 6188222.944382441 -207035.0597521289 6188232.503348024 -207038.56285538268 6188241.552774954 -207043.7641022785 6188249.7448995095 -207050.46361265122 6188256.764903343 -207058.4039289998 6188262.343011683 -207067.27991029166 6188266.264860648 -207076.75045823038 6188268.379735156 -207346.58189882734 6188301.335158737 -207355.3819901311 6188301.621076353 -207364.09352927096 6188300.34339694 -207372.44090120192 6188297.5425429335 -207520.13910204603 6188232.858446235 -207724.51641284954 6188199.20473434 -207902.52683724207 6188237.357314383 -207912.1689432416 6188238.451134508 -207921.83917418402 6188237.642855512 -207931.16590836574 6188234.963538198 -207939.79072413384 6188230.516146437 -207947.38217390387 6188224.471590458 -207953.64852161508 6188217.06215895 -207958.34895412554 6188208.572592365 -207961.3028356639 6188199.3291404685 -207962.39664967917 6188189.6870246865 -207961.58836130193 6188180.016787026 -207958.9090327518 6188170.69005021 -207954.46162961132 6188162.06523629 -207948.41706384148 6188154.473792566 -207941.00762561732 6188148.207454177 -207932.5180564077 6188143.507032843 -207923.27460638422 6188140.553162624 -207736.09752724937 6188100.436239479 -207726.90991634503 6188099.35125106 -207717.68087491766 6188099.994804791 -207497.92639998137 6188136.180968051 -207486.11116307578 6188139.681000924 -207345.13554061973 6188201.421230434 + + + + + + + _d1a6215e-3185-429f-b9b1-f160437e4f99 + _example + + + + + + + + + + + + 4.573170731707317 + 4.573170731707317 + + + + + + + Contains Ordnance Survey data © Crown copyright and database right 2011 + + + + eng + + + + + + + + Latn + + + + + + + + + + -207345.13554061973 6188201.421230434 -207088.75251305848 6188170.108745712 -207079.05134511134 6188169.882136189 -207069.49237461493 6188171.552484499 -207060.44294713344 6188175.05559922 -207052.25082646974 6188180.2568569295 -207045.2308303879 6188186.95637582 -207039.65273247706 6188194.896697085 -207035.7308950388 6188203.772678946 -207033.6160314005 6188213.243223019 -207033.38941418834 6188222.944382441 -207035.0597521289 6188232.503348024 -207038.56285538268 6188241.552774954 -207043.7641022785 6188249.7448995095 -207050.46361265122 6188256.764903343 -207058.4039289998 6188262.343011683 -207067.27991029166 6188266.264860648 -207076.75045823038 6188268.379735156 -207346.58189882734 6188301.335158737 -207355.3819901311 6188301.621076353 -207364.09352927096 6188300.34339694 -207372.44090120192 6188297.5425429335 -207520.13910204603 6188232.858446235 -207724.51641284954 6188199.20473434 -207902.52683724207 6188237.357314383 -207912.1689432416 6188238.451134508 -207921.83917418402 6188237.642855512 -207931.16590836574 6188234.963538198 -207939.79072413384 6188230.516146437 -207947.38217390387 6188224.471590458 -207953.64852161508 6188217.06215895 -207958.34895412554 6188208.572592365 -207961.3028356639 6188199.3291404685 -207962.39664967917 6188189.6870246865 -207961.58836130193 6188180.016787026 -207958.9090327518 6188170.69005021 -207954.46162961132 6188162.06523629 -207948.41706384148 6188154.473792566 -207941.00762561732 6188148.207454177 -207932.5180564077 6188143.507032843 -207923.27460638422 6188140.553162624 -207736.09752724937 6188100.436239479 -207726.90991634503 6188099.35125106 -207717.68087491766 6188099.994804791 -207497.92639998137 6188136.180968051 -207486.11116307578 6188139.681000924 -207345.13554061973 6188201.421230434 + + + + + + + _d1a6215e-3185-429f-b9b1-f160437e4f99 + _example + + + + + + + + + + + + 4.573170731707317 + 4.573170731707317 + + + + + + + Contains Ordnance Survey data © Crown copyright and database right 2011 + + + + eng + + + + + + + + Latn + + + + + + + + + + -207345.13554061973 6188201.421230434 -207088.75251305848 6188170.108745712 -207079.05134511134 6188169.882136189 -207069.49237461493 6188171.552484499 -207060.44294713344 6188175.05559922 -207052.25082646974 6188180.2568569295 -207045.2308303879 6188186.95637582 -207039.65273247706 6188194.896697085 -207035.7308950388 6188203.772678946 -207033.6160314005 6188213.243223019 -207033.38941418834 6188222.944382441 -207035.0597521289 6188232.503348024 -207038.56285538268 6188241.552774954 -207043.7641022785 6188249.7448995095 -207050.46361265122 6188256.764903343 -207058.4039289998 6188262.343011683 -207067.27991029166 6188266.264860648 -207076.75045823038 6188268.379735156 -207346.58189882734 6188301.335158737 -207355.3819901311 6188301.621076353 -207364.09352927096 6188300.34339694 -207372.44090120192 6188297.5425429335 -207520.13910204603 6188232.858446235 -207724.51641284954 6188199.20473434 -207902.52683724207 6188237.357314383 -207912.1689432416 6188238.451134508 -207921.83917418402 6188237.642855512 -207931.16590836574 6188234.963538198 -207939.79072413384 6188230.516146437 -207947.38217390387 6188224.471590458 -207953.64852161508 6188217.06215895 -207958.34895412554 6188208.572592365 -207961.3028356639 6188199.3291404685 -207962.39664967917 6188189.6870246865 -207961.58836130193 6188180.016787026 -207958.9090327518 6188170.69005021 -207954.46162961132 6188162.06523629 -207948.41706384148 6188154.473792566 -207941.00762561732 6188148.207454177 -207932.5180564077 6188143.507032843 -207923.27460638422 6188140.553162624 -207736.09752724937 6188100.436239479 -207726.90991634503 6188099.35125106 -207717.68087491766 6188099.994804791 -207497.92639998137 6188136.180968051 -207486.11116307578 6188139.681000924 -207345.13554061973 6188201.421230434 + + + + + + + _d1a6215e-3185-429f-b9b1-f160437e4f99 + _example + + + + + + + + + + + + 4.573170731707317 + 4.573170731707317 + + + + + + + + + + + + + + + + some water + + + + + + + + + + SW1 + some value + + + + + + + + + + + + From bcf5e48a0f437794673b358e6d35ef87574c2459 Mon Sep 17 00:00:00 2001 From: Florian Esser Date: Tue, 26 Oct 2021 16:38:12 +0200 Subject: [PATCH 03/24] build: add MS Access JDBC driver WGS-1464 --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index cc02779..fa16e0a 100644 --- a/build.gradle +++ b/build.gradle @@ -108,6 +108,7 @@ dependencies { compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc:$haleVersion" compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.postgresql:$haleVersion" compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.mssql:$haleVersion" + compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.msaccess:$haleVersion" // hale connect compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.haleconnect:$haleVersion" From 0c69eaefcca8d8149c215db87c3da286ecf41e41 Mon Sep 17 00:00:00 2001 From: Simon Templer Date: Mon, 4 Apr 2022 14:54:32 +0200 Subject: [PATCH 04/24] build: new development snapshot Use latest hale studio snapshot builds. ING-2671 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index fa16e0a..6eea9fc 100644 --- a/build.gradle +++ b/build.gradle @@ -24,10 +24,10 @@ sourceCompatibility = '1.8' group = 'to.wetransform' project.ext { - haleVersion = '4.1.0-SNAPSHOT' + haleVersion = '4.2.0-SNAPSHOT' } -version = '4.1.0-SNAPSHOT' +version = '4.2.0-SNAPSHOT' /* * Dependencies From 7fa87031aca79a36b46c924a9837af9ab14907b0 Mon Sep 17 00:00:00 2001 From: Simon Templer Date: Fri, 14 Oct 2022 13:59:52 +0200 Subject: [PATCH 05/24] build: update offline resource bundles --- build.gradle | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 6eea9fc..32d6897 100644 --- a/build.gradle +++ b/build.gradle @@ -103,16 +103,16 @@ dependencies { compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.xls:$haleVersion" compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.geopackage:$haleVersion" compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.html.svg:$haleVersion" - + // database support compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc:$haleVersion" compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.postgresql:$haleVersion" compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.mssql:$haleVersion" compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.msaccess:$haleVersion" - + // hale connect compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.haleconnect:$haleVersion" - + // code list formats compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.codelist.xml:$haleVersion" @@ -135,7 +135,7 @@ dependencies { // resource cache compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource', version: haleVersion) - def resourcesVersion = '2018.8.7' + def resourcesVersion = '2022.8.16' // OpenGIS schemas, INSPIRE schemas, W3C schemas, etc. compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.opengis.net', version: resourcesVersion) compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.inspire', version: resourcesVersion) @@ -151,9 +151,7 @@ dependencies { compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.featureconcepts.inspire', version: resourcesVersion) - - // More resources with different version - resourcesVersion = '2020.6.29' + // More resources compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.adv-online.de', version: resourcesVersion) compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.xplanung.de', version: resourcesVersion) From 56b5215d9d53e2f171a053d874b0e27663be517c Mon Sep 17 00:00:00 2001 From: Simon Templer Date: Fri, 14 Apr 2023 11:24:38 +0200 Subject: [PATCH 06/24] WIP update to hale 5 --- build.gradle | 199 ++++++------ gradle/wrapper/gradle-wrapper.jar | Bin 55627 -> 61574 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 292 +++++++++++------- gradlew.bat | 56 ++-- .../alignment/FilterAlignmentCommand.groovy | 4 +- .../halecli/project/merge/MergeCommand.groovy | 4 +- .../migrate/AbstractMigrationCommand.groovy | 2 +- .../migrate/MigrateMatchingCommand.groovy | 4 +- .../migrate/ReplaceSourceCommand.groovy | 4 +- .../halecli/util/InstanceCLI.groovy | 2 +- .../wetransform/halecli/util/SchemaCLI.groovy | 4 +- 12 files changed, 328 insertions(+), 246 deletions(-) diff --git a/build.gradle b/build.gradle index 32d6897..effefcf 100644 --- a/build.gradle +++ b/build.gradle @@ -1,19 +1,19 @@ buildscript { repositories { - jcenter() + mavenCentral() } dependencies { - classpath 'org.standardout:gradle-eclipseconfig:1.0.0' + classpath 'org.standardout:gradle-eclipseconfig:1.1.1' } } plugins { id 'groovy' id 'application' - id 'maven' - id 'osgi' + id 'maven-publish' + //id 'osgi' // discontinued - do we need it? id 'com.bmuschko.docker-java-application' version '3.6.2' - id "nebula.ospackage-application" version "3.6.1" + id "nebula.ospackage-application" version "9.1.1" id 'org.ajoberstar.grgit' version '1.5.0' } @@ -24,10 +24,11 @@ sourceCompatibility = '1.8' group = 'to.wetransform' project.ext { - haleVersion = '4.2.0-SNAPSHOT' + haleVersion = '5.1.0-SNAPSHOT' + groovyVersion = '2.5.19' } -version = '4.2.0-SNAPSHOT' +version = '5.1.0-SNAPSHOT' /* * Dependencies @@ -52,120 +53,123 @@ repositories { url 'https://artifactory.wetransform.to/artifactory/ext-release-local' } - jcenter() + mavenCentral() } configurations { // exclude Saxon9 custom dependency by schema-utils (schematron validation) - compile.exclude group: 'org.opengis.cite.saxon', module: 'saxon9' + implementation.exclude group: 'org.opengis.cite.saxon', module: 'saxon9' } dependencies { // HALE // CLI API, utilities and default commands - compile "eu.esdihumboldt.hale:eu.esdihumboldt.util.cli:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.cli:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.app.cli.commands:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.util.cli:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.cli:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.app.cli.commands:$haleVersion" + + // add groovy-cli since groovy-all is no longer used + implementation "org.codehaus.groovy:groovy-cli-picocli:$groovyVersion" // core - compile 'eu.esdihumboldt.unpuzzled:org.eclipse.equinox.nonosgi.registry:1.0.0' - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.core:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.align.groovy:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.align.merge:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.referencing:$haleVersion" + implementation 'eu.esdihumboldt.unpuzzled:org.eclipse.equinox.nonosgi.registry:1.0.0' + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.core:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.align.groovy:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.align.merge:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.referencing:$haleVersion" // transformation - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.app.transform:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.app.transform:$haleVersion" // needed to run successfully: - compile "eu.esdihumboldt.hale:eu.esdihumboldt.cst:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.headless.orient:$haleVersion" // reiterable transformation sink (for WFS FeatureCollection) - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.propertyaccessor:$haleVersion" // for CQL filters to work + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.cst:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.headless.orient:$haleVersion" // reiterable transformation sink (for WFS FeatureCollection) + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.propertyaccessor:$haleVersion" // for CQL filters to work // transformation functions: - compile "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.core:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.inspire:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.geometric:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.groovy:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.groovy.helpers:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.numeric:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.string:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.custom:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.collector:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.core:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.inspire:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.geometric:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.groovy:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.groovy.helpers:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.numeric:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.string:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.custom:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.cst.functions.collector:$haleVersion" // formats - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.xml:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.xsd:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.gml:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.shp:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.csv:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.wfs:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.json:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.xls:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.geopackage:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.html.svg:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.xml:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.xsd:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.gml:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.shp:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.csv:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.wfs:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.json:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.xls:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.geopackage:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.html.svg:$haleVersion" // database support - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.postgresql:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.mssql:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.msaccess:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.postgresql:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.mssql:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.jdbc.msaccess:$haleVersion" // hale connect - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.haleconnect:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.haleconnect:$haleVersion" // code list formats - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.codelist.xml:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.codelist.xml:$haleVersion" // Schematron validation - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.schematron:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.io.schematron:$haleVersion" // replacement for omitted Saxon dependency // tested w/ schematron validation in https://github.com/wetransform/exp-schematron/tree/exp/saxon-he - compile 'net.sf.saxon:Saxon-HE:9.7.0-20' + implementation 'net.sf.saxon:Saxon-HE:9.7.0-20' // converters - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.convert.core:$haleVersion" - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.convert.wkt:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.convert.core:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.convert.wkt:$haleVersion" // Groovy meta extensions - compile "eu.esdihumboldt.hale:eu.esdihumboldt.util.groovy.meta.extension:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.util.groovy.meta.extension:$haleVersion" // logging - compile(group: 'eu.esdihumboldt.unpuzzled', name: 'de.fhg.igd.slf4jplus.logback.appender', version: '1.2.0.201503311443') - compile 'org.slf4j:jul-to-slf4j:1.7.21' + implementation(group: 'eu.esdihumboldt.unpuzzled', name: 'de.fhg.igd.slf4jplus.logback.appender', version: '1.2.0.201503311443') + implementation 'org.slf4j:jul-to-slf4j:1.7.21' // resource cache - compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource', version: haleVersion) + implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource', version: haleVersion) def resourcesVersion = '2022.8.16' // OpenGIS schemas, INSPIRE schemas, W3C schemas, etc. - compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.opengis.net', version: resourcesVersion) - compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.inspire', version: resourcesVersion) - compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.portele.de', version: resourcesVersion) - compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.w3.org', version: resourcesVersion) + implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.opengis.net', version: resourcesVersion) + implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.inspire', version: resourcesVersion) + implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.portele.de', version: resourcesVersion) + implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.w3.org', version: resourcesVersion) // INSPIRE code lists and feature concepts - compile(group: 'eu.esdihumboldt.hale', + implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.codelists.inspire', version: resourcesVersion) - compile(group: 'eu.esdihumboldt.hale', + implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.codelists.inspire.accept-xml', version: resourcesVersion) - compile(group: 'eu.esdihumboldt.hale', + implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.featureconcepts.inspire', version: resourcesVersion) // More resources - compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.adv-online.de', version: resourcesVersion) - compile(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.xplanung.de', version: resourcesVersion) + implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.adv-online.de', version: resourcesVersion) + implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.xplanung.de', version: resourcesVersion) // user / customer specific - compile "eu.esdihumboldt.hale:eu.esdihumboldt.hale.adv.merge:$haleVersion" + implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.adv.merge:$haleVersion" // CLI - compile 'commons-cli:commons-cli:1.3.1' + implementation 'commons-cli:commons-cli:1.3.1' // Groovy Shell - compile 'jline:jline:2.13' + implementation 'jline:jline:2.13' // Testing - testCompile 'junit:junit:4.12' - testCompile 'com.github.stefanbirkner:system-rules:1.16.0' + testImplementation 'junit:junit:4.12' + testImplementation 'com.github.stefanbirkner:system-rules:1.16.0' } configurations.all { @@ -192,8 +196,8 @@ applicationDefaultJvmArgs = [ */ jar { manifest { - symbolicName = 'to.wetransform.halecli;singleton:=true' - instruction 'Bundle-Vendor', 'wetransform GmbH' + attributes 'Bundle-SymbolicName': 'to.wetransform.halecli;singleton:=true', + 'Bundle-Vendor': 'wetransform GmbH' } } @@ -297,52 +301,49 @@ task packageSources(type: Jar) { classifier = 'sources' } -// define artifacts for upload -artifacts { - archives jar - archives packageJavadoc - archives packageSources -} - -// exclude distZip ands distTar artifacts -configurations.archives.with { - artifacts.remove artifacts.find { it.archiveTask.is distZip } - artifacts.remove artifacts.find { it.archiveTask.is distTar } -} +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + artifact packageSources + artifact packageJavadoc + } + } -uploadArchives { repositories { - mavenDeployer { - - // upload to wetransform artifactory - repository(url: 'https://artifactory.wetransform.to/artifactory/libs-release-local') { - authentication(userName: project.hasProperty('wetfArtifactoryUser') ? wetfArtifactoryUser : '', - password: project.hasProperty('wetfArtifactoryPassword') ? wetfArtifactoryPassword : '') - } - snapshotRepository(url: 'https://artifactory.wetransform.to/artifactory/libs-snapshot-local') { - authentication(userName: project.hasProperty('wetfArtifactoryUser') ? wetfArtifactoryUser : '', - password: project.hasProperty('wetfArtifactoryPassword') ? wetfArtifactoryPassword : '') + maven { + url = project.version.endsWith('-SNAPSHOT') ? + 'https://artifactory.wetransform.to/artifactory/libs-snapshot-local' : + 'https://artifactory.wetransform.to/artifactory/libs-release-local' + credentials { + username project.hasProperty('wetfArtifactoryUser') ? wetfArtifactoryUser : '' + password project.hasProperty('wetfArtifactoryPassword') ? wetfArtifactoryPassword : '' } - } } } +// exclude distZip ands distTar artifacts +/*FIXME update for current Gradle version +configurations.archives.with { + artifacts.remove artifacts.find { it.archiveTask.is distZip } + artifacts.remove artifacts.find { it.archiveTask.is distTar } +} +*/ // Workaround for gradle application plugin 'the input line is too long' error on Windows // see https://gist.github.com/jlmelville/2bfe9277e9e2c0ff79b6 tasks.withType(CreateStartScripts).each { task -> task.doLast { - String text = task.windowsScript.text - text = text.replaceFirst(/(set CLASSPATH=%APP_HOME%\\lib\\).*/, { "${it[1]}*" }) - task.windowsScript.write text + String text = task.windowsScript.text + text = text.replaceFirst(/(set CLASSPATH=%APP_HOME%\\lib\\).*/, { "${it[1]}*" }) + task.windowsScript.write text } } - /* * Gradle wrapper */ wrapper { - gradleVersion = '3.5' + gradleVersion = '7.6.1' } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d9b7505b1096bc428abaa017cb79c9d2da247111..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 43275 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 27fc706..5083229 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip diff --git a/gradlew b/gradlew index cccdd3d..65dcd68 100755 --- a/gradlew +++ b/gradlew @@ -1,78 +1,129 @@ -#!/usr/bin/env sh +#!/bin/sh + +# +# Copyright © 2015-2021 the original 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 -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # 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 +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # 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 - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | 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" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + 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 @@ -89,84 +140,105 @@ 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 +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac 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 +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; 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\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg 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" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" fi +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index f955316..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,4 +1,20 @@ -@if "%DEBUG%" == "" @echo off +@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 @@ -9,19 +25,23 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused 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= +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 +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,38 +65,26 @@ 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% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 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 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/src/main/groovy/to/wetransform/halecli/project/alignment/FilterAlignmentCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/alignment/FilterAlignmentCommand.groovy index 1cff05e..3660019 100644 --- a/src/main/groovy/to/wetransform/halecli/project/alignment/FilterAlignmentCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/alignment/FilterAlignmentCommand.groovy @@ -47,8 +47,8 @@ import eu.esdihumboldt.hale.io.xsd.constraint.XmlElements import eu.esdihumboldt.hale.io.xsd.model.XmlElement; import groovy.json.JsonSlurper import groovy.transform.CompileStatic; -import groovy.util.CliBuilder; -import groovy.util.OptionAccessor; +import groovy.cli.picocli.CliBuilder; +import groovy.cli.picocli.OptionAccessor; import to.wetransform.halecli.project.AbstractDeriveProjectCommand import to.wetransform.halecli.project.AbstractDeriveProjectCommand.DeriveProjectResult diff --git a/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy index bfc3c5c..3e82f14 100644 --- a/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy @@ -36,8 +36,8 @@ import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode; -import groovy.util.CliBuilder; -import groovy.util.OptionAccessor +import groovy.cli.picocli.CliBuilder; +import groovy.cli.picocli.OptionAccessor import to.wetransform.halecli.project.migrate.AbstractMigratorCommand import to.wetransform.halecli.util.ProjectCLI;;;; diff --git a/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy index d9dcdbd..9027f33 100644 --- a/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy @@ -34,7 +34,7 @@ import eu.esdihumboldt.hale.common.schema.model.SchemaSpace; import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext import groovy.transform.CompileStatic -import groovy.util.OptionAccessor; +import groovy.cli.picocli.OptionAccessor; import to.wetransform.halecli.util.ProjectCLI;;;; /** diff --git a/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy index d8b0ff1..3db19fa 100644 --- a/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy @@ -36,8 +36,8 @@ import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode; -import groovy.util.CliBuilder; -import groovy.util.OptionAccessor; +import groovy.cli.picocli.CliBuilder; +import groovy.cli.picocli.OptionAccessor; import to.wetransform.halecli.util.ProjectCLI;;;; /** diff --git a/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy index 9d9dfe5..b03d3b3 100644 --- a/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy @@ -37,8 +37,8 @@ import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace; import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext import groovy.transform.CompileStatic -import groovy.util.CliBuilder; -import groovy.util.OptionAccessor; +import groovy.cli.picocli.CliBuilder; +import groovy.cli.picocli.OptionAccessor; import to.wetransform.halecli.util.ProjectCLI import to.wetransform.halecli.util.SchemaCLI;;;;; diff --git a/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy b/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy index d148d52..5d559f9 100644 --- a/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy +++ b/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy @@ -50,7 +50,7 @@ import eu.esdihumboldt.hale.common.schema.model.TypeIndex import eu.esdihumboldt.util.Pair; import eu.esdihumboldt.util.cli.CLIUtil import groovy.transform.CompileStatic -import groovy.util.OptionAccessor +import groovy.cli.picocli.OptionAccessor /** * Common utility functions for setting up a CliBuilder for loading/saving instances. diff --git a/src/main/groovy/to/wetransform/halecli/util/SchemaCLI.groovy b/src/main/groovy/to/wetransform/halecli/util/SchemaCLI.groovy index d52ba6b..d200616 100644 --- a/src/main/groovy/to/wetransform/halecli/util/SchemaCLI.groovy +++ b/src/main/groovy/to/wetransform/halecli/util/SchemaCLI.groovy @@ -43,8 +43,8 @@ import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace import eu.esdihumboldt.util.Pair; import eu.esdihumboldt.util.cli.CLIUtil import groovy.transform.CompileStatic -import groovy.util.CliBuilder -import groovy.util.OptionAccessor;;;; +import groovy.cli.picocli.CliBuilder +import groovy.cli.picocli.OptionAccessor /** * Common utility functions for setting up a CliBuilder for loading a schema. From e41d0cb161e1f102821f66aaa289309666aeb5b1 Mon Sep 17 00:00:00 2001 From: kapil-agnihotri Date: Wed, 26 Apr 2023 20:31:00 +0200 Subject: [PATCH 07/24] update to hale 5 --- .gitignore | 1 + build.gradle | 5 ++-- gradle/wrapper/gradle-wrapper.jar | Bin 61574 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 1 - gradlew | 12 +++----- gradlew.bat | 1 - .../halecli/groovy/GroovyShellCommand.groovy | 27 +++++++----------- .../AbstractDeriveProjectCommand.groovy | 2 +- .../alignment/FilterAlignmentCommand.groovy | 3 +- .../match/postnas/PostNASSchemaMatcher.groovy | 7 +++-- .../halecli/project/merge/MergeCommand.groovy | 2 -- .../migrate/AbstractMigrationCommand.groovy | 1 - .../migrate/MigrateMatchingCommand.groovy | 2 -- .../migrate/ReplaceSourceCommand.groovy | 4 +-- .../wetransform/halecli/util/SchemaCLI.groovy | 2 -- 15 files changed, 25 insertions(+), 45 deletions(-) diff --git a/.gitignore b/.gitignore index 2faeee7..7aff408 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ /logs/ +.idea/* diff --git a/build.gradle b/build.gradle index effefcf..de5db6d 100644 --- a/build.gradle +++ b/build.gradle @@ -69,8 +69,7 @@ dependencies { implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.common.cli:$haleVersion" implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.app.cli.commands:$haleVersion" - // add groovy-cli since groovy-all is no longer used - implementation "org.codehaus.groovy:groovy-cli-picocli:$groovyVersion" + implementation "org.codehaus.groovy:groovy-all:$groovyVersion" // core implementation 'eu.esdihumboldt.unpuzzled:org.eclipse.equinox.nonosgi.registry:1.0.0' @@ -163,7 +162,7 @@ dependencies { implementation "eu.esdihumboldt.hale:eu.esdihumboldt.hale.adv.merge:$haleVersion" // CLI - implementation 'commons-cli:commons-cli:1.3.1' + implementation 'commons-cli:commons-cli:1.5.0' // Groovy Shell implementation 'jline:jline:2.13' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 943f0cbfa754578e88a3dae77fce6e3dea56edbf..249e5832f090a2944b7473328c07c9755baa3196 100644 GIT binary patch delta 35766 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%0DGK?7GHTj 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 VwlMN}`%er%aGR6olj~j${vQ;P=LY}) delta 36524 zcmZ6yQ*&aJ*i+pKn$=zKxk7ICNNX(G9gnUwow3iT2Ov?s|4Q$^qH|&1~>6K_f6Q@z)!W6o~05E1}7HS1}Bv=ef%?3Rc##Sb1)XzucCDxr#(Nfxotv ze%V_W`66|_=BK{+dN$WOZ#V$@kI(=7e7*Y3BMEum`h#%BJi{7P9=hz5ij2k_KbUm( zhz-iBt4RTzAPma)PhcHhjxYjxR6q^N4p+V6h&tZxbs!p4m8noJ?|i)9ATc@)IUzb~ zw2p)KDi7toTFgE%JA2d_9aWv7{xD{EzTGPb{V6+C=+O-u@I~*@9Q;(P9sE>h-v@&g ztSnY;?gI0q;XWPTrOm!4!5|uwJYJVPNluyu5}^SCc1ns-U#GrGqZ1B#qCcJbqoMAc zF$xB#F!(F?RcUqZtueR`*#i7DQ2CF?hhYV&goK!o`U?+H{F-15he}`xQ!)+H>0!QM z`)D&7s@{0}iVkz$(t{mqBKP?~W4b@KcuDglktFy&<2_z)F8Q~73;QcP`+pO=L}4yjlzNuLzuvnVAO``skBd=rV%VWQTd0x6_%ddY*G(AJt06`GHq zJVxl`G*RiYAeT=`Cf(SUN$kUEju!>SqwEd8RWUIk$|8A& zAvW|Uo<=TWC~u}V?SNFv`Fq9OeF_VpfyXHPIIay@Pu5J6$$pg{;xE9D7CROVYV>5c zv^IYXPo_Z4)bg5h?JSUX!K`q_u{>F%FzrG>*!Db_^7*7(F@f%i34Ps`JBAH6{s=ygSr^CVO)voP`v=SO z7v;4cFM_D>iVl{&X*N7pe4_^YKV%`5J774`5!DC}g;D@50h?VA!;fU1?Hf%%`N8R1 zSg@hZ8%Dq^eYV1!g8;`6vCSJoK+V1Q6N8ImtfE3iXs!s~B>js)sLHB9w$r+6Q>Oh#Ig&awvm%OBLg!7alaf}9Cuf;M4%Ig9 zx4K}IQfPr&u?k8xWp!wI4{CP#GTs#qR0b+G{&+=vL}I{b-Pha43^%8=K3997~* z>A|oxYE%Vo4~DiOih`87u|{8!Ql5|9Y+(ZY2nRP+oLdGErjV&YeVKw>A$JyPPAL+C zA36S!dNVf z;xJ)YR;^VPE1?`h-5>{~gwY2pY8RqhrsiIBmJ}n3G@Zs!!fD6y&KWPq&i8HEm*ZAx`G} zjq2CD5U==ID^we8k?=geue4Y>_+%u3$-TzVS6QMlb4NoS%_V>;E2hQ)+1Q@v(reC5 zLeK*f%%{PNO-mtrBVl|-!WaiKAkZv-?wnOwmZ=Tv57k=4PX=C?=I4V*THRFRE8a_{ zb>5YwDf4o>>$o{XYlLN{PZ^Ff?0FJl4>A9C-q9A$$&44l122Qsc|6Fd6aTam{=JO3 zBFfFe9seUPSUeyXQc*RA>2{WoKIYVltA&@5spdIW;rzOOqoQo`CN;~UNgU{{m9^c1 zTrN|8w_7+Nws4}Z-4eS9WMpF3h<@81a)oK9njh;-TB74vR;u{vE?>6FDG7<%GVXFL zUR9l{z*eEND6pp)+hpNT$VVM^Pw*S;#NrbCmH{dhBm?%6D|k)0C@Z9H>T|kby1^)# zOPmJ8Hq`8waoEK(9}IfP_q4yr(s?ME+T%UV-ikxW!XFb^6w02t30j$n_VSwevg;{9 zx0OXK_uGBFej=gbG>G^pEv^`I8&_a@t9>Nr;#r?XNKquD&Ho|`)qK6C^-7SCdo=S& z)vUi;m5*qIePEIbL=wJ|WCBNY;zCm2F-+@N2i{I^uR9UVZm$o`I|@<&2}w)C`h)vV zW{)yGJ3?GCZNtFe53Kb#uzrC7v-{JygKZUiXDV5mR z5la_vAFOvoh#yn)B`$^ZN*Dxp5Uo~_k8G9skn2)Tb>Kw#Vgxi`bti)^(z--X9F~oR zZ6=^_x@mDT~=h_@GGVcgBtLzssB1|Xy(xc(lUYJ#_ zgwc&ajE%^cCYW7d;xAxi{#LN*1}s>{K79MZrq!tYMpRA{T!#^tgXP=J5FvkbZ@gx~ ztq-E&c$`|KX8GS2a_voZHf=y8C{6~f~`DpC- zjQfrt2OGi-WGx}Y4>vM`8<4frU*!bq*NJ*Tyn0cqk=zpDdYth-PJIfz5>pLF@qnai zzj2FEhuOa-7$JR=U!L{UWWJBA%~SW-6Nh&3;<}iQO)DvOI&VKi1L8rmICePWqoY^F z-dC8X8~1T}=C9m&yb1kZzbKd2;29_Pm*Cs=y{Z06QZDlT7Poci>1@hFa%t0<`1()UTxcQ}e`fAh6K`<5C_SG`dw$IqzwEYNKvIH3VWlhz z_#^(T53W}jeWF#WIhj^U7AdIB~3feC--5iUiiT4Qyu81 z;Xa^8#~M@p%6B`LCKWWTa7I+35BLP=EOa&Gp2pbTWw5HOIjrx;2J(KI$$HT|w8}R-8fbp9sot&LiLs7ILlyZc8 zWbss7=*Ah|X$LEt1O|T?ABkIn-0NN`I8+ipfoBZcW>(WiaASG_khBtKM{hfkm5VBS zy0Q`4*G6HRRa#9G)10Ik3$C3|nQbFzmU-dA`LjKQY8icnx?2OE40%z852{OJH=?mbvwr9 zhlx0RDo^D;p*xKx?yT(`s7wj7BHA~rHF2yxnL<1PcU7FM57;?g^ z&CyPh9W4KvZ;T8w;AuNMn|nQ-xJ~CvVT7gAPAGi7w8udw_LOp+p4eZiI`JEC@Mq9F z#dA2AM_};CnL=y0#tZALdB(P~Rz*KqGqjwec%Fy?K(PGoO0tfskWw-aGhd7$ zTi~x1G>4h5q>ek=tIoT(VBQxrq)&#`_0UHC(j*ZO%%}%C)|EzTWEpvYDqCYXLexR9 zlww1ESB+IiO}=oq)8WZj%cY_FTQcEJ`JdABa=_S;O|kLhX*|5|D>0c{12DoC?K95f ztNxm(sTU6cWWd$tv`5X(=x?yAo)IYQ3G*2+o#|EfXko6erF;M4Pc;G0)pUDY)t`H9 z76Z8V9HqbWA@!`BelAT&ErrGTz7}%M*605PEY@3{gv+`yEhr{=EVp_tU%`b54Pn4a zz8nN7`eNx=*`f1t#^7>7G07IEnbnn&`RWZ}4Cp8W_DFDs-5)GU`bw}uBmOQfKmi2@ z(cWWmvHFTUNInRH!0y_ZtuI9Eh@O3+64wy-_2DF~E@KF3abM`0gC%|kHi@&hP_#B$ zLN{Z?$V_;+h?%2zEC{2ITyWOup*w*K?~vpwB(DX1i6oY+F)??;nyHpzaPLIt6G$4; z6>iAsB+&&NN0;ObWVOL+-^ZwD?nHgY>0k>0I3iA7o)f# zN&aX$lM@r_Iu|nSdPjoF{#QD9M6>|JSNPLxX^T2!jCKjS5mwNaO+SmBfOY z;6ZdwfzhO6Vs|9u81f4e%7*mU%8K>A7QWO0;QcX7W@|NSUVl)_>7VEf#&N6E~ zn9Wv88@Suo9P+M_G2(f+JFf#Q^GV#7QQ`qH#$N1y{A*_t^`5H1=V^u?Ec|EF6W+6B z(@Q8ChIUyq;+I5CmjEa1*v%d5{WHyhcHSjQuwzQq?;^BmfV#okq3v8bp7dBdk z54B+%D3=JWd-2w$)puXxZyZH>-$O-?tbSIlGc{em9xHN!44iaCr}6uZ^FpN7IvNh8 zbp!%4xR9np`>AOEd1e2_y}xW#v@@h3wYc?WiwL6Q>fxPQA81V^J)XtGs|Z&er6w~M z!1Ph~85TMG>R&ixNUnevc(w>fgb%+X#Wds6Yl+wH29aE%;RuDeZz5dEt%#p&2VK1n zKkqgl&*_YwnO%9`0<6MVP=O3{02EcR7PvvZPbL2KMuoRsU|Y%zw38qeOL#!YFp#_~+rtNJVl>lJSh_*B0A6n3XkE5po z9RpE_h=pnmDJFX*n6wmsWJ9GLu2=L8y!_R;;Aa2Jl|)I}Qff&`Fy@iOhop8>Y2{F} zbVk3rNMi$XX(q1JrgcIhC08@d5Zc>wLUL3wYm}hzS^!5d&Mec$Sp^$DUS1lD1>KAt z|Efof3nJ4^k(WKL_t-u8ud4L(t>q#9ECj?v#W~W#2zTt>|MCh&*H8Wh1_I&^2Li&M zq9j0`(zk~P7}dB`+15b*j%VPGr$;@4MBQ5AT>-y?0Fxfr2nC1kM2D(y7qMN+p-0yo zOlND}ImY;a_K$HZCrD=P{byToyC7*@;Y$v6wL!c*DfeH#$QS6|3)pJe68d>R#{zNn zB0r*Es<6^ZWeH`M)Cdoyz`@Z&Fu_^pu8*089j{gbbd!jV@s7`eI5_X5J3|poVGlq` zDo9}G;CsjW!hgN2O9=1|GpE;RpQvrBc+&dF)L>V&>9kd6^YIL?+*WDmcQlvwnq`Lf z&N$gF>3+E*NcJojXXI^}B(B-;@ebpVY}l#EcDWles7s;Ft+KZ@m+6FWaD^oYPBXVw z3sq|aKIDh1x5Ff=tW$(LO|!e&G?Xvh^H!GfiA(emluL!LmD=EV@|u|8S7w6ibUePJ z>{sOC6L27R+b&}e?VH;KvV3a;O3G=gwG}YzrkSTV6(&=;o)EV~2OD(Eh4mu@K0G)i z3#44IZhqN6+Hb2h#3R8YwJW7LesDA9=n)75u#46_ZmSh@6Q-4oHvGxFPY8x;Q+)d@ z*-SDqhVeyPGkoD)iq;z0r*M)IhY5I>gMA@RS&EIYPq}Z{$Q4Jbfd76EVhSF-sR^TO z!=o?>V(^bx!pG$26J~Z>Tvu&Uu+0;>m+pg(fmbu(97^(OHBH4;J8WIfv-f5}VP#VS z$Y$}SHKdphDUHlbdIVW!k$L6T{LY)|H}MT=l$22kIl>|46FK9dt$?3Fjk2RA-~AX7 z1|Xe`n)%h~e-O_qLpoFXJ$%gmocq`v0%hRw1k_6nh|+3pvJDy}m)V|xjL&!Z6?%pU z+m)r2*pWjEl!etAYxdzWb0{mGc;#$>rE%)b z@Rnj78P;$lrzY!XCa0&x+8a^YF*G|Q|C}bGeczz(5m_gq08wJHIH`WqHH?A}!~_3{ zQEvMXmL<*nThl^pL58nbHgQ1n9cYmN{C8J^6AKS%?~>1DCt70Q2Vp0;E@`GF%Tzkc zSUt&LJ=wHI6@#8_%=2s=j^4VBd1-h_)3 zeozYua!|{x(qk#z;tavf28rj_5Oen-cYG%;R6I}Hz$yMXeg^)_$OUUXx1r^qrl!DG zYXkAXKBMrVM-rJwAo<5J{NW1XJhW;Nh*&`nFV-Z;Vd({KSkMxV#cn|bXJ z50GtvFE##sqGhV#lv2s6?^yeBShlhR%XaPIo)iXOue}jwZ;Zq#dgDn8H?74Y+$Z?C z2Y5mCC66>dp%sVMecUzCirWq99Ea(TDwClZxtEB~4N-2JmlH#>Z2jOcaNaw4tn?P->BBGNHxUHez7>C@TZNT5Z zHerlG0a4~06L%>tn!~$s^L5`~{ueLZ5?`$46nHvwKxM0V9VQ(k{A40xDVw{+Qt)RV zQ)T2Df)cp0nv!lUFt3D=i~k!V|7dUjpz?K2ZiynO)$d{2*YT$N^CQ{t=luZ>WcE!> zg25p}If9RTho%G@PZp;5zBwv`n+e9iO=6dx1V^|4Ty%`oE=f7O&QC^s!4MJ+lMG>^ za!mgpz*^SHT+M_zm;{H#E~SaU^Kn*y)nTAF*2@t5mF+l)bte+a+goaA*zXJ4P)H|y z{4OwbJnIPtMp4E~=64gM-Y{#o{x)+8YCg$C7Yy=;9hdyBgRFIY2_L9DL3*B@%$5#m z8P}+)glf*}UPD$C;_yntx}9VPmSSnY9`Thd09nfoR;3`kar*FRfS)`+as*t2l*USWgmaZ!qFubr1DegTGZspyYMgic{inI0dSt+rJR z((jjMrdq^?VSZ8FCO;0NW@>O_b67gDHP%W*^O?J z91NQ7ZFODMSvHj3cvT#6RJUF7x=-BJFQ^6<&mOd15Z&M!?b+3Tg!UcgldD9tOAt5K z3X>MlE-a=sj;K&}sSng48jQ7sp|&u3;@e>V4Cuf(!s@9lZ0Cg^DKWmki%>$<85tOG zU;e{%zHU~KREBUg?FbcseK{lmK-`*S1p9j_4hF=F$y)NB;HsHwuf_A0Zhy395eU7o8^A zi2t7Ch|KVprUn03N0T2XshT!g$HTErcQBBG=TWaHkYtaI2CJY7ajI%yr&9 zVC^zJ3WW03bjwGNx{l}#+D&Ml_uI4PQhV}qZPXOP7ffSv(O;hX{Ff1|HoA~v)V!4y{CdALyi2YPjrRVmRYilRv z5PSkj*Z_8Fa*sCqGN?7YTnkr9=i9X`qcw7nqz#{bj?B7NiV9fWF+%~Rb1X@MuS^Mw zC)d#K{(-9!?xStM2K5x%x~ogWxgIK>s5r_RT1jU_lxdTtIEFWvi4eJSAiGec&HXQ( z5t7!J1b#SL|8s4)u147PWQUq_e33!5Z#f$Ja&az)(Htl`Z0@Ez)0d74BzNHHfH|<-8q*ZMf?%eJzoGS!0S6Y zSU7y^1+;V$Je9F027>1eN#_tz+2t}Y^N zYfi9}J!N^SU1CYoNBDbD39@84xLroY@0f%%c^(5CE+}!b5-Mt3oXe2nBdyicgGIL+rzTTKv`}Pp%fG1f^s?sgNH8=Q}s4Z>0ZCZ8ZYF z4og8nK%OA~zZMJX01uFtrmwhcgg*XbiMP9kfkPYFASbp7*Bk^5ZBzV)dL)JhPwDkM zkgdHeKw)orJcj4^)a^wQC2|->G=OBzuc-SskRrrf+H-E%HQ==Ex}d*504#GbIUXIB zcZs@Oo0i61MG}&0bu%@2N?MMJMRXyTVb8@3wF5eY3G6-1NdT~{{~YFs8f&SNebdaq zKmP>XqCQ@iaamuvY2m%xJ~gdSLSj~DBhB`NCj_c}NbSjB{r(E`_-+6a#vx*|S>-GU zHsw^dxxu`e)q1HbH==rLFap?cebKumnTo=iJQ zJD1#=o>0%Y@&jP?^)Q5bTV!pzrf=FoHq2c_59pq@my{D4AW8VU*7LVp;LF-qESV;L zClRfyQ6CcD$sd84K@e@p_ALH%j(Pz@Em@QFyY`AG&(|!(cG8!oV#ejr`y(LolX}Iu zL$)G)8^y4sUAYCWprzVR?`#OJ%NU)9U^B!OGSj>Ly;<)<(nNh`?z*GvJ|ZBKfZ`0 z=q_yGHWPp~R+J+{{@APVwmp8`=%N!L7AT^l^oaM|JrCFu7J#@frf=z(vGq2>sQ^@u zk=^d#gDf}ME!~9PaLfw44~rsG!)T7h8~dY^VcZQa+ueWPGG$mWXB|H2$$0BT(QAIu|=DJXPQDNes3Q>-|Mh=Ih zy{WR)QmhL5rQbBYPBa+e7)8Vo;_aKrg`}izmN>#ATuSDu!QUFA zsgM|Kv@W(S}Ag^6e8)9pQc@JLj_2ZIkO=8)#ARm#mU=NncWbmd-SbO;ad=y|k`shy3b z*8o0@EJo3b$#zSgmnlT7KAp)U!qI2M`hiC@Gp0)pNGHYMe1$MBNE}Hd{Sv^`wI7>MzNwgVv1ZzL zttmyv!=TKuPH$b>r7$lgP5?vho;#Ks4+zLzaz-1b{p-Fn6dWy1Agg7O2{&VQ5@s3A zAqzC9QokRD59!@ex#k>xy61kq6h~O$lb;lB;Q|chv&wzR+N zgXdIo%?q1Y$TzsdCo+n$^NODN7yd}cAv+rkG|u-(wTp?zUSUxaA-W3dwqikdrokwz) z68)Gn$Nwc1zB$F9`#(af|C3v;|2$bo7fU8f7h^NK6h&@xi2m`)g4mW$?l@5JEc*VV z6d67@Fl2w6mO;MYUl2U>R996gQUX$d>$D>)TNGq*arz}f21yh^uvIM!3u$H{_CH5! zrjt9L^&J8UqEV_lLn&}nc|Q=MDei6t=vL_>X-i8B%f5FDi)|qQ;2V-T!qOi*uqq{U zElET6#2cb>Z_6p_vw44&mN!;T&~ubi&p`XGepCNAfa0-T zC84V@VN^R6%z({m=$%iXrbiggxvMiBpww~ktD&=9-JPK3kPCOGCJNQj8+l9k#!QeS zv3h$Ej>@j<-zBW0Qr`5tNQVRfYK_$3>nWUzf&c*tCpl@aYwa%b;JNeTX10OevcxY7 zqnLgKU-X9G8~&?Dr)`*7GryqhN#;9v`D_c=_xBcD{j-cLop~pSnM?&7HggX6gb++ftBq$idM1|>5t+68sWf{ixREbMkZesmpjJsAFPQ#2+8Uek z$BPbu3cQuNDQq+^M}&ZuSHjxUgxOjF<^%4 z*8lc$CgA<$n=DYg_DsrHB7zYM0Ro|gS8ZnUq$u3GQ+{owv9RdB$wG%d-;R+I>?i?b z+r_mu{IL6WTYftdz?0#pbHkmQP31LvXcMK6;mAP+;q^L@q}v~TD}Ni>f7@QYcbM!T zX5kShHv3X1U=>B!2*si9=AEJCBt~GIH7DL4^+gHj+q}tk0F_?Q-=z{JY%77nkw>$F zG}6ROaL_)3t$jX=ZtFG{Q=LZfNjNb2LK=m9l|7iaB++N|S$vAr1 z_gf3JpIB|?dptfQ{sOZGlhyj~D;T#hjaNh0X5(o&7)87^t@@Hteh{0DOM{tCu$l#& z&NhA&V4VR}nzZP{7i(5bGB17<7bu+RJ1}k}=ffSg%=+213Oy@Aj1vv2U>U>8tRhKM z=*e<21)u6SSb{CC&We%#6X@duqLWGJ>O)Ls`uM98``34g11;D}*7>c3+^c|Os&;t}`(BWMD zfbyr~$j%{6%DZ`kR-}s~p?0#&-5a}b?6tDqwtqY%ep0ypSRIB54G@|0J5E#LkxQk# z_&xE=d(U}q?*Rh7L7f8AM5{qdGpC<&t~9YI!%j2G@nUPoLPSiWHjCVP{JAe?cBjQ zTqI=R{nv5c@|R)8Oi3cTL{&6%XdTgDP4CNYT}q2f5|Xf_hID#;83kd+v0RRyNKYn} zyPahwd=4ncDORLvatBc~KzT+jiiD{tzd3d*T(f7ayS;J&I1X!xaL2~POrw2ST=Pr5 zu*c}fb@)0P6jv))kNl38C7gmnWGmlL@{PWOVYt9se*cS0w#@W=N+dY#V08ci=Zmg9 z+${f#Qfs5)hOPxC;q{(J{Kx4HF)2QMzlVtXz0-O&h2$VxtT;ROvZ13nN{IG>Asv{% zHuDqgZ{R2(X*hkO+!HYHHWvRYrvN9fl-1?x6b)oseZY)@dQ6O>9Y#8*23~%bzN~Nf zpHGMdS-G|%F^v3Gnlsc$s4Wl=ZEu+J6y~*Ih2tpmHfO56JXKjldm$BxDvW6ZH>JrU zdRo}=^466lAq6!qY_@nQ}5ETUEoF;`>7b8W910_Z17!r`D?QNvC z+WF%@IkPi43n4;0Ks`M{x*0-^GK7oCAp?pFK1`~RoMSe@jAlV8vQruCUNyQ_7wk?` zSKe*|!4ar@VSA}!ThlIB*Qa5){pu&HS!a)-{lWL2@o1486ZK_!!}FSZ>vyUPIOX#+ z5d3~J24Op?!f!oNytub~egnkB`}h?eh!QyX6&^LbNuA#9vH#N_7IL|#6kIDhLL=be zEg3Cwmw{A(cm{&T zPg>XIWX24$Mj_#^k2I91C@h;b$8WNVr&MLjEwgAUtSeJ2W0)6Fit}PF!K&1j=*+6g zL{XOUrqhNyPLemIF4C&hThR8fie9^fYg$yl$m!1|YgcPlO>TB-(X{lkN~X}R=GA!Q zou<9ZJV6*}SN_4WRsqzRGI&p$;9DxDFTlyPw6Q9rlo@E3tMN&Wo4eFs{1=RCUij$V z`8)kmh0fhTTiEyvRl90B%q2(Moh$jg7{NeQiy> ze!H{zbG7<3BcK}XE&V_1kFfGA7D^ODxn*@nqlp!{LhYb47zIUlV^m+7kZh^a7L1^D zvI?m^9PECMnnN$0hi^Ur0b-~QgEORanrv|`dd;ek$4rAgEEof3HyvuYoZ)H*;+TgO z8CJY~4YDI^7RD7O)m&2h2K`-4e-I$1zcZ*K>Cd7~sSxEXc{d7-;f z5Ykr56Nkie%=z4_LIA}H>c81e$%ey=2hjqzTxoO0MDe!J&PE@EmX49jQJJg?HNw;B zHRHr)3do7CGDa3lPAZ4LAnpT)spnk8(ZiFz$|F$1m*A@!qCPug>Isp|MPI24i>jp~ z((9EQ9W#Rz)0AYT&ZWOWKBNtdNYYm2QytK$o-_|W5j7Abr&73(MG+Ar4K!Ij=nKu# z;SNkveY?Oc!I|Vta2{rb@c50#p_byn|_tu>Pv}6YDydl|}X#4oZW2 zvq)Y@8iG5@6c3?uu4vdLSBq23P&qUSvtGcu_qgH*?KfaT)@QueLx6apA97FI7sXP=foe zmrEu7;%Z=yTTGUsHsjR(wU54xNPI$hLFZUOwh=uhZ&rLammOQ?w*)}?Ah#%&K~OZc zl#Owj1OCEeXt!ALV7LgJ=MVbCo}<%92WX$wCS~Ins}%5+sb*C{WoOT5*2%sgjya;~ z|A#;k?j~J9qB)Tku1BGX=MrZ}<%Z4}i$OvCHv_3vtH_NZoK zjJljjt(~Yh%aI@gFnM*e*@_*N190p^@w5?SjRMb66N_^3EZ#Yoh<8FM>Yx$+mTbp$ zjQQS7(rs2j^54CJXdkH|$1&$wPOGDvm^@1o1pl9~!5&B+I=U-f_M-M&r3zfp2%TH%Ib3lz-^t)+Z9E+>W1Bt1`B}rZ$hZ3{0n|nZKM9O z$?_1+y}fB2$zEzE$zC#46=0E_4x7-VXY5}<+d!g2+Kg$gvU-Xm-A9DBZz+bZ*zDTx z$Wfb93))oLQf;wKi5JBJ%$yq}m42lacy`bC9PjFg*}pCnqn@dv{k9WiwCC07;6n#e zJ499v3YGQ^WyYY=x*s`q*;@R_ai1NKNA}<6=F8IvJArr{-YbdY#{l1K{(4l$7^7We zo~>}l=+L8IJ`BhgR&b$J3hW!ljy5F`+4NA06g$&4oC-`oGb@e5aw-1dSDL}GOnUuy z)z1W)8W9t(7w%OCn_~#0;^F)xic6It5)3h);vuLAKFS4b)G;Z$n-R&{b6h@yGxGo> zT-cq0W7~n+qN10;1OS+*c>H$(GoKq4hGG% zL&XJG$PDQ6K^BD#s_MsnlGPE+$W^B`&a+Z+4;`*nyKil99^E(wW?t>#V_xYWHLl2} zIV`uiR-__g+<&m#Z*4E|wjKY1R2mCm%k2ayMSDw`Rz_KA!3P$uIbB`dl`3&A zmT@gMT@ZpAxBys8zRtgoH+ebSaVA)maP?G1=G4x^Nw3mV0?qehWL35vMI~p$y0hGL z6@vHf-50P~uoe6yY&*D)Ekmi06LF!Jqz9#7kMvWexYMbAn{}`{3ZBsd6$5jBCujDp z<0N?b*1%T<-_Nxh`lKtla|FFqs7RZMtjHAwZ0Ck&s{x`#^S?36BNQN1JU^0f&TRoC z$}c)LW7)-n$CmAg&n(96AycC4!4_*D(~HvXyLW>HORuI0;ny$f9h{!Ud0=X0x%{l6NH$ z?lttWn}DQL521;-r~Kf$N_YPo)7H>3gI@Ivt}GnR=8W~Nn7_PE_3{sRNn`R~bs`g1 zoTh`7o4H*TRp7VBp=%>&t&Cd*Ny~@;{C)P;62d^dipuJYUV3-Dh<#a&AIxtrmX42( zYEH-8F3|^nY-=yw(?^d!hTojNxr~A!n$Ao+2mq*kZ&>Zm+BDC*sul=~!LUtWiokIB zxc(dNwyk&5o;>WRt)Q-Wj;fvuvJO&DLPe%mt@t!Oq^VsoIN0iTh%fh#`-{Ha?a8gf zj^yA3`=_NEONO0Z?}YVP*dL{T}v|A&cE7$_0G=g;1s*WDQuRcq>cJ?z=8b5&i<)=3ELSW%Kff zs=my9Q%8?aMxZeDq=RBHg*&HnIeQ_}X@oh=f#?C^HSg?1dwLn#wu(o^uANrRZD;H; zYbOec$#wJB(u?w22{gV+zb~pv|Ag!q$N@^|6n+FV5-X=lR$jajjeRh$1tjht$URz1 zhw)(ksAr2;QBXH9T#A$6V4PsR7K)){JQb?79o6&*IwDPZknNqySIa6pwcs)~xN81I zKc-GmzZ$i(8RaU==$Dx{tD@4nph-V*=W{Ln97*VEN^F+u0!F<%$l=K`ikIp#<^Yt} z{rx1gk>;rVccPIo6hD=xPQ$PxVwl6Cl;YI6iLf3!aevhsyXXZovK#TOv0|*T+^ii5 z+YO`u(SO3@ybv-DG)w)E;@+ULoj_+<;mc#iW8{9Y!99vE`HdAK=Utac&Eq1uy!TLgOS-C1E90Am)B{Tiw z$>$Er{s{snLEaO5@u&zqxE@v;p6D&?u@40t{#VNA&7SZael};kGEwnHgD4V5RNM@g z(EL~B=A8&?pPPW-fTja0Oi6SVtI_(3ME!qWLg-uK2afWhBn(C2PAmUyu^2h?Y402i z9P03g5$1#etGdUUo?#skjQ|$*()ybRGMXM`-2?jjThnTcPV==7sg$k{GxYdF+S*zz z%dtBo(R9!7SW6Utq|wFpsKMSAH-x{WB|Cz62A8!p8!kHz1tM=9I=M&xqQG zz17xBW7t?Q?C%@4YC`p*za(>hOrK&ELyDQu{5ACOg9noZS1SGh{-FcLy_W;nf$N`N zGYxdIzy7mL3K@Kw65DmvPH0@&;T{y&jP^AsaYENi}q|A z3}l}5V?z_VvpHf%CkpN@IK`czOuLPY=yBUf8Q3b9$X|kEiYROV$`T8T7ZjFPvKhbK zDYxzz99JRNzsx0f1Y>IrIQq9o+W(TsB(ZtN@4*)DMGr3?4~Jt|37IBI|7oQknQI3X zAWs`45xiCHga9;8+W{|!Yy>tic?%SNq=3EX@z2Mk!P0dKG0NCHNz0*F-a z`7K?6d*D4ri*=>wyQyQt{_t=t95*gB1|tdTg45fR{KmKD|3ZuM$QlkX{-tUkq@3Qd z-6X|jEyZa@tuxB}qrdlJdc0{8``%3M$xl8$9pUzkFa$Ww{Jocp9>;5~oNC8o`3GK& zy7_X8YoQDCO1TU_a%#Q+rC?Rr`r)W8CdpEe=>uMYDx6^46V_1DthgX`6CnF*E+%bY z=GYih(DizXEVFDuQRPQY&dc2p;Pwo7L{I2r3;QV8IEPg1McP{PchEUDf} zbtSAoBMPt?&Q@{fG_3a7gzHl58O7e(h_F6^rKgU=a&(^WpgH3U%`tpj3CMVRA-uol z(hA)(VF{4@`k@PREUQJ_8w6CcMW4Pm06{fw^*>aMH%#ik6lD{{j~nT}Vw=wZ(;Ct& zi1nt}RmOGrVHP++5;Z@eE*lkdw~?>AJL_Yg!~p*adS_s1`_oT1B26S zt&1-4twO45pMl<5B9T;SLH9Q?E>dBXcy@5k-{YQ5K!A`=YMYMlLOYc(+LdC<@@UIZ zxq%vI<;6P)=W4nRb7nxQ9KGzXsOjWs_3V-2*V+r}?dAZA7{7f*>^PxEw|6+WS0wAs zen2zj2cFKIr`~Ai`YU|OR4%DQw8uM=|g2B{;1Ho`mx@??e)rX!p$MSlA70pKVcvZ@|fYLpEV~s7G z>#?88yv{ekJpeJL<-?FY7wf10XpS{B4}jy{uc)7esm&J1)ZYt5LI_{)0BkN8Nc}ep zg%SYD0Cub3?KXLY*-dYntrghE|}%?RY5i3yVcPFlheiJUMLIr=Xp=U-^siywr8MF^JAEwl2uQ$VIfuDFPisd}4W2ZxY$C`2`tBTA~ zG2P62@*~(9gYmO6#Ya<1TG#3rQd0BwVyNP@Ayt7B(h%z<@N>Iz;|2VkT8T3`anW@3 z03^F>TCLS9Y*sY)#=BX5!LYD9Z;z4QSOL2^Zw~0e;OutRfp)Xu83Yz~srLh8rR}fp z=#yHH{&=!mHgDg!b;9K@Ux99VmQ*K2Xn%gV6YWHHw(<_uA&($p}$2U2TIs7y+ zM7X5Yk#^wpDE4kQZmN3&VC{!nno7wD2`bEeAwS;W6>$oUt#~E57Imre?b54{c$`tHdB6GMC`IZWLL(%j20Bh zW@}9_@4EsYT$u1Q3ZPWkvYxUX{6AcsV{;{1w60^@wv!dJW7}rOw!LE8wrwXJr(>&Q z+xFe(e7mP=RLy@dYSfEoS{pC8KXH4kGf zd``z`=z(*mSdLiXj&Y{>&akI{IMzo@tD>a^<(r*Ssf6Nz;ZsaLra9mcD`MN8$2`!w zj#+BZCrV}b_c=qEqt7{oF$>wI5*0B0kP{DNQ5_-V9dZ<9u;vm!(L2I_#p*nprX%tU z!{;Gb7IuVBg7pdB2!{X!ZgHqp5+?drImJ(UE6~P2|C?+`E9th5QSv!}?=L}=tvcFMQuyE`=pek1zbRxBAFdgqqB#0~EkA_CpTe0`e$i(eyMD!C!D0SjSaixQMIl zQ>-Dj?K($9qMGwhRqIt28n$`*FH_6v*JjZRnIMxz-qVe_KzSGY5Ph0$(^e$r-hLD4T4m@eV#69bG7_fQ>o`!yu97p=$)>fb; z&!>)wS*Fj!ag#iKWRWiC735;`@XxXFT)nniSe~^1r0v?bQ6_Fokmx~(-O5D{7$d>R z#Us$PxL8^}t1rpnJ@#E}+O?`@a4wB;n{#!lX6WlOwo}C3TgP%?N=BT*FrxR=JR(g$ zJn3EhTI~xj_mVxhFImqt22JE`CI;B~Pb~*cFE>{uL*2mnfeKb_aYO6sDC{Khp%ba`v>+M4WqY2KK4@w{=P~Tzx42!1yHniJT#~*CHF5|TVC_n_ z&;r3b9d!f0;?+iQ8rT1N>MM-D(HQrU-WWU9=w|>nbeG#luD0;ayPj`4=&7Ik$Z{Z3~ z!oob~d$cMHx9;vjAfJ{XC6R@pzkLW4q1ak{?IimWUVBKithq`vKQD14&60gGKCCale{X}Ft0By269l*P6r zuTm0E33lN!&zezRh=5l@mQP_RAR5sr^}&4j;(eFAj2@K*7>|(4IdGb4yB%g88|TKZ z^M@nOtS|f?{!z}s#}S=w{R0`LbVP{k5xhlw?;F>N1tIByWsnp`Bg)hb4sZR>Y12=3 z!#Anh?EEZFm==f$1I@Zw1Y6-%6aE;!l&t#!4vB-%4AfB{X;!sT(jBKx*-5qZn|89Z zK%Is6JLf#w>eauBET9VUE&>aD*^+~!ilaiM?p&mM&kqY3D1*5QUGBbUOI)=eY1dMv zJ=ybPA_VaWPE1+MDhiYq4$DfAeVIv!IP-*#v53?V-c^a) zG6p$+O#_1{V`nNcS`{^%iBn8Oi4fO$#Q7x-$tp2dRs-etYmui-mt@P{hh?ldJJP!? z`!i88d>h`9rIRd6=^pZVuo5}3zUbAX>~uzA4C%servKlplCW0(Ta+B&Eey1CQ5DDV zf2Mk*YRAVjE>){hi_9poOCsx=BU4gQV)kovP|^v!npW_>^LFUzYHx;MKo!BEj7Xy9Xg-A6>kWs*$)aMAWh^_0Fnx;eR|2;L0ZjLl*+F1Moh4?D&8h6H6jJQ+OxgwJV51#)zSmqvRnQ5 zz~62JXPCCiwK9W;yo9-%7Xka%OtQeVDK5SGr51}$q@i)OE>BHgfOFiV%SZ5E(VC*q zYujoHFnnF^qs^WhZG}uBRIs4{4xGP&Tbtr=RJ?=4?;IaVA9Yzp!}H z9QDT#L{7Y?)r=m^ucWOjUuJh*FSmqL?!<1x{iOcP?l7BCorp91#(gUNGIQf@1)d1lXx(RAI zhm*TFNYgXZn_A}FPfh;WMHE%oCs8d+1emobQCt@YTjxcWoK81LeXY~+9)^+UOmeCk z)#LMg9G1`jWr;WZrrR$Gwve9&X+lKpB~*OkxAEnRpO&^BwsOm&TDeQBlvTv^nuju5 zyB8jH2{_Xtz=1n}8hD4nhhZvyxynbGz%2iKM-8|$N`wX8O-Toi=&@x087+joKHd4@ zsx+@?mPB(R?mMWCIeejm^dhs63ARzdm}jsA(O)QqT|m}QRWm-(Hzh#M1)wVV%1iJL zg(a=;b~-ZkGDk#mk1~G*z!7zGrRGL-8}=VILi|%;0knSAjJX1jZXYa@^cU6K|NAIP zkrpm_?r8?!`$D^>c>@hwX{b1l4f&cY;wwU&Q2vPM9oGB`Uj2&haf>bY84LFfn>4P} zUwt~VVTwui2oj$uGt#`OH>|MYjm8`R#n z{C%^u?$@fW&NV}iCuMF`&DU3gT0TNA(vM@&mV$M7yWD^p3 zN996Z8he29k4NFCg+9PbnZ$<&>5-W0fbtK7!ePTkfP37tvtUFQiW$|1%XoEZO`#0Q z2^XjxY40!DruxCn-p%m|j1RfInIaROco}Cf&3zhkkBHj&Rt=WZ_VkNJdliOb-H{>p z4n>c+XW~q#1M6<*boFS%=vdUE3ndU*iM+EFUvAM1=)%}A49e~^iF9Tr^(nqF(J^n~ z49*I<-WXCZ`1EG0hYOd%nsoM{LT8_q$a&QSBz;#S3YCwj?)0mjn_saa@O3c^sMqwF z!ZcWHQHCT~S|SVe5eVTt=z64&T=nI)wG<+4e2@}Gp9#uWEM+p-{L1PUC zM9N-bN73qWRRpT*YCLuK_D+uRgFcwsV}^odrD$A zI~cJDK#5qb8UPL(A_=P(=)Z0U`Aq`WLGuPhE^-isi?g-0`OZ?4kK^MyAsY+mxqt5G z-B14#h=^(sGv*CF8}cd}Xwl*_z1KEt!uP`_(wPBT8=FmK<+VOOk}fZ4Gj*{W-MSmu zygps+?d@%?tx#Fn|0(KF86C^QEgcz^1&!sUz|u||p8_`(gR(h#GELI8FrjSjfNCc zYJ9BHx9555<@$3ttNMYtIMa?NQe?V&_luijx2?!gBJ8tg}l4R@z5x73q4 zfZVtX0lZOzVV%@yTg!w5oMcYuMfGrD!RFwqChHhY`G22|vNLn!6a7VRi4gD!@Ae2K zT6A|%SwkYp{k$!ki4db&5nZ!Hg{8dj)h57Z<$r$9=s?;uzmx54DcKt)m0_ow(XjO@ z{}vbrW9)Fk2;8-9>tkzX!IEOW7lMb$gf~wwZgu2{whBB$YvW7BQSPQZQDy~)5Wh@8*P!VrB-YNi~zFb27ia7UtoAd`4C|JS~iU%&Qw1UMjN zC(CRqwMFj@{DT5Q%Z!g{RpCq?CpzVQqdKjxHQ1xa=u_EKr1ec5)TH;7hvWIn?hs@&K~48_$RK3+ zdu{2({Eh&7HD%B{)|+9CYaV^V1<$`JDFoj0UB!kwzCp*vlO(9kJe-Iv4aj7J^fJER zTEQS`H@RGhfs9w?M)S`;LliZ`Qvu3g2?r)nr?wT^cRJy(wBCr0MDqtRFHm$E%-!6g zMLRw$2+YPDN~0`{Vm}H&to@Nr&fF{~L0>m}Ghn>Vj81s`EIQnE@l@Jse`#}N0!!DL zkzs?x4I;fLH-LS+=E9Vl88}Td=@l&5&xyb1KaYf^1>c=cC+$#bcr7(`-gQsjD7Tws zxszZy^8Sv(2%nbY|4UVV<}>Y_l1lTjrKy;Y5${ej*V%OT0+D~Ec3-9;X zs?8%af6+X@s}jQO+NREG?W&1rhl(x1!Yfpt@?JLkH~UV_9l*DG6qvuakx_O+bAq=s z({A;t{jPMtJAA3|O@KE~J3M!)@g5`5KHrMBrNC_Vh4B|&pimlm=+i4!K-R<3m20bD zzS$Ki+QfH%hnUo)1S~{GWomug`!{WD(v+ zuvqIy(f7nrv3AgZ=8rf6?es-84@=OK6qbY0wJ-G zL(2?kPhb zZ{|(D3#69jUn8s@S7FY>F%&HMCc-%c24`6k2TkwB}T>7a66k$Rk>2x3dp&D-EP;6vCr%iE>GKFx;(izH3Le$SQsp0A%5 zm-Se9<@jb?{00JSx_;^KuDtmei!?oLZDoJ59(**b_6Y`2ZP$kvK4#2^Lk;B5oCirY zRlPg?{iEPr_J_ES2=O`sJ_qloEFsXBDQ+Z4sZubH45vc)72Y|~@)oVTzXL$U?w#*n zclYx8f%j*|f#eOo&_;}Am3`vA@XpB}-9L>H4kiQkO%r&~{%W@YWSeD_%B5+F67d*j z?Utu*W~cd#8x`Co76I~a0hZ}GzEOX;;hDT#z2m$G4zcHYIefxJIe3HizO!1pDziPE z*|lfM&rHZW`dhSY#7rpieqo!w>m&7!e)!(++5So5!vv0pL0Wxlkw z;_!rN(U5yR9=>CNO_J%S#)QEl@X^i< z$-v~-byW{BRXav4GT1VHt3jrFK9-@DZunt&iHnR->YIe?0!h%8oHlN&$VawG{+?<< zoY3lysffn`42Anr(od87p_%kBvtEl~1Jq51oU>0Cs?E%&n0t{t#)ExsgW$H{YuO*? z(`4X_deFhMU*%36&*Y&?o78sAOZl$&98gl@b9zEa>Ul`Eht&~4&@b1AzPD7{!Ati$ zwXVr7)>u0Sv&p#{4{|Qcx56H> zF?_X1-NV9Zi{jD!EQY!op(nLS=XU(DmJtXhf;wDL&4dvd`O>zAaBzN(?%law3sn1p z_#_Z!M+Gw0@Qk>REY&5+l&ECBG20Y4{6#618u0a_FxP38r-^@-!(PFvJl*UdjdBDn z11S4BYW3AgDE#Gc`TX_x<1XiTCER)+z?$_X z7n&6Ev$hKOggBsrg&CpBUpqPE1~%I*WKQW)@&B^`ZW5)SBHYAX27S#;6vo)8c5BcH z!iREPvmG%-xk%IahqAZVSke7KH%Rm!>V_tpH`>bSS4Y|tT-m!g!=Ni9VbK>Rx}WE8 z1ss1w(!|#dy?b|&w)Q0+&&lInD4O`WjJ{*tN3GHw8{8SD?rdB!ZRgxa1F<=81)1({ z2JvQ>m?i8VI<$}9MmtE)MyKN(H%%Ec)=3jmP)K#QS&7qL0o;%>!jhlVO3 z&jsJtdo5DnGgt&A^6{Y8a8ne9+lmC2B)oq7mWC?KoKbd`r)Uj|vMQx$o%)qPrk?b_ zW1Nh}Mw*Y_&LN|blw(R7 zFqMcuihIjBcSQDyLEoxd@%w52JEp%6+H?S#HPt_I1T@F@jW@935OmoG zE^SH~5V5=!n&E+yvOEFgM<8j%Fift}(j53d3V%1r9NT`}I%2p0$%QVx!#G2{NyO0x+|GF&XFcta601En$nx7I1 zQqAX}hG!*oND@sdrvXZQ=WU5MOE7QtKbgX45%?B?waqj`sNjDd- zUTH|{!iKvo{j~L-X=^?Us9D+2O!SG>$w%in^7zGGy+BMpnFr)#L4Zc0>7HJeEGS(u z(RiPD!>0L<(^-m_3%r!)MMdobk+T+6rOX^H>@PRjP^E3Fvx;U$0pz%a=(m-W6LZ}U zX2QnW7lPQm!-pgsRh$Rxq+tS|LfE_T9hZ*a3%%5EE8!rlmCi9s zC%T&Q39zQ(krY&I&{y3pYWA%5nHIL{j;9dmcaU{*@}l1i1fbF-HD&(6I+spEHr?l5 z6XUR+=CRY)I%wupKQI4-`6@A*Z2p1C5}Q+EOD4Yb@LB`10Ghl=YqM}RO`lWgijdXcY?-_PlpTe z5*pPp$8~kOI0r-}EJwDCeZBX!`~Vja_Xl`%VEZe$l0N#Q`pQFV5Kk9_nkJD}iNtEl z0C^Kr-ATPgZ(oeg!%ExcVXg|I_d=BoM=ZHAT`5PDZJr04Ur3RdN~zCSJui+P?cOm? zZ_4uvSbO6q9^3ohA?X&NT{--uRs)j1^n_QP0Q$3&rxFIzTz7O`nX?jRXhg1DeB#5) z(GfV1DF?0?JQ|Qk@MriD8NQBaWeKv2Q%Q{4hBkh-u_vne>zF%J~@`u;J25*=?$ zdhu8F1#*^Vel)g8@`n!4w}b9O5MZ9mGr6l(IoOWq9%{A1u0kLk75}< z&VTouJCQe<1WILdAsGA2MManwFz@+UBd8q0t~Z?>7i9wlMSc4rIngyRBL7^uYc7hA zBHUFVhg$Uoyx@ss=>vt^E5y7o;$7KRvv{t|CpAnB&qk`W5$c_mfC9N(b79uh8{1b@ z`%f{Lmb-*Z{$${zz}Myib@*kI7yMEizc6;Irq>h1)$KEnLBTf!E}{B15VVoV)p+aT z76}rh#zlkeIT-ez_6b@mR`!5_WT}T{kciOQ8yX_<@OT6_PmxrmJyWnWqxT>-Aho3b*pIl1(z(06k|pbILiK8h1e<%dkjsXB~8Vf{m4 z;ClZn{kzSkl4$w-j^Qx`(3BIce`g>_bgmJy8*cgJ=8Ty6LZs*o(tJ?TUi$1Et5WlE zPm1hE>IZ@-G>o3sf#8sEAr@8W4+aYgQTPkDDhUV$hNQpvpEmwC*qRWQY}4A92_0DZ zmPs>)&dZ8l5)X-zicS159QB4{Zwz=3=NVHv+vF*NB9 z1yz|msvE4PVio9vx4?D z{ZQdbB!aR@k>T3)149tjYac!k9CIDV$2WZDZLI0o-b>X4G9HSuePIX}6fDMrw_{k4w^WTJKctikHje-7u zn7gF^^f9vkrII_IBPZA9zyVn%O~I^a3h^!RY1?E;v_(46klc%M2I=TV%+aGbx1n_|{GwNit$QzspH)ZRKc+9Ky0a-Mj~~W; z9=1QW{@mQWZ0CL4h$4e)g#u@U;Tecj_=E}U`TnGM7>o{0dU4MT*|8>hhQ`?UB!zFB>>~9<{V@O>aC9U~Une3IWIR5R z_5_;sDvxI0ns0l_QeF?}X5QNM`1(*9drDI7dr~8llWtCKyo`HdZv%?+Yo+%2`Fb=5 zKSVr%FvKu>!KA)Y5&sPD zuJbS|=5`k){vruC`iTofuv9tp)kTGFd-$o@dfQ&XgVVImF;1#Xx#`I3vul#F$qWYb z%LOU(SbQDVH4RnT>9}Wa7hO`?yKvd%M<7B)^-9gvI0d9NpIMkS zRT00KAyowFDZ=SlDLo`s`r?978R0T>hJCU9`HXoWFBuyu7Ifhz-OU9hFUQuonGfWr zokmWPK)otgYn@!v?`Dtcubl8K1%*k2j$mrp>~SkW z=^_So$+T1|P2fC#QyVCNlVUHq?y@pBngYPoosbeTuE5F>N&Y)$kL=WDpkyH~cO!1J zMU8RHS*10ceS^H7l>?Ax-ySAEq;fFak>8M}foyYCs-;Rmzg$T;k1$Bi^ZQD=+=cv~ zbPGjC8@KD2%G>R7`kXxj(wO;v?YYy^+8h$cQIphb3NS8{p_AkYO+3 z@r-QEvcg|3shClf+$g=3b_M|nrQ|lu+E$yX&=MQ;_k3cF{6!0wx6Dg;;-oBc9EN>k zD#NH0R)&||qCZOZwIv9erOFWBUabK&8^iW^&#Oat0LxZ=F3cTrBau=&v4cK^>5k@gj#zWtyXj%YL_X!h>bYx@JNuVPpBwJE56w;HXl zZ1;k@d>8+2?a%T+rZv`KSlm|ckXJH62?JJAR z7ldHyEgPiZ7!yX$7!&3vTs-Y7hkx;Id(DrB6cEMyABU(*M((X7YWt-L#i`S$!5}fl zC#oXNEBbfMF4HSLYC0$tY1Q-u&Ykz7^Eumbt#?%(T*Y>yC7L`~p}oAkt~tH*7e4Q& z$EWB(at2C8c9em~sOw`1CvA#}IOF9Z2~%FBmb4G8IYeC!Dm&P!zH#Jna-NO;Qd{(7 zATVoYNg}*h`Jn02H$^WRu1L+psWjwYMr~!BZZ{afjMr|Rh^JQYjck*m8ZE0?)~vqw zSAykMDOKwNT}~IGR-3e435!bEmBPlvKn{**+>sru9y;ynv+RdQX`cNo_%uiQyM~gY zkNXTcZ~J38fc(I+Tg@T>ta#K|CyTKv73iu?Y3>J!+07C?lcTyZWvw|?(w33jJN{5- zynWxvFsqw231<32Aj^xVe zS{qBm^{P2re~|C%4rPHF|F>PqE#D4Gqy(PQqW(YSb36aV+ngr7;Z^rsa`1CFOVGl|5mBdB0*q*?%XBXPjPm^A~cwh}`D~ z?6gO&d^<6m>+l5?;>v6BSph|=1uthK(GEITC3RddQQ6I%I8e=$ZwLj#N5a1>8ivCg zc9PxY9k%zK80_2>^XcdCV4!Dqbplas_v^F62wKZCbfyb7Wbkyg+t5R?jVp_p=87)rAsVG;p?@}0DhfjF2KY=ur_sDRN5Z@ zBoczZ8+*l`4CNsWF7`5M9V-hSSKJz^0xO62%BvUldB37t{XX4Ba8~4nB7(_iRUV7C zZ;UVO848`?$wGFpL>#F1+QXS!7Eecu#h!577tuSg z6^-(>A_N+VK1MVMP=Fhb(cBTDWU#U9m4gz0I*3`Ekeu#d_-kiPg!qv3`67kym=Gc@ z4AmeEJ6{D5GT9l)0Nt?D)UZ!J6$_sfK%VCX&4dy{lH3oNgOFQ2La|}=(_+;?BPZhJ zbklwJ?_h@!#;1t8lY{2DbWMd63lRBe~A zUI018Hx{L;2 zP!4pmu_b}ynHxga0}8?m18nj=$kLnve9s^Ie^-H@{|7@7h%5N$^Is(t_dm!303><- zFJ^N8IbO0tDI&&}NbSz6da0ByoGx4z$_S2h1eJKQLn#puSq70^es*d-_l4(XJ#*_n zK*J}P(truL6NXuaq7uz`1IeN|p&1V&u2eyhN#=m1r|%dhlWusBQB&9Kj?1K#Hhvs^ z-dw2ubqArME!@rtqD~^LMn}(jgSFkP6{lq?QJpdKZ;mfckF6(uBjSn{+8(#`kG@;n zm3xcjQ0qycjaDG+MetaBT!=+z$|gzdx#dMIAswr_Th_kYiKDKk!&_UmUaRf(O6SR6 zzMcwVclitdu{K&Gt?B%0$DH%Ka)m`JL6Z#Jpcu<41@jFbBz1!FpuJbOJ)Z8kHKT}Q z_!}IRR?c>0&Nt&Qj;h!jwPEdQD`+lYT-#aWIWB5Cq~_MoaCWl~Jf%0pW3b z-Ku(nGC90fjj`rXh7Cc(Xf)$}yt?d+VM=r=6)FS@`OQ&6LV5%jY**8LDEo=q2-2;W zXLFz5Yj$C0KPF35%Za62bizyq5V&Un=D1ejqYy`jNUkEZx`7gG{jZU)SoHqE-`bUo zsxgy5URx|pOM9qlM|Bp2^+Otw#8?sx1ynFD)OACtwIT+Y1B}#snwfkd`ZNWUuZ1Dg z3J5J&JYAt6fN_#GTqdGv#wb8&nj)t%)0R_2(EHvf6Pta)r*dD@@=u{net~%WnTTt@ zjak199mId#cZ9@4m$bZo{wloNngnd}jm87j!n|hi9Gq)eq)1}J2NY6a=#-LWMACKc?Fn0eJgkvFVwzHPJSCda^P{jTCuDdIo7gYl<=sY)}+_Q3T%^*<8y46+?f*t zH^<~z8%7i-y{g&sZx`Wx(?%_9eB=1?F3Q=~ZWpcXS2{)%Z9?Cz?VlQHnd}xq*zI2y zC9dbVFHaskv)NGv?a~q}@_}vlro>|<@v`XmF4Xxq2O;^%wnr{e?a?y4zMGVO?J%x^ zqr6{Bq#9Sdib%!nZ>kG=6?f%d7)P_OZ)Dq)iWU>+(HwnZ2ea?AwD@Sgm6u&|?0uVx zHxW#~O1#4B=U!!E>x~yKjHM?d#H@c!rP-Zxm{VDkNw8W`WrERLYXUVKYIYoFqPj*A zFD}v?HkI1j_Hx{o@ika5m+~!ax#-9xYI>XIWkO7@)a8b3_C=V??O4fZ7soW&yvXmK z-Ps1%D+Tf_>unWrYEhe=B?nJ0+0j#f@%V`N7WrAJ=nVTZJE zu||VpNVe*I9}B7xo>6jqrpD3elbe=GMt4c$PzD=N*o1C^{TEqP{ol-`R~MW*V!kQ% zn+%OSPE%}dn?Wye?nKP0-xm5TJ80J_9&2daEWBpADhIPefDBt{al>tbKt)<2snTIu zZ=8K+!iMD>YoHCf*0G)b%;7n6H#1R~!v@As4^5D1lst)5TM3#`b+OnbI8 ze2bnPSnwdjYL}M91Q_*VgiH&E$IwTZ8S_za4*+yAgj5BfnG{is4=6UmO(6JZKUR5SgyC~B8+P%s38NFVIE@Q6rfXPzmilun?o|)VM7f+` zBdcF#M3FbOR$Q@j4_G#;NQenj3gRkK>d0ZD3{BN3G>@?AF2^t#o1j%e<=&-KcS+6# zm6Eq30rjfpO$--s?Bj7Y=s=H~<(V?^04ns*QVD^CIxlO0hb~rThyP*JH%;Os3o-J4%j@DjkQ* zLeNu35%fvejsqOEvSa^M)%+~Sb>V1HspK+y1Fw_zI1{Y*=POV}KhLx<6ibQ~4s47T z9GzXb!%Psmx}s#;glavT22gg7+Otqq7wiTH1hgtBRnI*GQ#>D9U4?Q(U=8Ef&r_)N z0=gyY`$sC*AdM`2lT31sy!%Z?Ys5TOU?=+5bRrov=-JL8B#s+Yvyd!I7ej~T!?yqB z0G*_hL^v2o@bg96In$!D)){V8(7HmoIrS38vkt=Hk`(G)a-;#YyjiDcdB0a)e+l(c zZm;JipJkXo>r!!n|Drb)#WeSzW$q%|2m4c~$7Z)uqb+w8Cuw%9_w^&^?xo*ck_nj3 z@uxkG#F&A0mw=OGT>nKcYT1XP=j~}ze zn><9CpZC;te(7Psr&pm%h}d%@$tGvUmk74-*flv?d+qOAVh6;i))(ag1T^!K6{7w~ue z!|EGUtV7CwfxW&=hxs>+K1hz!@B+U!ly3QxjW>KHQcY2c$WirWOqv|mZz>>sCYc8( zb%Zcz*FDj9+sw}1&G{$)chro>?Mq@q&LmDOu;2mtO(FN?UjNt5^ovxp;t5fo@QHzU z;@Re6YR|x?3ORQ%4G;Mm9#`^!7H|`;Xumbak->7ftC1n_fQOOC(Y%4vPXoHvvjLG> zc8D~=@;n6U(W)GDu&xX|!V_A-YIzVVtZDOu0=ci9mBwRhz zFqbia8@GeR7L*&w&8f2`d^!*4v5n9uA^pY1j~onD8Uz=Xti(&Y5Vt=jP7-gF6G4=5qf>o$TuBF<{bDQW z0b?DoR%bxUoO?s<1AS5!>{}@}*5I}_zrca*l2lfIwAeWp8$3sC3 ztEe~-=&EHrxI++EdY}cv7fZKqiMa;iYSBl>2Oym1mZ4f5e0y;F2GSZMs^!hUS$x*a z2x9lgyVN0Mf+2;s^Orv`y{3ztYA$?w2dJ!1D4*;^h;JGzMmFu3ry}jIu)6VTR`}{ypXCA07t@KT>O#Gs%@vd7>me@^RA7eN=#Q>CzXb-L%&MZzWdOV}12D8!Qm# z!NxL)Cak9k8f)TR!7r3e|{Z$-S|MS9FN8DrR3$qkh}! z<`ucgSNcmAQP!FnVJ+dIMQmR>##46@b&ruT(WY`9yt%YXg3x?K^J#|)6Kj>n_;2)0 zm3y_Qk*;Ud)nT%?iqrJm(>i>`eX-3+%cjK$o3rJfDbTKEad5T1T|O7#9NrqHu~rmt zN#ozS^(SDrA zsv(RB8@C1~R?f8Zekms{TPVD5IM3Z5td7{^#dnE0>oo=gjzot0pc|W2-CS6Sq_xY2 zKMDYyz&m62bzH&UjDIx#Y3dY%4v<=hB-68UFkV`UdO2n=$ z#L&BUcq-2)V8}*ybjF?kFjFJjt1T<@KGe!$-^(q=N1LgKCHaX=4v=|7;o~<0rzSEhRMu+*`oOKW z5?SX<;N?sF@l6-Kc}=7kTvS>_d~#^UkwD#!5W!16`VLA}O#fomaSk+2EKlne)J(XWzpHxYn7?p-1nR=c# zTBjb)7n*)FYNEN|o3!YkmYQ&hI$^e|!bc*!!0>rekNz!DNYZ#$6A^S^LvoH_P$Rlp7@a zv#OyyvAiwaMX5Am9pv?V@u_5A0mA!KU|3&r8 zpROC7?dY#2mr0fJZOR46^c1;}+FVaQ9q~Ysb}-iX@Fj05!hZBw3NZdz=k&|W(w7ht zbW%mADXI^t)}f#^V80V&k3;4+rO}GH9b8#W9#VgsSAjF*maJdH`dPzgJo81_2Xj6B zJ?M*!zA#+fIE5N^f$!-N9dpW~a%ubr zd_d2GxJYsVk4Ts)vAZiCi+n{SDW=MO5zSQ=ui$AD&S~!p9(aku@VF^KE&Dp%D0f|I?$O6l|8FC5g+$-iz8m9mo|L&C8{W5`2ds*u}tmk?Njg-NH$ zuYOT^Z6+X4k3hP4;z6TETdvNR=lR#Nrl9yIl_xy=)8Zrf?T?DGarFi;1Ez}5*}eDF z*k0GJ++IymAM%H#tFlzTmafY98Ox-XcLSY8SwvFPht`ItUu$z4q86N?zTuX>LiAb= zlK=f#yCxc&orpOyjF0y`XPSLU#kcRfrbv8KNQJvbMg)Z051D(nq^I#O+N~k_rE3^b z7d~@V=<*_xEmBf5X;pk)FMi%&)Db#b=!dc5kMQgRc5;-gb;nNfstPyH)^Ix8@L!5{ zlF1VP3$6U7zVU~d<_qiWn#c2qxq?4l>5EY05pwrj9OV5a;9Pd1I5*(JJPX!(wjzNZ ztk+_oHW*koHw&sj%v}q8^&1R8`YYHU@|{TOdBLH70I};=UY@EUkS01XT#dOHO5)we zAg~vu^3FrMVKr&i1H#u2m-wJuqWB1}w_x5H(JExSxDp4Qq{9U}k>OtiWp+5U@H6vL zBilZ%XL1Ifs^Mk%ad$;&xX#5S+!T>@H@Oek$1*TUQ21Cg<@w+eVAbh%`sIUJ;&s28 z&b|j-P)*TP#fmBIGS^y9D=0=;SE@SUw34e=<)|rOh7_X)eQ7I@l7#=2=zL~?Q_zyY-NH*)p__8 zXl=T?l&$Mk;T~zeH{2`IHP5}e<7FBv*>4~b*qco{T4Fe{QmTwndm8vgt**DfC7CYj^x4(3e#4BnUZyCm>k zsypku(lIZ7|KRtdLkDg0(`D|@fP#}ehZPFpUFrPB%_3QBQU4Pv^DH7{W{U;8ceoPy zV~^F5{ZZp<93x z9h#!%4@8_||RJ`FEIb~EFW}a)A)E--&5iii? z%}-rwtJHPYM=>hb??##Q1)hIGlDOZ+-FDeHJ%>og3OCN~H?Z~H=Cn>dYeGTf&^G!HJ;=j{ObHef}gi_Ld zJJ5hmjNqRtez^0*hgfd>{R0Zxyw&rJ0*4)#u8s9yzg-C?d25;-n4+(`D1;FQ>!(sUC3!(_REC? zbP^_^zyPg9hK;2vAV8PR6|A__<*1qLq6$Eq8l4S6miweXq5?a-nHN^HdIY!f_-o@u zp>Y<5g14Q{Vq)T-cj+<(iSIn49(9+qkL2C3?9iuc1&4aE89IqL*f&6a^^zfQ!1XvI zfXQM>34_t9t82$vL;XRil9PbsK+TGPzDy#&S3cjbOdEm~NI6t9>84uAq4u_*#>l9q z>VI>bQwUr-2dEYXydv#&S)X**ktfYGV57CIm05Omhc}Jl(!cnjYr1cFV7GftkGncB z&Hn2ZS{d3RwD9IFW43<+gepDlSxb;sKMd4%92<=IMHrjqXOhMtmgBT~)AzY1_Q_Nj zw@j(JDHekRvv=jqG7SP@l9|N~)7YfFU*pUw<#ReCAH21<$J61cB~wM-4wnZuf?!x8 z&@&FDqPxuKW1#{Qs|nwITE(P<^g=KYP1JZt=8t1#dyQx~P)ChKLSV$ir527yem+}C z&!-)ct4_`<5j}3Z5e_5){UC0`%OIs5&V!TEOyxa5zGJiDegY_wdbk620d=Q*!#?^i z2(l5VjooD9Z%&w*U%NHIDy}RGVS6`mlYp4y-LVW1;yhH5ADCa|jvjb^77b)wd5-wz zEa)Y94>QRui~kZH!G|4I!~88=%0&5G0eO<-nmHrap#K1XR^grjSe|Z|icAjz75nrP zACVIcUvi7-|NNp!+-;Hwr2EQhS0&}q%-04`%he-MLZ%u)DE3(ue zxb}WfOasYLv|TI5YXcSpqy`fNgeG}+nlPF93JI91>1BvY--xvJTv2LSv#U(gM20pcy6m*!qT-REi98kj;igw`RKd( zC~Lj(W4oNOhm!qSdy9MN+v(nUxk~==dUOJzzjMH4O1xV@F(@m5V@h|b4a{J?WriGBkzCCt>v1AD;OO~ud zS+hiL*0B>p#vMeuS<-!EH+B=*GRP8IgoH@h#@K0WF;|rG%kOEr_vJO6f6jBx^PclP zbLRXpXXg8SK7qpH#M2sM(~zwCG;wtNyn?vMWGJEWiqBj0IAtfzk9VBXz_y~AHU6~9 zecjKYtN>+acdRx@uVVO?`NcJ&LhT1VM{@&HtRG3?=|2^Z60B~K*p@boc23}r-TbaD z!>XBP(u5m`S#SH_8J3gct?H5V^cvy_&#begx)Yl6h2xK*oRO@Z_Bk#4%g%EXE^a;b zkdlQ0F~ST`@j9*Ukp#&{yF1LU&!?+q4-voEIiw6U1cY^&#p3_)YP{yLY(Agqbw4*} z8(ZHtUQ70I_%0rD;mz}WmdC+0xKo3QFeYCmLt{d-lfmT;q-hFyBwF=F%k9>_`t!PruazqK8B3CmUW_dDa zB)FO$wiBn55}KS%KJ)C|1^w#z0|)Q6S9)z{ffONO7hcJN5)R|W9vdu zoyY?Fc{jh}d(4(E0)-LvT6x;Xw+t|wZ!NgmE6k&T#;PUpagBt@kH>C#&)1QC7t?o_ zAGL6{))=~`ebD+i!0lx%G|ZSqFsmA;M>fkEdtL1C89?>1IG+_kb(Cs5{gGC1!-(ON zM}(4=p|PQTfWwU^_usPnyyi7ADZw^bJ=~J+bw8SzTDySd=E@>hxg8&3{L`~}(y3Z% zTbEOv62Z1^`_1$_4C`-6(Z~G7_vh=SAG#x|65B2UCPq!?^i5{&D_Tm_eSWw1uIHig zn@TUk&u!KYG7rm4?ApX8yR0$1&ey!0O9w)5rKNLOWZR)+LC!X^mE!XjZypOQMFo== zmvnO_yf}T-26K4YI!MOfmLivK-8F#=<~6fxyZh< zDenbKj-#aen^9$u0nf~#{nX>NLw5e4-uETs@zK<|UKD6Yl2Ed0Icys!G>* z`dZe_AfCIqLx1P1+N6?X{7YMGtt7VEB{zz~#I=XoGkH}LvBRHap207-`iz$gn{&4{ zh&b+cohV1@otped*^G;Fg|p-3hRt5gX+$C`FV>nOxo6+yY`w>cwW2^NMP27@_Lw}y zeaVVqMbe^?%#osXsOgU-hFW-hvZ9_)GLOA;>wpBC`+#W8jq)h_D@5#SkY(|uF!^Be zvpDxpLH;k;0&3`IV|#nk1OM7EvmXh2`2Dis?iDd54f*uw}jI5THWNIpIqj#NNJ0^2-^Wl*XFz;=xU8n9fv&FLCRIMSj7Q{ZWQ@hZc50(s; z3m6Qr;uqSO66T^?IXs83+G)5t6Sk}PG{2s=Wk-sPcMR5+`7w%`ajV|Oy3(43TSu+C zM~-Zmxa(}^%;=3m237SDD%R~xy8}xO5~CNQrV)Ltrk&z;N6jZt9)3}| z@p0saOnkL#elg?UO_@Ig`wP$CW^}0K&8wf#eIy++_>C90jd2LruH+s%w`}ihw92os zil}cNBDANCIN?G$uC+&?1()6!CWQzL*!D=s5W4p6HKG=QYwh{gCf&{3AST zrcNN5Ph~ju9%GXq_H!sthKqWX%||#6QQ)I!eFR95MgKL%q5H-4IkR`d3zHeeKHiFy z(u>-81|;aIADIjbIk)%244uctVlG#1_LwwztihjJ%A5%KqOMyC2rvu|l#eN|91lN5 z=Nt%}c-$Ej=SrDJCxNO7n}28o!M0qw?(~+_vJ6vZYt6Tye z6T%7!VXP5SO7V$#{fL1jMC{}K@z(d_t)^>op*uwbQ*~aco^uJ0YYm$`n&-3CT0M4^ zFXv+7eDBVP03x6O-dE>vRE;nbk$iI7r0?Z}g>Ni#E!lJJj2W&fiz6x=Nh+D04r|@# zfX;@vAkD%`Z1>BilpnVOI0lkfdtaiv2ozv;#fqmZm`>4^9_7-NWrc7gB~{=VO0r|6 zi%rTpc9bR18A3{*7gMjq+3UOVpKWMM)QH+;&%Km}>K;^!mqB|X7TOYb9#>(mT>XWq4gBjFX0woPN(1n^o!XP zq~rFHG`l8OKHGr&=M^G~PMXO+(xsUFhg$FK8?}<)`m7;V2eyLo#pS zkX&aXT3)!$R%e?x&V7=z5>efncx|Ql+l*CJ5z3#j#p$}#Gqc4tP0QJgNXW1p`S}VFsL_g(d*5kcnN{R|e&8PrW zKTs&SOM>;#Ax#=6M1~6G&d35Z&T2GJkrEZ6pOpa)9IJjGsXzsSkdS{BB;hyeOv! zKFJJDEwaGMyunY48gwI|%#ti{pmX def targets = ArrayListMultimap.create() targets.put(null, target) - cell.target = targets + cell.target = targets as ListMultimap cell.transformationIdentifier = functionId diff --git a/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy index 3e82f14..10609dd 100644 --- a/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy @@ -36,8 +36,6 @@ import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode; -import groovy.cli.picocli.CliBuilder; -import groovy.cli.picocli.OptionAccessor import to.wetransform.halecli.project.migrate.AbstractMigratorCommand import to.wetransform.halecli.util.ProjectCLI;;;; diff --git a/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy index 9027f33..92e431f 100644 --- a/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy @@ -34,7 +34,6 @@ import eu.esdihumboldt.hale.common.schema.model.SchemaSpace; import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext import groovy.transform.CompileStatic -import groovy.cli.picocli.OptionAccessor; import to.wetransform.halecli.util.ProjectCLI;;;; /** diff --git a/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy index 3db19fa..7b6bbe1 100644 --- a/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy @@ -36,8 +36,6 @@ import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode; -import groovy.cli.picocli.CliBuilder; -import groovy.cli.picocli.OptionAccessor; import to.wetransform.halecli.util.ProjectCLI;;;; /** diff --git a/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy index b03d3b3..378e00a 100644 --- a/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy @@ -37,8 +37,6 @@ import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace; import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext import groovy.transform.CompileStatic -import groovy.cli.picocli.CliBuilder; -import groovy.cli.picocli.OptionAccessor; import to.wetransform.halecli.util.ProjectCLI import to.wetransform.halecli.util.SchemaCLI;;;;; @@ -52,7 +50,7 @@ class ReplaceSourceCommand extends AbstractMigrationCommand Date: Wed, 26 Apr 2023 21:54:01 +0200 Subject: [PATCH 08/24] refactor: replace deprecated groovy.util.OptionAccessor and CliBuilder with groovy.cli.picocli imports ING-3616 --- build.gradle | 1 + .../halecli/data/RewriteCommand.groovy | 46 ++++--------------- .../halecli/data/SplitCommand.groovy | 43 +++++------------ .../halecli/groovy/GroovyShellCommand.groovy | 3 +- .../AbstractDeriveProjectCommand.groovy | 29 +++--------- .../project/ExportProjectCommand.groovy | 23 ++-------- .../alignment/FilterAlignmentCommand.groovy | 37 ++++++--------- .../project/match/MatchSchemasCommand.groovy | 16 +++---- .../halecli/project/merge/MergeCommand.groovy | 29 ++++-------- .../migrate/AbstractMigrationCommand.groovy | 26 +++-------- .../migrate/AbstractMigratorCommand.groovy | 28 ++++++----- .../migrate/MigrateMatchingCommand.groovy | 29 +++--------- .../migrate/ReplaceSourceCommand.groovy | 30 +++--------- .../halecli/schema/RewriteCommand.groovy | 9 ++-- .../halecli/util/HaleConnectCLI.groovy | 8 ++-- .../halecli/util/InstanceCLI.groovy | 38 ++++++--------- .../halecli/util/ProjectCLI.groovy | 8 ++-- .../wetransform/halecli/util/SchemaCLI.groovy | 34 +++++--------- .../halecli/data/RewriteCommandTest.groovy | 9 ++-- 19 files changed, 138 insertions(+), 308 deletions(-) diff --git a/build.gradle b/build.gradle index de5db6d..c3a4139 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,7 @@ plugins { apply plugin: 'org.standardout.eclipseconfig' sourceCompatibility = '1.8' +targetCompatibility = '1.8' group = 'to.wetransform' diff --git a/src/main/groovy/to/wetransform/halecli/data/RewriteCommand.groovy b/src/main/groovy/to/wetransform/halecli/data/RewriteCommand.groovy index a3c1a1a..19b6ee2 100644 --- a/src/main/groovy/to/wetransform/halecli/data/RewriteCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/data/RewriteCommand.groovy @@ -15,50 +15,24 @@ package to.wetransform.halecli.data -import static eu.esdihumboldt.hale.app.transform.ExecUtil.fail -import static to.wetransform.halecli.util.HaleIOHelper.* - -import java.io.File; -import java.util.Iterator; -import java.util.List -import java.util.concurrent.atomic.AtomicBoolean; - -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.jobs.IJobChangeEvent -import org.eclipse.core.runtime.jobs.IJobChangeListener; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.core.runtime.jobs.JobChangeAdapter; - -import com.google.common.io.Files - -import eu.esdihumboldt.hale.app.transform.ConsoleProgressMonitor -import eu.esdihumboldt.hale.common.cli.HaleCLIUtil; -import eu.esdihumboldt.hale.common.core.io.HaleIO -import eu.esdihumboldt.hale.common.core.io.Value; -import eu.esdihumboldt.hale.common.core.io.report.IOReport; -import eu.esdihumboldt.hale.common.core.io.supplier.FileIOSupplier -import eu.esdihumboldt.hale.common.headless.transform.AbstractTransformationJob; -import eu.esdihumboldt.hale.common.instance.graph.reference.ReferenceGraph; -import eu.esdihumboldt.hale.common.instance.graph.reference.impl.XMLInspector +import eu.esdihumboldt.hale.common.cli.HaleCLIUtil +import eu.esdihumboldt.hale.common.core.io.report.IOReport import eu.esdihumboldt.hale.common.instance.io.InstanceWriter -import eu.esdihumboldt.hale.common.instance.model.DataSet; -import eu.esdihumboldt.hale.common.instance.model.Filter; -import eu.esdihumboldt.hale.common.instance.model.Instance; +import eu.esdihumboldt.hale.common.instance.model.DataSet import eu.esdihumboldt.hale.common.instance.model.InstanceCollection -import eu.esdihumboldt.hale.common.instance.model.impl.FilteredInstanceCollection; -import eu.esdihumboldt.hale.common.instance.orient.OInstance; -import eu.esdihumboldt.hale.common.instance.orient.storage.BrowseOrientInstanceCollection; +import eu.esdihumboldt.hale.common.instance.orient.storage.BrowseOrientInstanceCollection import eu.esdihumboldt.hale.common.instance.orient.storage.LocalOrientDB -import eu.esdihumboldt.hale.common.instance.orient.storage.StoreInstancesJob; -import eu.esdihumboldt.hale.common.schema.model.Schema; -import eu.esdihumboldt.hale.common.schema.model.TypeIndex +import eu.esdihumboldt.hale.common.schema.model.Schema import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace -import eu.esdihumboldt.util.cli.CLIUtil; +import eu.esdihumboldt.util.cli.CLIUtil import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext -import groovy.transform.CompileStatic +import groovy.cli.picocli.CliBuilder import to.wetransform.halecli.util.InstanceCLI import to.wetransform.halecli.util.SchemaCLI +import groovy.cli.picocli.OptionAccessor + +import static to.wetransform.halecli.util.HaleIOHelper.guessSchema /** * Reads a source file and writes it. diff --git a/src/main/groovy/to/wetransform/halecli/data/SplitCommand.groovy b/src/main/groovy/to/wetransform/halecli/data/SplitCommand.groovy index 0a57375..eca8cae 100644 --- a/src/main/groovy/to/wetransform/halecli/data/SplitCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/data/SplitCommand.groovy @@ -15,49 +15,30 @@ package to.wetransform.halecli.data -import static eu.esdihumboldt.hale.app.transform.ExecUtil.fail - -import java.io.File; -import java.util.Iterator; -import java.util.List -import java.util.concurrent.atomic.AtomicBoolean; - -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.jobs.IJobChangeEvent -import org.eclipse.core.runtime.jobs.IJobChangeListener; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.core.runtime.jobs.JobChangeAdapter; - -import com.google.common.io.Files - -import eu.esdihumboldt.hale.app.transform.ConsoleProgressMonitor -import eu.esdihumboldt.hale.common.cli.HaleCLIUtil; +import eu.esdihumboldt.hale.common.cli.HaleCLIUtil import eu.esdihumboldt.hale.common.core.io.HaleIO -import eu.esdihumboldt.hale.common.core.io.Value; -import eu.esdihumboldt.hale.common.core.io.report.IOReport; +import eu.esdihumboldt.hale.common.core.io.Value +import eu.esdihumboldt.hale.common.core.io.report.IOReport import eu.esdihumboldt.hale.common.core.io.supplier.FileIOSupplier import eu.esdihumboldt.hale.common.core.report.ReportHandler -import eu.esdihumboldt.hale.common.headless.transform.AbstractTransformationJob; -import eu.esdihumboldt.hale.common.instance.graph.reference.ReferenceGraph; +import eu.esdihumboldt.hale.common.instance.graph.reference.ReferenceGraph import eu.esdihumboldt.hale.common.instance.graph.reference.impl.XMLInspector import eu.esdihumboldt.hale.common.instance.io.InstanceWriter -import eu.esdihumboldt.hale.common.instance.model.DataSet; -import eu.esdihumboldt.hale.common.instance.model.Filter; -import eu.esdihumboldt.hale.common.instance.model.Instance; +import eu.esdihumboldt.hale.common.instance.model.DataSet import eu.esdihumboldt.hale.common.instance.model.InstanceCollection -import eu.esdihumboldt.hale.common.instance.model.impl.FilteredInstanceCollection; -import eu.esdihumboldt.hale.common.instance.orient.OInstance; -import eu.esdihumboldt.hale.common.instance.orient.storage.BrowseOrientInstanceCollection; +import eu.esdihumboldt.hale.common.instance.orient.storage.BrowseOrientInstanceCollection import eu.esdihumboldt.hale.common.instance.orient.storage.LocalOrientDB -import eu.esdihumboldt.hale.common.instance.orient.storage.StoreInstancesJob; -import eu.esdihumboldt.hale.common.schema.model.Schema; -import eu.esdihumboldt.hale.common.schema.model.TypeIndex -import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace; +import eu.esdihumboldt.hale.common.schema.model.Schema +import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext +import groovy.cli.picocli.CliBuilder import groovy.transform.CompileStatic import to.wetransform.halecli.util.InstanceCLI import to.wetransform.halecli.util.SchemaCLI +import groovy.cli.picocli.OptionAccessor + +import static eu.esdihumboldt.hale.app.transform.ExecUtil.fail /** * Splits a GML source file and creates multiple target files. diff --git a/src/main/groovy/to/wetransform/halecli/groovy/GroovyShellCommand.groovy b/src/main/groovy/to/wetransform/halecli/groovy/GroovyShellCommand.groovy index 8dc6be9..0faa513 100644 --- a/src/main/groovy/to/wetransform/halecli/groovy/GroovyShellCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/groovy/GroovyShellCommand.groovy @@ -32,7 +32,8 @@ import org.codehaus.groovy.tools.shell.util.MessageSource import org.codehaus.groovy.tools.shell.util.NoExitSecurityManager import org.eclipse.core.runtime.IConfigurationElement import org.eclipse.core.runtime.Platform - +import groovy.cli.picocli.CliBuilder +import groovy.cli.picocli.OptionAccessor /** * Groovy shell command based on Groovy shell main class. * diff --git a/src/main/groovy/to/wetransform/halecli/project/AbstractDeriveProjectCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/AbstractDeriveProjectCommand.groovy index 1c647ff..5093cd5 100644 --- a/src/main/groovy/to/wetransform/halecli/project/AbstractDeriveProjectCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/AbstractDeriveProjectCommand.groovy @@ -15,34 +15,17 @@ package to.wetransform.halecli.project -import org.eclipse.core.runtime.content.IContentType - import eu.esdihumboldt.hale.common.align.model.Alignment import eu.esdihumboldt.hale.common.cli.project.AbstractProjectEnvironmentCommand -import eu.esdihumboldt.hale.common.core.io.HaleIO -import eu.esdihumboldt.hale.common.core.io.extension.IOProviderDescriptor -import eu.esdihumboldt.hale.common.core.io.project.ComplexConfigurationService; -import eu.esdihumboldt.hale.common.core.io.project.ProjectIO; -import eu.esdihumboldt.hale.common.core.io.project.ProjectWriter -import eu.esdihumboldt.hale.common.core.io.project.extension.ProjectFileExtension -import eu.esdihumboldt.hale.common.core.io.project.extension.ProjectFileFactory; -import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration -import eu.esdihumboldt.hale.common.core.io.project.model.Project; -import eu.esdihumboldt.hale.common.core.io.project.model.ProjectFile -import eu.esdihumboldt.hale.common.core.io.report.IOReport -import eu.esdihumboldt.hale.common.core.io.supplier.FileIOSupplier; -import eu.esdihumboldt.hale.common.core.io.supplier.LocatableOutputSupplier -import eu.esdihumboldt.hale.common.core.report.ReportHandler; -import eu.esdihumboldt.hale.common.core.service.ServiceProvider -import eu.esdihumboldt.hale.common.headless.HeadlessIO; -import eu.esdihumboldt.hale.common.headless.impl.HeadlessProjectAdvisor; +import eu.esdihumboldt.hale.common.core.io.project.ComplexConfigurationService +import eu.esdihumboldt.hale.common.core.io.project.ProjectIO +import eu.esdihumboldt.hale.common.core.io.project.model.Project +import eu.esdihumboldt.hale.common.core.io.supplier.FileIOSupplier +import eu.esdihumboldt.hale.common.core.report.ReportHandler import eu.esdihumboldt.hale.common.headless.impl.ProjectTransformationEnvironment -import eu.esdihumboldt.hale.common.schema.model.SchemaSpace import eu.esdihumboldt.util.cli.CommandContext import groovy.cli.picocli.CliBuilder -import eu.esdihumboldt.util.io.OutputSupplier -import groovy.transform.CompileStatic; -import to.wetransform.halecli.project.advisor.SaveProjectAdvisor +import groovy.cli.picocli.OptionAccessor /** * Base class for command creating derived projects. diff --git a/src/main/groovy/to/wetransform/halecli/project/ExportProjectCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/ExportProjectCommand.groovy index 1a2f517..5942bd0 100644 --- a/src/main/groovy/to/wetransform/halecli/project/ExportProjectCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/ExportProjectCommand.groovy @@ -15,29 +15,14 @@ package to.wetransform.halecli.project -import java.util.List - -import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigration; -import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigrator -import eu.esdihumboldt.hale.common.align.migrate.MigrationOptions; -import eu.esdihumboldt.hale.common.align.migrate.impl.DefaultAlignmentMigrator -import eu.esdihumboldt.hale.common.align.migrate.impl.MigrationOptionsImpl -import eu.esdihumboldt.hale.common.align.migrate.util.EffectiveMapping; -import eu.esdihumboldt.hale.common.align.model.Alignment -import eu.esdihumboldt.hale.common.cli.HaleCLIUtil; -import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration; -import eu.esdihumboldt.hale.common.core.io.project.model.Project -import eu.esdihumboldt.hale.common.core.report.SimpleLog; -import eu.esdihumboldt.hale.common.core.service.ServiceProvider; +import eu.esdihumboldt.hale.common.cli.HaleCLIUtil import eu.esdihumboldt.hale.common.headless.impl.ProjectTransformationEnvironment -import eu.esdihumboldt.hale.common.instance.io.InstanceIO; -import eu.esdihumboldt.hale.common.schema.io.SchemaIO; -import eu.esdihumboldt.hale.common.schema.model.SchemaSpace; import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext -import groovy.transform.CompileStatic +import groovy.cli.picocli.CliBuilder +import groovy.cli.picocli.OptionAccessor import to.wetransform.halecli.util.HaleConnectCLI -import to.wetransform.halecli.util.ProjectCLI;;;; +import to.wetransform.halecli.util.ProjectCLI /** * Command exporting a project diff --git a/src/main/groovy/to/wetransform/halecli/project/alignment/FilterAlignmentCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/alignment/FilterAlignmentCommand.groovy index 8192873..2e4d079 100644 --- a/src/main/groovy/to/wetransform/halecli/project/alignment/FilterAlignmentCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/alignment/FilterAlignmentCommand.groovy @@ -15,41 +15,32 @@ package to.wetransform.halecli.project.alignment -import javax.xml.namespace.QName - import eu.esdihumboldt.cst.functions.groovy.GroovyJoin -import eu.esdihumboldt.hale.common.align.migrate.util.MigrationUtil; -import eu.esdihumboldt.hale.common.align.model.Alignment -import eu.esdihumboldt.hale.common.align.model.AlignmentUtil; -import eu.esdihumboldt.hale.common.align.model.BaseAlignmentCell; -import eu.esdihumboldt.hale.common.align.model.Cell -import eu.esdihumboldt.hale.common.align.model.CellUtil; -import eu.esdihumboldt.hale.common.align.model.Entity -import eu.esdihumboldt.hale.common.align.model.ModifiableCell; -import eu.esdihumboldt.hale.common.align.model.MutableAlignment -import eu.esdihumboldt.hale.common.align.model.MutableCell -import eu.esdihumboldt.hale.common.align.model.TransformationMode; +import eu.esdihumboldt.hale.common.align.migrate.util.MigrationUtil +import eu.esdihumboldt.hale.common.align.model.* import eu.esdihumboldt.hale.common.align.model.functions.JoinFunction import eu.esdihumboldt.hale.common.align.model.functions.join.JoinParameter import eu.esdihumboldt.hale.common.align.model.impl.DefaultAlignment -import eu.esdihumboldt.hale.common.align.model.impl.DefaultCell; -import eu.esdihumboldt.hale.common.core.io.ExportProvider; +import eu.esdihumboldt.hale.common.align.model.impl.DefaultCell +import eu.esdihumboldt.hale.common.core.io.ExportProvider import eu.esdihumboldt.hale.common.core.io.Value -import eu.esdihumboldt.hale.common.core.io.ValueList; +import eu.esdihumboldt.hale.common.core.io.ValueList import eu.esdihumboldt.hale.common.core.io.project.ComplexConfigurationService -import eu.esdihumboldt.hale.common.core.io.project.ProjectIO; +import eu.esdihumboldt.hale.common.core.io.project.ProjectIO import eu.esdihumboldt.hale.common.core.io.project.model.Project import eu.esdihumboldt.hale.common.headless.impl.ProjectTransformationEnvironment -import eu.esdihumboldt.hale.common.schema.SchemaSpaceID; -import eu.esdihumboldt.hale.common.schema.io.SchemaIO; +import eu.esdihumboldt.hale.common.schema.SchemaSpaceID +import eu.esdihumboldt.hale.common.schema.io.SchemaIO import eu.esdihumboldt.hale.common.schema.model.TypeDefinition import eu.esdihumboldt.hale.io.xsd.constraint.XmlElements -import eu.esdihumboldt.hale.io.xsd.model.XmlElement; -import groovy.json.JsonSlurper +import eu.esdihumboldt.hale.io.xsd.model.XmlElement import groovy.cli.picocli.CliBuilder -import groovy.transform.CompileStatic; +import groovy.cli.picocli.OptionAccessor +import groovy.json.JsonSlurper +import groovy.transform.CompileStatic import to.wetransform.halecli.project.AbstractDeriveProjectCommand -import to.wetransform.halecli.project.AbstractDeriveProjectCommand.DeriveProjectResult + +import javax.xml.namespace.QName /** * Command creating a project with a filtered alignment. diff --git a/src/main/groovy/to/wetransform/halecli/project/match/MatchSchemasCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/match/MatchSchemasCommand.groovy index 490c143..c1f4f2f 100644 --- a/src/main/groovy/to/wetransform/halecli/project/match/MatchSchemasCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/match/MatchSchemasCommand.groovy @@ -15,21 +15,17 @@ package to.wetransform.halecli.project.match -import java.util.List - -import eu.esdihumboldt.hale.common.align.model.Alignment; -import eu.esdihumboldt.hale.common.cli.HaleCLIUtil; +import eu.esdihumboldt.hale.common.align.model.Alignment import eu.esdihumboldt.hale.common.core.io.project.model.Project import eu.esdihumboldt.hale.common.core.io.supplier.FileIOSupplier -import eu.esdihumboldt.hale.common.core.report.ReportHandler; import eu.esdihumboldt.hale.common.schema.model.Schema -import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace; +import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext -import to.wetransform.halecli.project.ProjectHelper -import to.wetransform.halecli.project.match.postnas.PostNASSchemaMatcher -import to.wetransform.halecli.util.ProjectCLI; -import to.wetransform.halecli.util.SchemaCLI; +import groovy.cli.picocli.OptionAccessor +import to.wetransform.halecli.util.ProjectCLI +import to.wetransform.halecli.util.SchemaCLI +import groovy.cli.picocli.CliBuilder abstract class MatchSchemasCommand implements Command { diff --git a/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy index 10609dd..5f52d66 100644 --- a/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/merge/MergeCommand.groovy @@ -15,29 +15,16 @@ package to.wetransform.halecli.project.merge -import java.util.List - -import eu.esdihumboldt.hale.common.align.merge.impl.MatchingMigration; -import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigration; -import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigrator -import eu.esdihumboldt.hale.common.align.migrate.MigrationOptions; -import eu.esdihumboldt.hale.common.align.migrate.impl.DefaultAlignmentMigrator -import eu.esdihumboldt.hale.common.align.migrate.impl.MigrationOptionsImpl -import eu.esdihumboldt.hale.common.align.migrate.util.EffectiveMapping; -import eu.esdihumboldt.hale.common.align.model.Alignment -import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration; -import eu.esdihumboldt.hale.common.core.io.project.model.Project; -import eu.esdihumboldt.hale.common.core.service.ServiceProvider; +import eu.esdihumboldt.hale.common.align.merge.impl.MatchingMigration +import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration +import eu.esdihumboldt.hale.common.core.service.ServiceProvider import eu.esdihumboldt.hale.common.headless.impl.ProjectTransformationEnvironment -import eu.esdihumboldt.hale.common.instance.io.InstanceIO; -import eu.esdihumboldt.hale.common.schema.io.SchemaIO; -import eu.esdihumboldt.hale.common.schema.model.SchemaSpace; -import eu.esdihumboldt.util.cli.Command -import eu.esdihumboldt.util.cli.CommandContext -import groovy.transform.CompileStatic -import groovy.transform.TypeCheckingMode; +import eu.esdihumboldt.hale.common.schema.io.SchemaIO +import eu.esdihumboldt.hale.common.schema.model.SchemaSpace import to.wetransform.halecli.project.migrate.AbstractMigratorCommand -import to.wetransform.halecli.util.ProjectCLI;;;; +import to.wetransform.halecli.util.ProjectCLI +import groovy.cli.picocli.CliBuilder +import groovy.cli.picocli.OptionAccessor /** * Command that migrates a project to a different schema. diff --git a/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy index 92e431f..bb6d171 100644 --- a/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigrationCommand.groovy @@ -15,27 +15,13 @@ package to.wetransform.halecli.project.migrate -import java.util.List - -import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigration; -import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigrator -import eu.esdihumboldt.hale.common.align.migrate.MigrationOptions; +import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigration import eu.esdihumboldt.hale.common.align.migrate.impl.DefaultAlignmentMigrator -import eu.esdihumboldt.hale.common.align.migrate.impl.MigrationOptionsImpl -import eu.esdihumboldt.hale.common.align.migrate.util.EffectiveMapping; -import eu.esdihumboldt.hale.common.align.model.Alignment -import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration; -import eu.esdihumboldt.hale.common.core.io.project.model.Project; -import eu.esdihumboldt.hale.common.core.service.ServiceProvider; -import eu.esdihumboldt.hale.common.headless.impl.ProjectTransformationEnvironment -import eu.esdihumboldt.hale.common.instance.io.InstanceIO; -import eu.esdihumboldt.hale.common.schema.io.SchemaIO; -import eu.esdihumboldt.hale.common.schema.model.SchemaSpace; -import eu.esdihumboldt.util.cli.Command -import eu.esdihumboldt.util.cli.CommandContext -import groovy.transform.CompileStatic -import to.wetransform.halecli.util.ProjectCLI;;;; - +import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration +import eu.esdihumboldt.hale.common.core.service.ServiceProvider +import eu.esdihumboldt.hale.common.schema.model.SchemaSpace +import groovy.cli.picocli.CliBuilder +import groovy.cli.picocli.OptionAccessor /** * Base class for commands migrating a project to a different schema. * diff --git a/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigratorCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigratorCommand.groovy index 9c637ec..79aeeee 100644 --- a/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigratorCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/migrate/AbstractMigratorCommand.groovy @@ -15,28 +15,26 @@ package to.wetransform.halecli.project.migrate -import java.util.List - -import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigration; +import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigration import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigrator -import eu.esdihumboldt.hale.common.align.migrate.MigrationOptions; -import eu.esdihumboldt.hale.common.align.migrate.impl.DefaultAlignmentMigrator +import eu.esdihumboldt.hale.common.align.migrate.MigrationOptions import eu.esdihumboldt.hale.common.align.migrate.impl.MigrationOptionsImpl -import eu.esdihumboldt.hale.common.align.migrate.util.EffectiveMapping; +import eu.esdihumboldt.hale.common.align.migrate.util.EffectiveMapping import eu.esdihumboldt.hale.common.align.model.Alignment -import eu.esdihumboldt.hale.common.cli.HaleCLIUtil; -import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration; +import eu.esdihumboldt.hale.common.cli.HaleCLIUtil +import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration import eu.esdihumboldt.hale.common.core.io.project.model.Project -import eu.esdihumboldt.hale.common.core.report.SimpleLog; -import eu.esdihumboldt.hale.common.core.service.ServiceProvider; +import eu.esdihumboldt.hale.common.core.report.SimpleLog +import eu.esdihumboldt.hale.common.core.service.ServiceProvider import eu.esdihumboldt.hale.common.headless.impl.ProjectTransformationEnvironment -import eu.esdihumboldt.hale.common.instance.io.InstanceIO; -import eu.esdihumboldt.hale.common.schema.io.SchemaIO; -import eu.esdihumboldt.hale.common.schema.model.SchemaSpace; +import eu.esdihumboldt.hale.common.instance.io.InstanceIO +import eu.esdihumboldt.hale.common.schema.io.SchemaIO +import eu.esdihumboldt.hale.common.schema.model.SchemaSpace import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext -import groovy.transform.CompileStatic -import to.wetransform.halecli.util.ProjectCLI;;;; +import groovy.cli.picocli.CliBuilder +import groovy.cli.picocli.OptionAccessor +import to.wetransform.halecli.util.ProjectCLI /** * Base class for commands migrating a project to a different schema. diff --git a/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy index 7b6bbe1..fbe31db 100644 --- a/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/migrate/MigrateMatchingCommand.groovy @@ -15,29 +15,14 @@ package to.wetransform.halecli.project.migrate -import java.util.List - -import eu.esdihumboldt.hale.common.align.merge.impl.MatchingMigration; -import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigration; -import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigrator -import eu.esdihumboldt.hale.common.align.migrate.MigrationOptions; -import eu.esdihumboldt.hale.common.align.migrate.impl.DefaultAlignmentMigrator -import eu.esdihumboldt.hale.common.align.migrate.impl.MigrationOptionsImpl -import eu.esdihumboldt.hale.common.align.migrate.util.EffectiveMapping; -import eu.esdihumboldt.hale.common.align.model.Alignment -import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration; -import eu.esdihumboldt.hale.common.core.io.project.model.Project; -import eu.esdihumboldt.hale.common.core.service.ServiceProvider; +import eu.esdihumboldt.hale.common.align.merge.impl.MatchingMigration +import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration import eu.esdihumboldt.hale.common.headless.impl.ProjectTransformationEnvironment -import eu.esdihumboldt.hale.common.instance.io.InstanceIO; -import eu.esdihumboldt.hale.common.schema.io.SchemaIO; -import eu.esdihumboldt.hale.common.schema.model.SchemaSpace; -import eu.esdihumboldt.util.cli.Command -import eu.esdihumboldt.util.cli.CommandContext -import groovy.transform.CompileStatic -import groovy.transform.TypeCheckingMode; -import to.wetransform.halecli.util.ProjectCLI;;;; - +import eu.esdihumboldt.hale.common.schema.io.SchemaIO +import eu.esdihumboldt.hale.common.schema.model.SchemaSpace +import groovy.cli.picocli.CliBuilder +import to.wetransform.halecli.util.ProjectCLI +import groovy.cli.picocli.OptionAccessor /** * Command that migrates a project to a different schema. * diff --git a/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy index 378e00a..ea46528 100644 --- a/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/migrate/ReplaceSourceCommand.groovy @@ -15,31 +15,15 @@ package to.wetransform.halecli.project.migrate -import java.util.List - -import eu.esdihumboldt.hale.common.align.merge.impl.DefaultSchemaMigration; -import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigration; -import eu.esdihumboldt.hale.common.align.migrate.AlignmentMigrator -import eu.esdihumboldt.hale.common.align.migrate.MigrationOptions; -import eu.esdihumboldt.hale.common.align.migrate.impl.DefaultAlignmentMigrator -import eu.esdihumboldt.hale.common.align.migrate.impl.MigrationOptionsImpl -import eu.esdihumboldt.hale.common.align.migrate.util.EffectiveMapping; -import eu.esdihumboldt.hale.common.align.model.Alignment -import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration; -import eu.esdihumboldt.hale.common.core.io.project.model.Project; -import eu.esdihumboldt.hale.common.core.service.ServiceProvider; -import eu.esdihumboldt.hale.common.headless.impl.ProjectTransformationEnvironment -import eu.esdihumboldt.hale.common.instance.io.InstanceIO; -import eu.esdihumboldt.hale.common.schema.io.SchemaIO -import eu.esdihumboldt.hale.common.schema.model.Schema; +import eu.esdihumboldt.hale.common.align.merge.impl.DefaultSchemaMigration +import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration +import eu.esdihumboldt.hale.common.schema.model.Schema import eu.esdihumboldt.hale.common.schema.model.SchemaSpace -import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace; -import eu.esdihumboldt.util.cli.Command -import eu.esdihumboldt.util.cli.CommandContext +import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace +import groovy.cli.picocli.CliBuilder import groovy.transform.CompileStatic -import to.wetransform.halecli.util.ProjectCLI -import to.wetransform.halecli.util.SchemaCLI;;;;; - +import to.wetransform.halecli.util.SchemaCLI +import groovy.cli.picocli.OptionAccessor /** * Command that migrates a project to a different schema. * diff --git a/src/main/groovy/to/wetransform/halecli/schema/RewriteCommand.groovy b/src/main/groovy/to/wetransform/halecli/schema/RewriteCommand.groovy index 4b8abd2..eae6151 100644 --- a/src/main/groovy/to/wetransform/halecli/schema/RewriteCommand.groovy +++ b/src/main/groovy/to/wetransform/halecli/schema/RewriteCommand.groovy @@ -15,14 +15,13 @@ package to.wetransform.halecli.schema -import static eu.esdihumboldt.hale.app.transform.ExecUtil.fail -import static to.wetransform.halecli.util.HaleIOHelper.* -import to.wetransform.halecli.util.SchemaCLI -import eu.esdihumboldt.hale.common.cli.HaleCLIUtil; +import eu.esdihumboldt.hale.common.cli.HaleCLIUtil import eu.esdihumboldt.hale.common.schema.model.Schema import eu.esdihumboldt.util.cli.Command import eu.esdihumboldt.util.cli.CommandContext - +import groovy.cli.picocli.CliBuilder +import to.wetransform.halecli.util.SchemaCLI +import groovy.cli.picocli.OptionAccessor /** * Reads a schema and writes it. * diff --git a/src/main/groovy/to/wetransform/halecli/util/HaleConnectCLI.groovy b/src/main/groovy/to/wetransform/halecli/util/HaleConnectCLI.groovy index efed521..bf322b2 100644 --- a/src/main/groovy/to/wetransform/halecli/util/HaleConnectCLI.groovy +++ b/src/main/groovy/to/wetransform/halecli/util/HaleConnectCLI.groovy @@ -15,13 +15,13 @@ package to.wetransform.halecli.util -import static eu.esdihumboldt.hale.app.transform.ExecUtil.fail -import eu.esdihumboldt.hale.common.cli.HaleCLIUtil import eu.esdihumboldt.hale.common.core.HalePlatform import eu.esdihumboldt.hale.common.core.service.ServiceProvider import eu.esdihumboldt.hale.io.haleconnect.HaleConnectService -import eu.esdihumboldt.util.cli.CLIUtil -import groovy.transform.CompileStatic +import groovy.cli.picocli.CliBuilder +import groovy.cli.picocli.OptionAccessor + +import static eu.esdihumboldt.hale.app.transform.ExecUtil.fail /** * Common utility functions for configuring a hale connect connection. diff --git a/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy b/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy index 5d559f9..984478d 100644 --- a/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy +++ b/src/main/groovy/to/wetransform/halecli/util/InstanceCLI.groovy @@ -15,42 +15,30 @@ package to.wetransform.halecli.util -import static eu.esdihumboldt.hale.app.transform.ExecUtil.fail; -import static to.wetransform.halecli.util.HaleIOHelper.* - -import java.io.InputStream -import java.io.OutputStream; -import java.net.URI; -import java.util.Map - -import org.eclipse.core.runtime.jobs.Job; - import com.google.common.io.Files - import eu.esdihumboldt.hale.app.transform.ConsoleProgressMonitor -import eu.esdihumboldt.hale.common.cli.HaleCLIUtil; -import eu.esdihumboldt.hale.common.core.io.HaleIO +import eu.esdihumboldt.hale.common.cli.HaleCLIUtil import eu.esdihumboldt.hale.common.core.io.impl.LogProgressIndicator -import eu.esdihumboldt.hale.common.core.io.report.IOReport; -import eu.esdihumboldt.hale.common.core.io.supplier.DefaultInputSupplier; -import eu.esdihumboldt.hale.common.core.io.supplier.LocatableInputSupplier -import eu.esdihumboldt.hale.common.core.io.supplier.LocatableOutputSupplier -import eu.esdihumboldt.hale.common.core.report.ReportHandler; -import eu.esdihumboldt.hale.common.core.service.ServiceProvider; +import eu.esdihumboldt.hale.common.core.io.report.IOReport +import eu.esdihumboldt.hale.common.core.report.ReportHandler +import eu.esdihumboldt.hale.common.core.service.ServiceProvider import eu.esdihumboldt.hale.common.headless.transform.filter.InstanceFilterDefinition import eu.esdihumboldt.hale.common.instance.io.InstanceReader -import eu.esdihumboldt.hale.common.instance.io.InstanceWriter; +import eu.esdihumboldt.hale.common.instance.io.InstanceWriter import eu.esdihumboldt.hale.common.instance.model.InstanceCollection import eu.esdihumboldt.hale.common.instance.orient.storage.LocalOrientDB -import eu.esdihumboldt.hale.common.instance.orient.storage.StoreInstancesJob; -import eu.esdihumboldt.hale.common.schema.io.SchemaReader; -import eu.esdihumboldt.hale.common.schema.model.Schema +import eu.esdihumboldt.hale.common.instance.orient.storage.StoreInstancesJob import eu.esdihumboldt.hale.common.schema.model.SchemaSpace import eu.esdihumboldt.hale.common.schema.model.TypeIndex -import eu.esdihumboldt.util.Pair; +import eu.esdihumboldt.util.Pair import eu.esdihumboldt.util.cli.CLIUtil -import groovy.transform.CompileStatic +import groovy.cli.picocli.CliBuilder import groovy.cli.picocli.OptionAccessor +import groovy.transform.CompileStatic +import org.eclipse.core.runtime.jobs.Job + +import static to.wetransform.halecli.util.HaleIOHelper.prepareReader +import static to.wetransform.halecli.util.HaleIOHelper.prepareWriter /** * Common utility functions for setting up a CliBuilder for loading/saving instances. diff --git a/src/main/groovy/to/wetransform/halecli/util/ProjectCLI.groovy b/src/main/groovy/to/wetransform/halecli/util/ProjectCLI.groovy index 1b98c15..978bc94 100644 --- a/src/main/groovy/to/wetransform/halecli/util/ProjectCLI.groovy +++ b/src/main/groovy/to/wetransform/halecli/util/ProjectCLI.groovy @@ -15,8 +15,6 @@ package to.wetransform.halecli.util -import static eu.esdihumboldt.hale.app.transform.ExecUtil.fail -import to.wetransform.halecli.project.ProjectHelper import eu.esdihumboldt.hale.common.align.model.Alignment import eu.esdihumboldt.hale.common.cli.HaleCLIUtil import eu.esdihumboldt.hale.common.core.io.HaleIO @@ -25,7 +23,6 @@ import eu.esdihumboldt.hale.common.core.io.project.ProjectWriter import eu.esdihumboldt.hale.common.core.io.project.model.Project import eu.esdihumboldt.hale.common.core.io.supplier.DefaultInputSupplier import eu.esdihumboldt.hale.common.core.io.supplier.FileIOSupplier -import eu.esdihumboldt.hale.common.core.io.supplier.LocatableOutputSupplier; import eu.esdihumboldt.hale.common.core.io.supplier.NoStreamOutputSupplier import eu.esdihumboldt.hale.common.core.report.ReportHandler import eu.esdihumboldt.hale.common.headless.impl.ProjectTransformationEnvironment @@ -33,7 +30,12 @@ import eu.esdihumboldt.hale.common.schema.model.SchemaSpace import eu.esdihumboldt.hale.io.haleconnect.HaleConnectUrnBuilder import eu.esdihumboldt.hale.io.haleconnect.project.HaleConnectProjectWriter import eu.esdihumboldt.util.cli.CLIUtil +import groovy.cli.picocli.CliBuilder +import groovy.cli.picocli.OptionAccessor import groovy.transform.CompileStatic +import to.wetransform.halecli.project.ProjectHelper + +import static eu.esdihumboldt.hale.app.transform.ExecUtil.fail /** * Common utility functions for setting up a CliBuilder for loading and saving a project. diff --git a/src/main/groovy/to/wetransform/halecli/util/SchemaCLI.groovy b/src/main/groovy/to/wetransform/halecli/util/SchemaCLI.groovy index 08d69d7..3542545 100644 --- a/src/main/groovy/to/wetransform/halecli/util/SchemaCLI.groovy +++ b/src/main/groovy/to/wetransform/halecli/util/SchemaCLI.groovy @@ -15,34 +15,24 @@ package to.wetransform.halecli.util -import static eu.esdihumboldt.hale.app.transform.ExecUtil.fail; -import static to.wetransform.halecli.util.HaleIOHelper.* - -import java.io.InputStream -import java.net.URI; -import java.util.Map - -import eu.esdihumboldt.hale.common.cli.HaleCLIUtil; -import eu.esdihumboldt.hale.common.core.io.HaleIO -import eu.esdihumboldt.hale.common.core.io.Value -import eu.esdihumboldt.hale.common.core.io.impl.LogProgressIndicator; -import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration; -import eu.esdihumboldt.hale.common.core.io.report.IOReport; -import eu.esdihumboldt.hale.common.core.io.supplier.DefaultInputSupplier; -import eu.esdihumboldt.hale.common.core.io.supplier.LocatableInputSupplier; +import eu.esdihumboldt.hale.common.cli.HaleCLIUtil +import eu.esdihumboldt.hale.common.core.io.impl.LogProgressIndicator +import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration +import eu.esdihumboldt.hale.common.core.io.report.IOReport import eu.esdihumboldt.hale.common.core.report.ReportHandler -import eu.esdihumboldt.hale.common.instance.io.InstanceReader -import eu.esdihumboldt.hale.common.instance.io.InstanceWriter; -import eu.esdihumboldt.hale.common.instance.model.InstanceCollection; -import eu.esdihumboldt.hale.common.schema.io.SchemaIO; +import eu.esdihumboldt.hale.common.schema.io.SchemaIO import eu.esdihumboldt.hale.common.schema.io.SchemaReader -import eu.esdihumboldt.hale.common.schema.io.SchemaWriter; +import eu.esdihumboldt.hale.common.schema.io.SchemaWriter import eu.esdihumboldt.hale.common.schema.model.Schema -import eu.esdihumboldt.hale.common.schema.model.SchemaSpace; +import eu.esdihumboldt.hale.common.schema.model.SchemaSpace import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace -import eu.esdihumboldt.util.Pair; +import eu.esdihumboldt.util.Pair import eu.esdihumboldt.util.cli.CLIUtil +import groovy.cli.picocli.CliBuilder import groovy.transform.CompileStatic +import groovy.cli.picocli.OptionAccessor +import static to.wetransform.halecli.util.HaleIOHelper.prepareReader +import static to.wetransform.halecli.util.HaleIOHelper.prepareWriter /** * Common utility functions for setting up a CliBuilder for loading a schema. diff --git a/src/test/groovy/to/wetransform/halecli/data/RewriteCommandTest.groovy b/src/test/groovy/to/wetransform/halecli/data/RewriteCommandTest.groovy index 59e026d..4494225 100644 --- a/src/test/groovy/to/wetransform/halecli/data/RewriteCommandTest.groovy +++ b/src/test/groovy/to/wetransform/halecli/data/RewriteCommandTest.groovy @@ -15,17 +15,16 @@ package to.wetransform.halecli.data -import static org.junit.Assert.* - +import eu.esdihumboldt.util.cli.Runner import org.junit.BeforeClass import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.contrib.java.lang.system.SystemOutRule - import to.wetransform.halecli.internal.Init -import eu.esdihumboldt.hale.common.core.HalePlatform -import eu.esdihumboldt.util.cli.Runner + +import static org.junit.Assert.assertEquals +import static org.junit.Assert.assertTrue /** * Tests for rewrite command. From 632348c13c864bf2c3d3f7f7bdae166739fb52c6 Mon Sep 17 00:00:00 2001 From: kapil-agnihotri Date: Mon, 8 May 2023 12:12:42 +0200 Subject: [PATCH 09/24] build: update to exclude distZip ands distTar artifacts for current gradle version ING-3616 --- build.gradle | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index c3a4139..ce1750f 100644 --- a/build.gradle +++ b/build.gradle @@ -324,12 +324,11 @@ publishing { } // exclude distZip ands distTar artifacts -/*FIXME update for current Gradle version configurations.archives.with { - artifacts.remove artifacts.find { it.archiveTask.is distZip } - artifacts.remove artifacts.find { it.archiveTask.is distTar } + artifacts.remove artifacts.find { it.file == 'zip' } + artifacts.remove artifacts.find { it.file == 'tar' } } -*/ + // Workaround for gradle application plugin 'the input line is too long' error on Windows // see https://gist.github.com/jlmelville/2bfe9277e9e2c0ff79b6 From bbd87504e92fd81445c59dce28b33bacd018c738 Mon Sep 17 00:00:00 2001 From: kapil-agnihotri Date: Mon, 3 Jul 2023 16:33:29 +0200 Subject: [PATCH 10/24] build: migrate to java 17 ING-3775 --- README.md | 8 +++++++- build.gradle | 22 +++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 9473662..24d245e 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Build docker image: Run --- -You can run the application using Gradle. However, there is no possibility to easily provide arguments. +You can run the application using Gradle. ``` ./gradlew run @@ -45,6 +45,12 @@ Alternatively, you can run the start script of the built application. hale --version ``` +You can provide arguments to run as string in `""` following the below syntax. +For example pass argument `help` to run command as below +``` +./gradlew run --args="help" +``` + If using `./gradlew installDist`, the start script can be found in `./build/install/hale/bin/`. JVM parameters can be provided to the start script with the `HALE_OPTS` environment variable. diff --git a/build.gradle b/build.gradle index ce1750f..7e4b155 100644 --- a/build.gradle +++ b/build.gradle @@ -19,8 +19,8 @@ plugins { apply plugin: 'org.standardout.eclipseconfig' -sourceCompatibility = '1.8' -targetCompatibility = '1.8' +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 group = 'to.wetransform' @@ -38,11 +38,13 @@ version = '5.1.0-SNAPSHOT' repositories { // mavenLocal() //XXX for testing + // merge both snapshot and release repositories to virtual repository named local + // because gradle was reporting error if it encountered dependencies from snapshots + // but libs-release-local was placed before snapshots here in the hierarchy and also + // vice-versa case when dependencies were encountered from release but snapshots + // was placed before release maven { // wetransform release repository (HALE releases and Eclipse dependencies) - url 'https://artifactory.wetransform.to/artifactory/libs-release-local' - } - maven { // wetransform snapshot repository (HALE snapshots) - url 'https://artifactory.wetransform.to/artifactory/libs-snapshot-local' + url 'https://artifactory.wetransform.to/artifactory/local' } // this needs to be defined before jcenter/MavenCentral for retrieving JAI @@ -50,10 +52,6 @@ repositories { url 'https://repo.osgeo.org/repository/release/' } - maven { // HALE artifactory (dependencies for HALE) - url 'https://artifactory.wetransform.to/artifactory/ext-release-local' - } - mavenCentral() } @@ -183,7 +181,9 @@ applicationDefaultJvmArgs = [ '-Dcache.level1.enabled=false', '-Dcache.level1.size=0', '-Dcache.level2.enabled=false', - '-Dcache.level2.size=0' + '-Dcache.level2.size=0', + '--add-exports=java.base/sun.nio.ch=ALL-UNNAMED', + '--add-exports=java.base/jdk.internal.ref=ALL-UNNAMED' ] /* From 1acb856117fb7a1ff3d0b33617194cb12839d608 Mon Sep 17 00:00:00 2001 From: kapil-agnihotri Date: Fri, 7 Jul 2023 09:50:21 +0200 Subject: [PATCH 11/24] build: fix for uploadArchives task uploadArchive task was removed during migration it is now added back. ING-3775 --- build.gradle | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7e4b155..8b00864 100644 --- a/build.gradle +++ b/build.gradle @@ -233,7 +233,7 @@ distributions { docker { javaApplication { - baseImage = 'openjdk:8-jre-slim' + baseImage = 'eclipse-temurin:17-alpine' maintainer = 'Simon Templer "simon@wetransform.to"' tag = "wetransform/${project.name}:${project.version}" } @@ -340,6 +340,10 @@ tasks.withType(CreateStartScripts).each { task -> } } +task uploadArchives { + dependsOn 'publish' +} + /* * Gradle wrapper */ From d2942d38b3b6e5a3087de72afd65a3432bd51cf2 Mon Sep 17 00:00:00 2001 From: kapil-agnihotri Date: Wed, 12 Jul 2023 11:31:02 +0200 Subject: [PATCH 12/24] build: update Gradle Docker plugin to 9.3.1 ING-3775 --- build.gradle | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/build.gradle b/build.gradle index 8b00864..21b6ffd 100644 --- a/build.gradle +++ b/build.gradle @@ -12,13 +12,14 @@ plugins { id 'application' id 'maven-publish' //id 'osgi' // discontinued - do we need it? - id 'com.bmuschko.docker-java-application' version '3.6.2' + id 'com.bmuschko.docker-java-application' version '9.3.1' id "nebula.ospackage-application" version "9.1.1" id 'org.ajoberstar.grgit' version '1.5.0' } apply plugin: 'org.standardout.eclipseconfig' +// update to java 17 sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 @@ -233,9 +234,10 @@ distributions { docker { javaApplication { - baseImage = 'eclipse-temurin:17-alpine' + // https://github.com/bmuschko/gradle-docker-plugin/blob/e3bceb58c54a5eab33c78a078c0dbd21305874d2/build.gradle.kts#L43 + baseImage = 'openjdk:8-jre-slim' maintainer = 'Simon Templer "simon@wetransform.to"' - tag = "wetransform/${project.name}:${project.version}" + images = ["wetransform/${project.name}:${project.version}", "wetransform/${project.name}:latest"] } url = project.hasProperty('dockerHost') ? dockerHost : 'http://localdocker:2375' @@ -248,31 +250,14 @@ docker { } } -dockerPushImage { - // workaround for wrong image name used when pushing to docker hub - imageName = project.tasks.dockerBuildImage.getTag().split(':')[0] - tag = project.tasks.dockerBuildImage.getTag().split(':')[1] -} - -dockerDistTar { +dockerCreateDockerfile { def buildTime = java.time.ZonedDateTime.now().format(java.time.format.DateTimeFormatter.ISO_INSTANT); label('git.sha': grgit.head().id, 'git.branch': grgit.branch.current.name, 'build.version': version, 'build.time': buildTime) -} -// "latest" tag - -task dockerTagLatest(type: com.bmuschko.gradle.docker.tasks.image.DockerTagImage, - dependsOn: dockerBuildImage) { - imageId = "wetransform/${project.name}:${project.version}" - repository = "wetransform/${project.name}" - tag = 'latest' } -task dockerPushLatest(type: com.bmuschko.gradle.docker.tasks.image.DockerPushImage, - dependsOn: dockerTagLatest) { - imageName = "wetransform/${project.name}" - tag = 'latest' -} +task dockerTagLatest(dependsOn: dockerBuildImage) {} +task dockerPushLatest(dependsOn: dockerPushImage) {} /* * Packaging and publishing From 7d8526d7254738e1dc51135107f493ad658e4cea Mon Sep 17 00:00:00 2001 From: kapil-agnihotri Date: Wed, 12 Jul 2023 20:00:54 +0200 Subject: [PATCH 13/24] build: update baseImage to java 17 for Gradle docker plugin ING-3775 --- build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 21b6ffd..7e8c002 100644 --- a/build.gradle +++ b/build.gradle @@ -234,8 +234,9 @@ distributions { docker { javaApplication { - // https://github.com/bmuschko/gradle-docker-plugin/blob/e3bceb58c54a5eab33c78a078c0dbd21305874d2/build.gradle.kts#L43 - baseImage = 'openjdk:8-jre-slim' + // https://bmuschko.github.io/gradle-docker-plugin/current/user-guide/#extension_2 + // update base image to openjdk 17 jdk slim. other jdk like termurin, etc generates error + baseImage = 'eclipse-temurin:17-jre-alpine' maintainer = 'Simon Templer "simon@wetransform.to"' images = ["wetransform/${project.name}:${project.version}", "wetransform/${project.name}:latest"] } From f9a3bb21f5c333a676de54661969a9feebaa0570 Mon Sep 17 00:00:00 2001 From: kapil-agnihotri Date: Mon, 17 Jul 2023 16:02:32 +0200 Subject: [PATCH 14/24] fixup! build: update baseImage to java 17 for Gradle docker plugin Remove unused comment. ING-3775 --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7e8c002..d8beae4 100644 --- a/build.gradle +++ b/build.gradle @@ -235,7 +235,6 @@ distributions { docker { javaApplication { // https://bmuschko.github.io/gradle-docker-plugin/current/user-guide/#extension_2 - // update base image to openjdk 17 jdk slim. other jdk like termurin, etc generates error baseImage = 'eclipse-temurin:17-jre-alpine' maintainer = 'Simon Templer "simon@wetransform.to"' images = ["wetransform/${project.name}:${project.version}", "wetransform/${project.name}:latest"] From e0d5dc9264b6d44fbe16b04eb711c3126ae06a26 Mon Sep 17 00:00:00 2001 From: kapil-agnihotri Date: Wed, 2 Aug 2023 18:06:09 +0200 Subject: [PATCH 15/24] fixup! build: update baseImage to java 17 for Gradle docker plugin switching to jre-jammy as the use pf Alpine as the OS of the hale-cli image breaks derived images that expect Ubuntu ING-3775 --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d8beae4..47de119 100644 --- a/build.gradle +++ b/build.gradle @@ -235,7 +235,8 @@ distributions { docker { javaApplication { // https://bmuschko.github.io/gradle-docker-plugin/current/user-guide/#extension_2 - baseImage = 'eclipse-temurin:17-jre-alpine' + // switching to jre-jammy as the use pf Alpine as the OS of the hale-cli image breaks derived images that expect Ubuntu + baseImage = 'eclipse-temurin:17-jre-jammy' maintainer = 'Simon Templer "simon@wetransform.to"' images = ["wetransform/${project.name}:${project.version}", "wetransform/${project.name}:latest"] } From 75c76042a9dcef7f963b1f72bab37354a97f3985 Mon Sep 17 00:00:00 2001 From: kapil-agnihotri Date: Fri, 18 Aug 2023 10:41:30 +0200 Subject: [PATCH 16/24] build: apply jvmArgs to docker plugin --- build.gradle | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 47de119..d50396f 100644 --- a/build.gradle +++ b/build.gradle @@ -175,17 +175,15 @@ configurations.all { // ensure SNAPSHOTs are updated every time if needed resolutionStrategy.cacheChangingModulesFor 0, 'seconds' } - +def defaultJvmArgs = ['-Dcache.level1.enabled=false', + '-Dcache.level1.size=0', + '-Dcache.level2.enabled=false', + '-Dcache.level2.size=0', + '--add-exports=java.base/sun.nio.ch=ALL-UNNAMED', + '--add-exports=java.base/jdk.internal.ref=ALL-UNNAMED'] mainClassName = 'to.wetransform.halecli.CLI' applicationName = 'hale' -applicationDefaultJvmArgs = [ - '-Dcache.level1.enabled=false', - '-Dcache.level1.size=0', - '-Dcache.level2.enabled=false', - '-Dcache.level2.size=0', - '--add-exports=java.base/sun.nio.ch=ALL-UNNAMED', - '--add-exports=java.base/jdk.internal.ref=ALL-UNNAMED' -] +applicationDefaultJvmArgs = defaultJvmArgs /* * plugin.xml and OSGi manifest @@ -239,6 +237,9 @@ docker { baseImage = 'eclipse-temurin:17-jre-jammy' maintainer = 'Simon Templer "simon@wetransform.to"' images = ["wetransform/${project.name}:${project.version}", "wetransform/${project.name}:latest"] + // apply JAVA_OPTS to docker plugin as the default args configured in build does not apply to docker plugin + jvmArgs = defaultJvmArgs + } url = project.hasProperty('dockerHost') ? dockerHost : 'http://localdocker:2375' From 87ddd9097f45ec174140160cd35eb7c94eef512d Mon Sep 17 00:00:00 2001 From: Florian Esser Date: Wed, 1 Nov 2023 15:17:30 +0100 Subject: [PATCH 17/24] refactor(docker): restore dockerCopyDistResources task Restores the task `dockerCopyDistResources` that was present in earlier versions of gradle-docker-plugin. Since the upgrade of gradle-docker-plugin, the hale-cli dist version assembled by the application plugin was no longer added to the `/hale` directory of the created Docker image. This functionality is restored here. SVC-1398 --- build.gradle | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d50396f..513c51e 100644 --- a/build.gradle +++ b/build.gradle @@ -255,7 +255,7 @@ docker { dockerCreateDockerfile { def buildTime = java.time.ZonedDateTime.now().format(java.time.format.DateTimeFormatter.ISO_INSTANT); label('git.sha': grgit.head().id, 'git.branch': grgit.branch.current.name, 'build.version': version, 'build.time': buildTime) - + instruction 'COPY hale /hale/' } task dockerTagLatest(dependsOn: dockerBuildImage) {} @@ -282,6 +282,25 @@ dependencies { jansi 'org.fusesource.jansi:jansi:1.11' } +task dockerCopyDistResources(type: Copy) { + description "Copies the distribution resources to a temporary directory for image creation." + dependsOn installDist + from installDist.destinationDir.parentFile + into dockerCreateDockerfile.destFile.get().asFile.parentFile + exclude "**/lib/${jar.archiveFileName}" + into("app-lib") { + from jar + } +} + +tasks.dockerSyncBuildContext { + finalizedBy dockerCopyDistResources +} + +tasks.dockerBuildImage { + dependsOn dockerCopyDistResources +} + // package source into a jar file task packageSources(type: Jar) { from sourceSets.main.allSource From 60eeb214f435e6d5a2a42e8e161fe5f0a63109e0 Mon Sep 17 00:00:00 2001 From: Simon Templer Date: Mon, 20 Nov 2023 10:11:31 +0100 Subject: [PATCH 18/24] build(deps): update resource bundles Apart from the updated offline resources fixes issues with Zip file verification in newer Java version builds. ING-4068 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 513c51e..f8094d3 100644 --- a/build.gradle +++ b/build.gradle @@ -138,7 +138,7 @@ dependencies { // resource cache implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource', version: haleVersion) - def resourcesVersion = '2022.8.16' + def resourcesVersion = '2023.10.28' // OpenGIS schemas, INSPIRE schemas, W3C schemas, etc. implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.opengis.net', version: resourcesVersion) implementation(group: 'eu.esdihumboldt.hale', name: 'eu.esdihumboldt.util.resource.schemas.inspire', version: resourcesVersion) From 2185107d46479f90f0a4cb9fa2b7db263eb21bf9 Mon Sep 17 00:00:00 2001 From: Simon Templer Date: Mon, 20 Nov 2023 10:12:40 +0100 Subject: [PATCH 19/24] build: update Gradle wrapper --- gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 61574 bytes gradle/wrapper/gradle-wrapper.properties | 1 + gradlew | 12 ++++++++---- gradlew.bat | 1 + 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 36524 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%0DGK?7GHTj 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 VwlMN}`%er%aGR6olj~j${vQ;P=LY}) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 774fae8..5083229 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index a69d9cb..65dcd68 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # 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"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac diff --git a/gradlew.bat b/gradlew.bat index f127cfd..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% From a28a88c37dea9d2a76b5f2c77db5a25eb260d8c8 Mon Sep 17 00:00:00 2001 From: Simon Templer Date: Wed, 29 Nov 2023 16:36:34 +0100 Subject: [PATCH 20/24] fix: support custom functions for merge statistics --- .../halecli/project/merge/MergeMigrator.java | 2 +- .../halecli/project/merge/MergeStatistics.groovy | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/groovy/to/wetransform/halecli/project/merge/MergeMigrator.java b/src/main/groovy/to/wetransform/halecli/project/merge/MergeMigrator.java index f2b4b59..d8048fb 100644 --- a/src/main/groovy/to/wetransform/halecli/project/merge/MergeMigrator.java +++ b/src/main/groovy/to/wetransform/halecli/project/merge/MergeMigrator.java @@ -192,7 +192,7 @@ private void collectAlignmentStatistics(Alignment alignment, boolean migrationAl boolean noSource = cell.getSource() == null || cell.getSource().isEmpty(); - statistics.addFunctionUse(fun, migrationAlignment, noSource); + statistics.addFunctionUse(function, fun, migrationAlignment, noSource); }); } diff --git a/src/main/groovy/to/wetransform/halecli/project/merge/MergeStatistics.groovy b/src/main/groovy/to/wetransform/halecli/project/merge/MergeStatistics.groovy index b9c2203..cdeb90e 100644 --- a/src/main/groovy/to/wetransform/halecli/project/merge/MergeStatistics.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/merge/MergeStatistics.groovy @@ -152,21 +152,22 @@ class MergeStatistics { /** * Add the use of a specific function (in a cell). - * @param fun the function definition + * @param functionId the function ID + * @param fun the function definition if available * @param migrationFunction if the function usage is from the migration alignment */ - public void addFunctionUse(FunctionDefinition fun, boolean migrationFunction, boolean noSource) { + public void addFunctionUse(String functionId, FunctionDefinition fun, boolean migrationFunction, boolean noSource) { def map = migrationFunction ? migrationFunctions : functions - String name = fun.displayName + String name = fun?.displayName ?: functionId def entry = map[name] if (entry == null) { entry = [ count: 1, - id: fun.id, + id: functionId, noSource: 0, - augmenation: fun.augmentation + augmenation: fun?.augmentation ] map[name] = entry } From c54cbb5800bb5c39e101fcb9d721ef4b65af0892 Mon Sep 17 00:00:00 2001 From: Simon Templer Date: Thu, 30 Nov 2023 09:15:06 +0100 Subject: [PATCH 21/24] fix: fix error when not collecting statistics in alignment migrator --- .../to/wetransform/halecli/project/merge/MergeMigrator.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/groovy/to/wetransform/halecli/project/merge/MergeMigrator.java b/src/main/groovy/to/wetransform/halecli/project/merge/MergeMigrator.java index d8048fb..7bfa392 100644 --- a/src/main/groovy/to/wetransform/halecli/project/merge/MergeMigrator.java +++ b/src/main/groovy/to/wetransform/halecli/project/merge/MergeMigrator.java @@ -186,6 +186,10 @@ protected Iterable mergeCell(Cell originalCell, AlignmentMigration * @param migrationAlignment if the alignment is the migration alignment */ private void collectAlignmentStatistics(Alignment alignment, boolean migrationAlignment) { + if (statistics == null) { + return; + } + alignment.getCells().forEach(cell -> { String function = cell.getTransformationIdentifier(); FunctionDefinition fun = FunctionUtil.getFunction(function, serviceProvider); From 0b1a88fd3c163a228c80100c9ae19c89184d0e61 Mon Sep 17 00:00:00 2001 From: Simon Templer Date: Thu, 30 Nov 2023 09:15:48 +0100 Subject: [PATCH 22/24] fix: fixed typo in function statistics result structure --- .../to/wetransform/halecli/project/merge/MergeStatistics.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/groovy/to/wetransform/halecli/project/merge/MergeStatistics.groovy b/src/main/groovy/to/wetransform/halecli/project/merge/MergeStatistics.groovy index cdeb90e..65644b1 100644 --- a/src/main/groovy/to/wetransform/halecli/project/merge/MergeStatistics.groovy +++ b/src/main/groovy/to/wetransform/halecli/project/merge/MergeStatistics.groovy @@ -167,7 +167,7 @@ class MergeStatistics { count: 1, id: functionId, noSource: 0, - augmenation: fun?.augmentation + augmentation: fun?.augmentation ] map[name] = entry } From 43afb7b263ca9702ccdb67d6a83e7c145d96e724 Mon Sep 17 00:00:00 2001 From: Emanuela Epure <67077116+emanuelaepure10@users.noreply.github.com> Date: Mon, 26 Feb 2024 10:00:23 +0100 Subject: [PATCH 23/24] refactor: update changelog for 5.1.0 release Update changelog for the 5.1.0 release --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5c7e53..5f0f429 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,25 @@ # Change Log + All notable changes to this project will be documented in this file. See the [change log guidelines](http://keepachangelog.com/) for information on how to structure the file. +## [5.1.0] + +### Added + +- Upgrade hale dependencies to 5.1 and Java version to 17. +- Added support for specifying filters when loading data. + +### Changed + +- Always use the latest versions of hale offline resources like INSPIRE schemas. +- Include support for MS Access. + +### Fixed + +- Fixed a problem that lead to alignment migration failing if collection of statistics was not enabled. +- Fixed error when collecting merge statistics for an alignment with custom functions. + ## [4.0.0] ## Added @@ -111,6 +129,7 @@ Initial release based on hale studio 3.0.0. - Command to generate JSON representations of hale alignments (`hale project alignment export-json`) - Experimental command to filter to create a copy of a hale project with a filtered alignment (`hale project alignment filter`) +[5.1.0]: https://github.com/halestudio/hale-cli/compare/v4.0.0...v5.1.0 [4.0.0]: https://github.com/halestudio/hale-cli/compare/v3.5.0...v4.0.0 [3.5.0]: https://github.com/halestudio/hale-cli/compare/v3.4.0...v3.5.0 [3.4.0]: https://github.com/halestudio/hale-cli/compare/v3.3.2...v3.4.0 From cc8a4987c8ea38b69d20d0047a37d45dc29279f9 Mon Sep 17 00:00:00 2001 From: Emanuela Epure <67077116+emanuelaepure10@users.noreply.github.com> Date: Sun, 3 Mar 2024 22:25:10 +0100 Subject: [PATCH 24/24] refactor: update hale and hale-cli SNAPSHOT Update the haleVersion and hale-cli version to release version '5.1.0' ING-4011 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index f8094d3..e6eb7fe 100644 --- a/build.gradle +++ b/build.gradle @@ -26,11 +26,11 @@ targetCompatibility = JavaVersion.VERSION_17 group = 'to.wetransform' project.ext { - haleVersion = '5.1.0-SNAPSHOT' + haleVersion = '5.1.0' groovyVersion = '2.5.19' } -version = '5.1.0-SNAPSHOT' +version = '5.1.0' /* * Dependencies