diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/XPlanCliSubcommand.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/XPlanCliSubcommand.java new file mode 100644 index 0000000000000000000000000000000000000000..6ea05d6ebc861040f47607e6c2f5eaf5cc3fee60 --- /dev/null +++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/XPlanCliSubcommand.java @@ -0,0 +1,50 @@ +package de.latlon.xplanbox.cli; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.PropertySource; +import picocli.CommandLine; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Callable; + +/** + * Base class for all sub commands defining the option of all sub commands. + * + * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a> + */ +public abstract class XPlanCliSubcommand implements Callable<Integer> { + + @CommandLine.Option(names = { "-v", "--verbose" }, defaultValue = "false") + private boolean verbose; + + @CommandLine.Option(names = { "--config" }, description = "Path to the XPLANBOX_CONFIG directory.") + private File config; + + @CommandLine.Option(names = { "--workspace" }, defaultValue = "Path to the DEEGREE_WORKSPACE_ROOT directory.") + private File workspace; + + @Override + public Integer call() throws Exception { + AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); + register(applicationContext); + ConfigurableEnvironment env = applicationContext.getEnvironment(); + Map<String, Object> map = new HashMap(); + map.put("xplanbox.config", config != null ? config.getAbsolutePath() : null); + map.put("xplanbox.workspace", workspace != null ? workspace : null); + PropertySource<?> propertySource = new MapPropertySource("manager", map); + env.getPropertySources().addLast(propertySource); + applicationContext.setEnvironment(env); + applicationContext.refresh(); + return callSubcommand(applicationContext); + } + + protected abstract void register(AnnotationConfigApplicationContext applicationContext); + + protected abstract Integer callSubcommand(ApplicationContext applicationContext) throws Exception; + +} diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/DistrictUpdateSubcommand.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/DistrictUpdateSubcommand.java index 5718a7ddfea6b67d783c0603f2c24293520a4002..055ec5f1097706022a8240c1efeb683b185b4b28 100644 --- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/DistrictUpdateSubcommand.java +++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/DistrictUpdateSubcommand.java @@ -23,6 +23,7 @@ package de.latlon.xplanbox.cli.admin; import de.latlon.xplan.commons.XPlanType; import de.latlon.xplan.manager.database.XPlanDao; import de.latlon.xplan.manager.web.shared.XPlan; +import de.latlon.xplanbox.cli.XPlanCliSubcommand; import de.latlon.xplanbox.cli.admin.config.AdminContext; import org.deegree.feature.FeatureCollection; import org.slf4j.Logger; @@ -33,7 +34,6 @@ import org.springframework.stereotype.Component; import picocli.CommandLine; import java.util.List; -import java.util.concurrent.Callable; import static de.latlon.xplan.commons.util.FeatureCollectionUtils.retrieveDistrict; @@ -45,15 +45,18 @@ import static de.latlon.xplan.commons.util.FeatureCollectionUtils.retrieveDistri @Component @CommandLine.Command(name = "district-update", description = "Update column district of table xplanmgr.plans.", subcommands = { CommandLine.HelpCommand.class }) -public class DistrictUpdateSubcommand implements Callable<Integer> { +public class DistrictUpdateSubcommand extends XPlanCliSubcommand { private static final Logger LOG = LoggerFactory.getLogger(DistrictUpdateSubcommand.class); @Override - public Integer call() throws Exception { - ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AdminContext.class); - XPlanDao dao = applicationContext.getBean(XPlanDao.class); + protected void register(AnnotationConfigApplicationContext applicationContext) { + applicationContext.register(AdminContext.class); + } + @Override + protected Integer callSubcommand(ApplicationContext applicationContext) throws Exception { + XPlanDao dao = applicationContext.getBean(XPlanDao.class); List<XPlan> plans = dao.getXPlanList(); for (XPlan plan : plans) { LOG.info("Update district of plan with id {}", plan.getId()); diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/ReSynthesizerSubcommand.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/ReSynthesizerSubcommand.java index 700f3cd272a59ad82b1479470ef3186c78ed100f..6b3ce1b13add5238aaba4a6712dc38881006db7e 100644 --- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/ReSynthesizerSubcommand.java +++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/ReSynthesizerSubcommand.java @@ -30,6 +30,7 @@ import de.latlon.xplan.manager.database.XPlanManagerDao; import de.latlon.xplan.manager.synthesizer.FeatureTypeNameSynthesizer; import de.latlon.xplan.manager.synthesizer.XPlanSynthesizer; import de.latlon.xplan.manager.web.shared.XPlan; +import de.latlon.xplanbox.cli.XPlanCliSubcommand; import de.latlon.xplanbox.cli.admin.config.ReSynthesizerContext; import org.deegree.feature.Feature; import org.deegree.feature.FeatureCollection; @@ -46,7 +47,6 @@ import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.UUID; -import java.util.concurrent.Callable; import static de.latlon.xplan.manager.synthesizer.FeatureTypeNameSynthesizer.SYN_FEATURETYPE_PREFIX; @@ -59,7 +59,7 @@ import static de.latlon.xplan.manager.synthesizer.FeatureTypeNameSynthesizer.SYN @CommandLine.Command(name = "resynthesize", description = "Reads the XPlanGML data and updates the re-synthesized data in the xplansyn schema.", subcommands = { CommandLine.HelpCommand.class }) -public class ReSynthesizerSubcommand implements Callable<Integer> { +public class ReSynthesizerSubcommand extends XPlanCliSubcommand { private static final Logger LOG = LoggerFactory.getLogger(ReSynthesizerSubcommand.class); @@ -71,10 +71,14 @@ public class ReSynthesizerSubcommand implements Callable<Integer> { description = "The ID of a plan in the XPlanManager of the plan to re-synthesize. If missing all plans are re-synthesized.") private String[] ids; + @Override + protected void register(AnnotationConfigApplicationContext applicationContext) { + applicationContext.register(ReSynthesizerContext.class); + } + @Override @Transactional(rollbackOn = Exception.class) - public Integer call() throws Exception { - ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ReSynthesizerContext.class); + protected Integer callSubcommand(ApplicationContext applicationContext) throws Exception { XPlanManagerDao xPlanManagerDao = applicationContext.getBean(XPlanManagerDao.class); XPlanSynthesizer xPlanSynthesizer = applicationContext.getBean(XPlanSynthesizer.class); SortPropertyReader sortPropertyReader = applicationContext.getBean(SortPropertyReader.class); diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/SortdateUpdateSubcommand.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/SortdateUpdateSubcommand.java index 1394f5d2fe7603dc5fc95292e2999551238837e9..1738166bea8252db7dc9dc617a5478faeee87790 100644 --- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/SortdateUpdateSubcommand.java +++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/SortdateUpdateSubcommand.java @@ -26,6 +26,7 @@ import de.latlon.xplan.commons.feature.SortPropertyReader; import de.latlon.xplan.manager.database.XPlanDao; import de.latlon.xplan.manager.web.shared.XPlan; import de.latlon.xplan.manager.wmsconfig.raster.XPlanRasterManager; +import de.latlon.xplanbox.cli.XPlanCliSubcommand; import de.latlon.xplanbox.cli.admin.config.SortdateUpdateContext; import de.latlon.xplanbox.cli.admin.db.SortPropertyDbUpdater; import org.deegree.feature.FeatureCollection; @@ -41,7 +42,6 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.Callable; /** * Updates the sort property. @@ -51,10 +51,15 @@ import java.util.concurrent.Callable; @Component @CommandLine.Command(name = "sortdate-update", description = "Update sort date.", subcommands = { CommandLine.HelpCommand.class }) -public class SortdateUpdateSubcommand implements Callable<Integer> { +public class SortdateUpdateSubcommand extends XPlanCliSubcommand { private static final Logger LOG = LoggerFactory.getLogger(SortdateUpdateSubcommand.class); + @Override + protected void register(AnnotationConfigApplicationContext applicationContext) { + applicationContext.register(SortdateUpdateContext.class); + } + /** * Retrieves all plans from the manager store, parses the date from the plan with the * help of the {@link SortPropertyReader} and updates the sort property in the syn @@ -62,8 +67,7 @@ public class SortdateUpdateSubcommand implements Callable<Integer> { */ @Override @Transactional(rollbackOn = Exception.class) - public Integer call() throws Exception { - ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SortdateUpdateContext.class); + protected Integer callSubcommand(ApplicationContext applicationContext) throws Exception { XPlanDao xPlanDao = applicationContext.getBean(XPlanDao.class); SortPropertyReader sortPropertyReader = applicationContext.getBean(SortPropertyReader.class); SortPropertyDbUpdater sortPropertyDbUpdater = applicationContext.getBean(SortPropertyDbUpdater.class); diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/CommonContext.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/CommonContext.java index ad85a83406c4b711c26bc6dcdea66f3550fbd5ef..a332238496890d73f79989877635efe507e888a4 100644 --- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/CommonContext.java +++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/CommonContext.java @@ -101,8 +101,10 @@ public class CommonContext { } @Bean - public ManagerWorkspaceWrapper managerWorkspaceWrapper() throws WorkspaceException { - DeegreeWorkspace managerWorkspace = instantiateWorkspace(DEFAULT_XPLAN_MANAGER_WORKSPACE); + public ManagerWorkspaceWrapper managerWorkspaceWrapper( + @Value("${xplanbox.workspace:#{environment.DEEGREE_WORKSPACE_ROOT}}") File workspaceRoot) + throws WorkspaceException { + DeegreeWorkspace managerWorkspace = instantiateWorkspace(DEFAULT_XPLAN_MANAGER_WORKSPACE, workspaceRoot); return new ManagerWorkspaceWrapper(managerWorkspace); } diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/SortdateUpdateContext.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/SortdateUpdateContext.java index 3d966731967fe51ec5fc9ce4ce1b6d177977377b..c40f7bfe958f90769104e0edc50919ae4df74eb3 100644 --- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/SortdateUpdateContext.java +++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/admin/config/SortdateUpdateContext.java @@ -34,12 +34,15 @@ import de.latlon.xplan.manager.wmsconfig.raster.storage.s3.config.AmazonS3Raster import de.latlon.xplan.manager.workspace.DeegreeWorkspaceWrapper; import de.latlon.xplan.manager.workspace.WorkspaceException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import java.io.File; + import static de.latlon.xplan.manager.workspace.WorkspaceUtils.DEFAULT_XPLANSYN_WMS_WORKSPACE; /** @@ -67,8 +70,11 @@ public class SortdateUpdateContext { } @Bean - public WmsWorkspaceWrapper wmsWorkspaceWrapper() throws WorkspaceException { - DeegreeWorkspaceWrapper wmsWorkspace = new DeegreeWorkspaceWrapper(DEFAULT_XPLANSYN_WMS_WORKSPACE); + public WmsWorkspaceWrapper wmsWorkspaceWrapper( + @Value("${xplanbox.workspace:#{environment.DEEGREE_WORKSPACE_ROOT}}") File workspaceRoot) + throws WorkspaceException { + DeegreeWorkspaceWrapper wmsWorkspace = new DeegreeWorkspaceWrapper(DEFAULT_XPLANSYN_WMS_WORKSPACE, + workspaceRoot); return new WmsWorkspaceWrapper(wmsWorkspace.getWorkspaceInstance()); } diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/CreateMetadataSubcommand.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/CreateMetadataSubcommand.java index cddd85f1a0b22caa915e6f024308f6f1e9981d3e..99c411c653950e95d110441d9aa9caf5e16238b2 100644 --- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/CreateMetadataSubcommand.java +++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/CreateMetadataSubcommand.java @@ -1,6 +1,6 @@ package de.latlon.xplanbox.cli.manage; -import de.latlon.xplan.manager.XPlanManager; +import de.latlon.xplanbox.cli.XPlanCliSubcommand; import de.latlon.xplanbox.cli.manage.config.ManageContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,7 +18,7 @@ import java.util.List; @Component @CommandLine.Command(name = "create-metadata", description = "Create metadata", subcommands = { CommandLine.HelpCommand.class }) -public class CreateMetadataSubcommand extends ManagerSubcommand { +public class CreateMetadataSubcommand extends XPlanCliSubcommand { private static final Logger LOG = LoggerFactory.getLogger(CreateMetadataSubcommand.class); @@ -27,8 +27,12 @@ public class CreateMetadataSubcommand extends ManagerSubcommand { private Integer[] ids; @Override - public Integer callSubcommand(XPlanManager xPlanManager) { - ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ManageContext.class); + protected void register(AnnotationConfigApplicationContext applicationContext) { + applicationContext.register(ManageContext.class); + } + + @Override + protected Integer callSubcommand(ApplicationContext applicationContext) { ServiceMetadataRecordCreator serviceMetadataRecordCreator = applicationContext .getBean(ServiceMetadataRecordCreator.class); diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/ManagerSubcommand.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/ManagerSubcommand.java index a62390bbf2c0bcf16b659017f7ab7cad04fbd205..ada67b0ff11c671b8e2bb7ff6c7691929e0c96db 100644 --- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/ManagerSubcommand.java +++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/ManagerSubcommand.java @@ -1,31 +1,25 @@ package de.latlon.xplanbox.cli.manage; import de.latlon.xplan.manager.XPlanManager; -import de.latlon.xplan.manager.log.SystemLog; +import de.latlon.xplanbox.cli.XPlanCliSubcommand; import de.latlon.xplanbox.cli.manage.config.ManageContext; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import picocli.CommandLine; - -import java.util.concurrent.Callable; /** * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a> */ -public abstract class ManagerSubcommand implements Callable<Integer> { - - @CommandLine.Option(names = { "-v", "--verbose" }, defaultValue = "false") - private boolean verbose; +public abstract class ManagerSubcommand extends XPlanCliSubcommand { - @Override - public Integer call() { - if (verbose) - SystemLog.log(); - ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ManageContext.class); + public Integer callSubcommand(ApplicationContext applicationContext) { XPlanManager xPlanManager = applicationContext.getBean(XPlanManager.class); return callSubcommand(xPlanManager); } + public void register(AnnotationConfigApplicationContext applicationContext) { + applicationContext.register(ManageContext.class); + } + abstract Integer callSubcommand(XPlanManager xPlanManager); } diff --git a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/config/ManageContext.java b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/config/ManageContext.java index 3a3bce0d12c106a8616a283b82096b6b486ec926..cfa290c81cc5ed0eb6a06a0fbe8e5ca036db24d7 100644 --- a/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/config/ManageContext.java +++ b/xplan-cli/xplan-cli-tools/src/main/java/de/latlon/xplanbox/cli/manage/config/ManageContext.java @@ -197,14 +197,19 @@ public class ManageContext { } @Bean - public ManagerWorkspaceWrapper managerWorkspaceWrapper() throws WorkspaceException { - DeegreeWorkspace managerWorkspace = instantiateWorkspace(DEFAULT_XPLAN_MANAGER_WORKSPACE); + public ManagerWorkspaceWrapper managerWorkspaceWrapper( + @Value("${xplanbox.workspace:#{environment.DEEGREE_WORKSPACE_ROOT}}") File workspaceRoot) + throws WorkspaceException { + DeegreeWorkspace managerWorkspace = instantiateWorkspace(DEFAULT_XPLAN_MANAGER_WORKSPACE, workspaceRoot); return new ManagerWorkspaceWrapper(managerWorkspace); } @Bean - public WmsWorkspaceWrapper wmsWorkspaceWrapper() throws WorkspaceException { - DeegreeWorkspaceWrapper wmsWorkspace = new DeegreeWorkspaceWrapper(DEFAULT_XPLANSYN_WMS_WORKSPACE); + public WmsWorkspaceWrapper wmsWorkspaceWrapper( + @Value("${xplanbox.workspace:#{environment.DEEGREE_WORKSPACE_ROOT}}") File workspaceRoot) + throws WorkspaceException { + DeegreeWorkspaceWrapper wmsWorkspace = new DeegreeWorkspaceWrapper(DEFAULT_XPLANSYN_WMS_WORKSPACE, + workspaceRoot); return new WmsWorkspaceWrapper(wmsWorkspace.getWorkspaceInstance()); } diff --git a/xplan-cli/xplan-cli-tools/src/main/resources/application.properties b/xplan-cli/xplan-cli-tools/src/main/resources/application.properties index 46657edce6911fd7bcaa28537821cb7356eadb0f..8580350a3794ac74ebfe5a5480092ea4308a8b5c 100644 --- a/xplan-cli/xplan-cli-tools/src/main/resources/application.properties +++ b/xplan-cli/xplan-cli-tools/src/main/resources/application.properties @@ -18,6 +18,5 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # #L% ### -xplanbox.config= spring.main.allow-bean-definition-overriding=true spring.batch.job.enabled=false \ No newline at end of file diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/workspace/WorkspaceUtils.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/workspace/WorkspaceUtils.java index c0742a2e3ec4fbd9ca29253ad4f084a0a3899c2d..f9517adcb543358a36f9864f36d97581ef40dfba 100644 --- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/workspace/WorkspaceUtils.java +++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/workspace/WorkspaceUtils.java @@ -56,7 +56,8 @@ public class WorkspaceUtils { * @throws Exception - an exception occurred during instantiation or a workspace with * the given name does not exist */ - static DeegreeWorkspace instantiateWorkspace(String workspaceName, File workspaceDir) throws WorkspaceException { + public static DeegreeWorkspace instantiateWorkspace(String workspaceName, File workspaceDir) + throws WorkspaceException { if (workspaceDir != null && workspaceName != null) return instantiateWorkspaceByNameAndDir(workspaceDir, workspaceName); else if (workspaceDir != null)