From 5fe84b1d02ed5f9d1e79f0487b5b037df5682113 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Wed, 8 Jul 2015 07:42:53 +0200 Subject: [PATCH] [Major] Extended XmlExportModel XmlImportModel for Activities --- .../command/XmlExportModelCommand.java | 70 +++++++++++++++++-- .../command/XmlImportModelCommand.java | 30 ++++++++ .../command/plan/AbstractPlanCommand.java | 24 ++++--- .../command/plan/ShiftActionCommand.java | 6 +- .../service/XmlExportModelArgument.java | 12 ++++ .../service/XmlExportModelService.java | 5 ++ .../service/XmlImportModelArgument.java | 17 ++++- .../service/XmlImportModelService.java | 4 ++ 8 files changed, 148 insertions(+), 20 deletions(-) diff --git a/li.strolch.service/src/main/java/li/strolch/command/XmlExportModelCommand.java b/li.strolch.service/src/main/java/li/strolch/command/XmlExportModelCommand.java index ca67462ea..52969fd42 100644 --- a/li.strolch.service/src/main/java/li/strolch/command/XmlExportModelCommand.java +++ b/li.strolch.service/src/main/java/li/strolch/command/XmlExportModelCommand.java @@ -47,6 +47,7 @@ import li.strolch.model.Resource; import li.strolch.model.ResourceVisitor; import li.strolch.model.Tags; import li.strolch.model.activity.Activity; +import li.strolch.model.xml.ActivityToSaxWriterVisitor; import li.strolch.model.xml.OrderToSaxWriterVisitor; import li.strolch.model.xml.ResourceToSaxWriterVisitor; import li.strolch.persistence.api.StrolchTransaction; @@ -68,8 +69,10 @@ public class XmlExportModelCommand extends Command { private boolean overwrite; private boolean doOrders; private boolean doResources; + private boolean doActivities; private Set orderTypes; private Set resourceTypes; + private Set activityTypes; // output private ModelStatistics statistics; @@ -77,6 +80,7 @@ public class XmlExportModelCommand extends Command { private int elementsToWrite; private int nrOfResourcesToExport; private int nrOfOrdersToExport; + private int nrOfActivitiesToExport; private long nextLogTime; @@ -140,10 +144,22 @@ public class XmlExportModelCommand extends Command { } } - this.elementsToWrite = this.nrOfResourcesToExport + this.nrOfOrdersToExport; + if (this.doActivities) { + ActivityMap activityMap = tx().getActivityMap(); + Set activityTypesToExport = activityMap.getTypes(tx()); + if (!this.activityTypes.isEmpty()) + activityTypesToExport.retainAll(this.activityTypes); + + for (String type : activityTypesToExport) { + this.nrOfActivitiesToExport += activityMap.querySize(tx(), type); + } + } + + this.elementsToWrite = this.nrOfResourcesToExport + this.nrOfOrdersToExport + this.nrOfActivitiesToExport; logger.info("Exporting " + this.elementsToWrite + " Elements..."); logger.info("Exporting " + this.nrOfResourcesToExport + " Resources..."); logger.info("Exporting " + this.nrOfOrdersToExport + " Orders..."); + logger.info("Exporting " + this.nrOfActivitiesToExport + " Activities..."); try (FileOutputStream out = new FileOutputStream(this.modelFile)) { createdFiles.add(this.modelFile); @@ -152,11 +168,10 @@ public class XmlExportModelCommand extends Command { if (this.doResources) { ResourceMap resourceMap = tx().getResourceMap(); - Set resourceTypesToExport = resourceMap.getTypes(tx()); + Set resourceTypesToExport = new TreeSet<>(resourceMap.getTypes(tx())); if (!this.resourceTypes.isEmpty()) resourceTypesToExport.retainAll(this.resourceTypes); - resourceTypesToExport = new TreeSet<>(resourceTypesToExport); for (String type : resourceTypesToExport) { if (!this.multiFile) { @@ -183,11 +198,10 @@ public class XmlExportModelCommand extends Command { if (this.doOrders) { OrderMap orderMap = tx().getOrderMap(); - Set orderTypesToExport = orderMap.getTypes(tx()); + Set orderTypesToExport = new TreeSet<>(orderMap.getTypes(tx())); if (!this.orderTypes.isEmpty()) orderTypesToExport.retainAll(this.orderTypes); - orderTypesToExport = new TreeSet<>(orderTypesToExport); for (String type : orderTypesToExport) { if (!this.multiFile) { @@ -211,6 +225,36 @@ public class XmlExportModelCommand extends Command { } } + if (this.doActivities) { + ActivityMap activityMap = tx().getActivityMap(); + Set activityTypesToExport = new TreeSet<>(activityMap.getTypes(tx())); + if (!this.activityTypes.isEmpty()) + activityTypesToExport.retainAll(this.activityTypes); + + for (String type : activityTypesToExport) { + + if (!this.multiFile) { + writeActivitiesByType(writer, activityMap, type); + } else { + String typeXmlFile = exportName + UNDERLINE + Tags.ACTIVITY + UNDERLINE + type + + XML_FILE_SUFFIX; + writer.writeEmptyElement(Tags.INCLUDE_FILE); + writer.writeAttribute(Tags.FILE, typeXmlFile); + + File typeXmlFileF = new File(this.modelFile.getParentFile(), typeXmlFile); + DBC.INTERIM.assertNotExists("The type file should not exist with name.", typeXmlFileF); + logger.info("Writing " + activityMap.querySize(tx(), type) + " " + type + + " Activities to path: " + typeXmlFileF.getAbsolutePath() + "..."); + try (FileOutputStream typeOut = new FileOutputStream(typeXmlFileF)) { + createdFiles.add(typeXmlFileF); + XMLStreamWriter typeWriter = openXmlStreamWriter(typeOut); + writeActivitiesByType(typeWriter, activityMap, type); + typeWriter.writeEndDocument(); + } + } + } + } + // and now end writer.writeEndElement(); writer.writeEndDocument(); @@ -319,6 +363,14 @@ public class XmlExportModelCommand extends Command { this.doResources = doResources; } + /** + * @param doActivities + * the doActivities to set + */ + public void setDoActivities(boolean doActivities) { + this.doActivities = doActivities; + } + /** * @param orderTypes * the orderTypes to set @@ -335,6 +387,14 @@ public class XmlExportModelCommand extends Command { this.resourceTypes = resourceTypes; } + /** + * @param activityTypes + * the activityTypes to set + */ + public void setActivityTypes(Set activityTypes) { + this.activityTypes = activityTypes; + } + /** * @return the statistics */ diff --git a/li.strolch.service/src/main/java/li/strolch/command/XmlImportModelCommand.java b/li.strolch.service/src/main/java/li/strolch/command/XmlImportModelCommand.java index 8da39ca3a..ad2db34c3 100644 --- a/li.strolch.service/src/main/java/li/strolch/command/XmlImportModelCommand.java +++ b/li.strolch.service/src/main/java/li/strolch/command/XmlImportModelCommand.java @@ -35,10 +35,13 @@ public class XmlImportModelCommand extends Command { private File modelFile; private boolean addOrders; private boolean addResources; + private boolean addActivities; private boolean updateOrders; private boolean updateResources; + private boolean updateActivities; private Set orderTypes; private Set resourceTypes; + private Set activityTypes; // output private ModelStatistics statistics; @@ -64,10 +67,13 @@ public class XmlImportModelCommand extends Command { elementListener.setAddOrders(this.addOrders); elementListener.setAddResources(this.addResources); + elementListener.setAddActivities(this.addActivities); elementListener.setUpdateOrders(this.updateOrders); elementListener.setUpdateResources(this.updateResources); + elementListener.setUpdateActivities(this.updateActivities); elementListener.setOrderTypes(this.orderTypes); elementListener.setResourceTypes(this.resourceTypes); + elementListener.setActivityTypes(this.activityTypes); XmlModelSaxFileReader handler = new XmlModelSaxFileReader(elementListener, this.modelFile, this.allowInclude); handler.parseFile(); @@ -110,6 +116,14 @@ public class XmlImportModelCommand extends Command { this.addResources = addResources; } + /** + * @param addActivities + * the addActivities to set + */ + public void setAddActivities(boolean addActivities) { + this.addActivities = addActivities; + } + /** * @param updateOrders * the updateOrders to set @@ -126,6 +140,14 @@ public class XmlImportModelCommand extends Command { this.updateResources = updateResources; } + /** + * @param updateActivities + * the updateActivities to set + */ + public void setUpdateActivities(boolean updateActivities) { + this.updateActivities = updateActivities; + } + /** * @param orderTypes * the orderTypes to set @@ -142,6 +164,14 @@ public class XmlImportModelCommand extends Command { this.resourceTypes = resourceTypes; } + /** + * @param activityTypes + * the activityTypes to set + */ + public void setActivityTypes(Set activityTypes) { + this.activityTypes = activityTypes; + } + /** * @return the statistics */ diff --git a/li.strolch.service/src/main/java/li/strolch/command/plan/AbstractPlanCommand.java b/li.strolch.service/src/main/java/li/strolch/command/plan/AbstractPlanCommand.java index e3ca74e86..43eccf4d8 100644 --- a/li.strolch.service/src/main/java/li/strolch/command/plan/AbstractPlanCommand.java +++ b/li.strolch.service/src/main/java/li/strolch/command/plan/AbstractPlanCommand.java @@ -29,6 +29,7 @@ import li.strolch.model.activity.Action; import li.strolch.model.activity.Activity; import li.strolch.model.activity.IActivityElement; import li.strolch.model.timedstate.StrolchTimedState; +import li.strolch.model.timevalue.IValue; import li.strolch.model.timevalue.IValueChange; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.service.api.Command; @@ -47,16 +48,16 @@ public abstract class AbstractPlanCommand extends Command { } /** - * plan an {@link Action}.It iterates the {@link IValueChange} operators and - * registers the changes on the {@link StrolchTimedState} objects assigned - * to the {@link Resource} referenced by type and id. + * plan an {@link Action}.It iterates the {@link IValueChange} operators and registers the changes on the + * {@link StrolchTimedState} objects assigned to the {@link Resource} referenced by type and id. * * @param action */ @SuppressWarnings({ "unchecked", "rawtypes" }) protected void plan(final Action action) { - final Locator locator = Locator.newBuilder(Tags.RESOURCE, action.getResourceType(), action.getResourceId()).build(); + final Locator locator = Locator.newBuilder(Tags.RESOURCE, action.getResourceType(), action.getResourceId()) + .build(); final Resource resource = tx().findElement(locator); if (resource == null) @@ -65,7 +66,7 @@ public abstract class AbstractPlanCommand extends Command { tx().lock(resource); - final List> changes = action.getChanges(); + final List>> changes = action.getChanges(); for (final IValueChange change : changes) { final StrolchTimedState timedState = resource.getTimedState(change.getStateId()); timedState.applyChange(change); @@ -75,10 +76,12 @@ public abstract class AbstractPlanCommand extends Command { } /** - * plan an {@link Activity} by navigating to the {#link Action} and - * delegating the planning depending on the {@link IActivityElement} class. + * plan an {@link Activity} by navigating to the {#link Action} and delegating the planning depending on the + * {@link IActivityElement} class. */ protected void plan(final Activity activity) { + + // TODO Martin: Use a visitor pattern so we don't start with instanceof again... final Iterator> elementIterator = activity.elementIterator(); @@ -94,10 +97,11 @@ public abstract class AbstractPlanCommand extends Command { @SuppressWarnings({ "unchecked", "rawtypes" }) protected void unplan(final Action action) { - final Locator locator = Locator.newBuilder(Tags.RESOURCE, action.getResourceType(), action.getResourceId()).build(); + final Locator locator = Locator.newBuilder(Tags.RESOURCE, action.getResourceType(), action.getResourceId()) + .build(); final Resource resource = tx().findElement(locator); - final List> changes = action.getChanges(); + final List>> changes = action.getChanges(); for (final IValueChange change : changes) { final StrolchTimedState timedState = resource.getTimedState(change.getStateId()); timedState.applyChange(change.getInverse()); @@ -117,8 +121,6 @@ public abstract class AbstractPlanCommand extends Command { unplan((Activity) activityElement); else if (activityElement instanceof Action) unplan((Action) activityElement); - } } - } diff --git a/li.strolch.service/src/main/java/li/strolch/command/plan/ShiftActionCommand.java b/li.strolch.service/src/main/java/li/strolch/command/plan/ShiftActionCommand.java index e94d476d0..84b1db80f 100644 --- a/li.strolch.service/src/main/java/li/strolch/command/plan/ShiftActionCommand.java +++ b/li.strolch.service/src/main/java/li/strolch/command/plan/ShiftActionCommand.java @@ -19,6 +19,7 @@ import java.util.List; import li.strolch.agent.api.ComponentContainer; import li.strolch.model.State; +import li.strolch.model.timevalue.IValue; import li.strolch.model.timevalue.IValueChange; import li.strolch.persistence.api.StrolchTransaction; import ch.eitchnet.utils.dbc.DBC; @@ -56,7 +57,7 @@ public class ShiftActionCommand extends PlanActionCommand { unplan(action); // iterate all changes and shift - final List> changes = action.getChanges(); + final List>> changes = action.getChanges(); for (final IValueChange change : changes) { change.setTime(change.getTime() + shift); } @@ -74,7 +75,7 @@ public class ShiftActionCommand extends PlanActionCommand { unplan(action); // iterate all changes and shift - final List> changes = action.getChanges(); + final List>> changes = action.getChanges(); for (final IValueChange change : changes) { change.setTime(change.getTime() - shift); } @@ -86,5 +87,4 @@ public class ShiftActionCommand extends PlanActionCommand { public void setShift(Long shift) { this.shift = shift; } - } diff --git a/li.strolch.service/src/main/java/li/strolch/service/XmlExportModelArgument.java b/li.strolch.service/src/main/java/li/strolch/service/XmlExportModelArgument.java index fc368bd80..a57df54f4 100644 --- a/li.strolch.service/src/main/java/li/strolch/service/XmlExportModelArgument.java +++ b/li.strolch.service/src/main/java/li/strolch/service/XmlExportModelArgument.java @@ -29,8 +29,10 @@ public class XmlExportModelArgument extends ServiceArgument { public boolean multiFile; public boolean doOrders = true; public boolean doResources = true; + public boolean doActivities = true; public Set orderTypes = new HashSet<>(); public Set resourceTypes = new HashSet<>(); + public Set activityTypes = new HashSet<>(); @Override public String toString() { @@ -52,6 +54,8 @@ public class XmlExportModelArgument extends ServiceArgument { builder.append(", resources"); if (this.doOrders) builder.append(", orders"); + if (this.doActivities) + builder.append(", activities"); if (this.resourceTypes != null && !this.resourceTypes.isEmpty()) { builder.append(", resourceTypes="); @@ -59,6 +63,7 @@ public class XmlExportModelArgument extends ServiceArgument { } else { builder.append(", resourceTypes=*"); } + if (this.orderTypes != null && !this.orderTypes.isEmpty()) { builder.append(", orderTypes="); builder.append(this.orderTypes); @@ -66,6 +71,13 @@ public class XmlExportModelArgument extends ServiceArgument { builder.append(", orderTypes=*"); } + if (this.activityTypes != null && !this.activityTypes.isEmpty()) { + builder.append(", activityTypes="); + builder.append(this.activityTypes); + } else { + builder.append(", activityTypes=*"); + } + builder.append("]"); return builder.toString(); } diff --git a/li.strolch.service/src/main/java/li/strolch/service/XmlExportModelService.java b/li.strolch.service/src/main/java/li/strolch/service/XmlExportModelService.java index 9e8a45c11..8a843e853 100644 --- a/li.strolch.service/src/main/java/li/strolch/service/XmlExportModelService.java +++ b/li.strolch.service/src/main/java/li/strolch/service/XmlExportModelService.java @@ -83,8 +83,10 @@ public class XmlExportModelService extends AbstractService orderTypes = new HashSet<>(); public Set resourceTypes = new HashSet<>(); + public Set activityTypes = new HashSet<>(); @Override public String toString() { @@ -40,7 +43,7 @@ public class XmlImportModelArgument extends ServiceArgument { builder.append("external="); builder.append(this.external); - + builder.append(", allowInclude="); builder.append(this.allowInclude); @@ -51,11 +54,15 @@ public class XmlImportModelArgument extends ServiceArgument { builder.append(", addOrders"); if (this.addResources) builder.append(", addResources"); + if (this.addActivities) + builder.append(", addActivities"); if (this.updateOrders) builder.append(", updateOrders"); if (this.updateResources) builder.append(", updateResources"); + if (this.updateActivities) + builder.append(", updateActivities"); if (this.resourceTypes != null && !this.resourceTypes.isEmpty()) { builder.append(", resourceTypes="); @@ -63,6 +70,7 @@ public class XmlImportModelArgument extends ServiceArgument { } else { builder.append(", resourceTypes=*"); } + if (this.orderTypes != null && !this.orderTypes.isEmpty()) { builder.append(", orderTypes="); builder.append(this.orderTypes); @@ -70,6 +78,13 @@ public class XmlImportModelArgument extends ServiceArgument { builder.append(", orderTypes=*"); } + if (this.activityTypes != null && !this.activityTypes.isEmpty()) { + builder.append(", activityTypes="); + builder.append(this.activityTypes); + } else { + builder.append(", activityTypes=*"); + } + builder.append("]"); return builder.toString(); } diff --git a/li.strolch.service/src/main/java/li/strolch/service/XmlImportModelService.java b/li.strolch.service/src/main/java/li/strolch/service/XmlImportModelService.java index 55e9f9234..f577b0a33 100644 --- a/li.strolch.service/src/main/java/li/strolch/service/XmlImportModelService.java +++ b/li.strolch.service/src/main/java/li/strolch/service/XmlImportModelService.java @@ -76,10 +76,13 @@ public class XmlImportModelService extends AbstractService