diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java
index a8119d41e..afd7ed546 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java
@@ -42,7 +42,6 @@ public class Machine extends Resource {
this.code = code;
this.name = name;
this.description = description;
- getConfigurationUnits();
}
public static Machine create() {
diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml
index 3cdb8dff5..e9e7dc502 100644
--- a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml
+++ b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml
@@ -126,7 +126,7 @@
-
+
@@ -144,7 +144,7 @@
-
+
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/IMachineModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/IMachineModel.java
index 8ec11280a..a9fa55198 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/IMachineModel.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/IMachineModel.java
@@ -21,35 +21,62 @@
package org.navalplanner.web.resources.machine;
import java.util.List;
-
import org.navalplanner.business.calendars.entities.BaseCalendar;
import org.navalplanner.business.calendars.entities.ResourceCalendar;
import org.navalplanner.business.common.exceptions.ValidationException;
+import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.Machine;
import org.navalplanner.business.resources.entities.MachineWorkersConfigurationUnit;
/*
* This interface contains the operations to create/edit a machine.
*
+ * Conversation state: the Machine instance and associated entities.
+ * The MachineWorkersConfigurationUnit set of the machine,
+ * the MachineWorkerAssigments of each MachineWorkersConfigurationUnit instance,
+ * the Criterion set required by each MachineWorkersConfigurationUnit instance,
+ * the calendar associated with the Machine instance
+ *
+ * Conversation protocol:
+ *
+ * Initial steps:
+ * initCreate
+ * initEdit
+ *
+ * Intermediate conversational steps:
+ * getConfigurationUnitsOfMachine
+ * setCalendarOfMachine
+ * setCalendarOfMachine
+ *
+ * Final conversational step:
+ * confirmSave()
+ *
+ * Not conversational steps:
+ * getMachines()
+ * getBaseCalendars()
+ *
* @author Diego Pino Garcia
+ * @author Javier Moran Rua
*/
public interface IMachineModel {
-
- void confirmSave() throws ValidationException;
-
- List getBaseCalendars();
-
- ResourceCalendar getCalendar();
-
- Machine getMachine();
-
- List getMachines();
-
- List getConfigurationUnits();
-
+ // Initial conversational steps
void initCreate();
-
void initEdit(Machine machine);
- void setCalendar(ResourceCalendar resourceCalendar);
-}
+ // Intermediate conversation steps
+ Machine getMachine();
+ ResourceCalendar getCalendarOfMachine();
+ List getConfigurationUnitsOfMachine();
+ void setCalendarOfMachine(ResourceCalendar resourceCalendar);
+ void addWorkerAssigmentToConfigurationUnit(MachineWorkersConfigurationUnit
+ machineWorkersConfigurationUnit);
+ void addCriterionRequirementToConfigurationUnit(
+ MachineWorkersConfigurationUnit criterion);
+
+ // Final conversational step
+ void confirmSave() throws ValidationException;
+
+ // Non conversational methods
+ List getMachines();
+ List getBaseCalendars();
+}
\ No newline at end of file
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java
index 935c6a731..f73aeb9d5 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineCRUDController.java
@@ -173,7 +173,7 @@ public class MachineCRUDController extends GenericForwardComposer {
}
updateCalendarController();
- resourceCalendarModel.initEdit(machineModel.getCalendar());
+ resourceCalendarModel.initEdit(machineModel.getCalendarOfMachine());
try {
baseCalendarEditionController.doAfterCompose(editCalendarWindow);
} catch (Exception e) {
@@ -275,7 +275,7 @@ public class MachineCRUDController extends GenericForwardComposer {
}
updateCalendarController();
- machineModel.setCalendar((ResourceCalendar) resourceCalendarModel
+ machineModel.setCalendarOfMachine((ResourceCalendar) resourceCalendarModel
.getBaseCalendar());
try {
baseCalendarEditionController.doAfterCompose(editCalendarWindow);
@@ -311,7 +311,7 @@ public class MachineCRUDController extends GenericForwardComposer {
@Override
public void goToList() {
machineModel
- .setCalendar((ResourceCalendar) resourceCalendarModel
+ .setCalendarOfMachine((ResourceCalendar) resourceCalendarModel
.getBaseCalendar());
reloadWindow();
}
@@ -319,14 +319,14 @@ public class MachineCRUDController extends GenericForwardComposer {
@Override
public void cancel() {
resourceCalendarModel.cancel();
- machineModel.setCalendar(null);
+ machineModel.setCalendarOfMachine(null);
reloadWindow();
}
@Override
public void save() {
machineModel
- .setCalendar((ResourceCalendar) resourceCalendarModel
+ .setCalendarOfMachine((ResourceCalendar) resourceCalendarModel
.getBaseCalendar());
reloadWindow();
}
@@ -342,7 +342,7 @@ public class MachineCRUDController extends GenericForwardComposer {
}
public boolean isCalendarNull() {
- return (machineModel.getCalendar() == null);
+ return (machineModel.getCalendarOfMachine() == null);
}
public boolean isCalendarNotNull() {
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineConfigurationController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineConfigurationController.java
index f626757f4..c76a64a46 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineConfigurationController.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineConfigurationController.java
@@ -100,48 +100,32 @@ public class MachineConfigurationController extends GenericForwardComposer {
}
public List getConfigurationUnits() {
- return this.machineModel.getConfigurationUnits();
+ return this.machineModel.getConfigurationUnitsOfMachine();
}
public List getWorkerAssignments() {
// Need to specify concrete unit
MachineWorkersConfigurationUnit unit = (MachineWorkersConfigurationUnit) this.machineModel
- .getConfigurationUnits().iterator().next();
+ .getConfigurationUnitsOfMachine().iterator().next();
return (List) unit.getWorkerAssignments();
}
public List getRequiredCriterions() {
// Need to specify concrete unit
MachineWorkersConfigurationUnit unit = (MachineWorkersConfigurationUnit) this.machineModel
- .getConfigurationUnits().iterator().next();
+ .getConfigurationUnitsOfMachine().iterator().next();
return (List) unit.getRequiredCriterions();
}
- @Transactional(readOnly = true)
- public void addValidMachineWorkerAssignments(
- MachineWorkersConfigurationUnit unit) {
- Worker worker = null;
- // Pending to add selected worker from autocomplete component
- worker = workerDAO.getWorkers().iterator().next();
- unit.addNewWorkerAssignment(worker);
- }
-
- public void addValidCriterionRequirement(
- MachineWorkersConfigurationUnit unit) {
- // Pending to add selected criterion from autocomplete component
- Criterion criterion = criterionDAO.getAll().iterator().next();
- unit.addRequiredCriterion(criterion);
- }
-
public void addWorkerAssignment(MachineWorkersConfigurationUnit unit,
Component c) {
- addValidMachineWorkerAssignments(unit);
+ machineModel.addWorkerAssigmentToConfigurationUnit(unit);
Util.reloadBindings(c.getNextSibling());
}
public void addCriterionRequirement(MachineWorkersConfigurationUnit unit,
Component c) {
- addValidCriterionRequirement(unit);
+ machineModel.addCriterionRequirementToConfigurationUnit(unit);
Util.reloadBindings(c.getNextSibling());
}
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineModel.java
index 1b7405ea5..502c0860a 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineModel.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/machine/MachineModel.java
@@ -21,24 +21,36 @@
package org.navalplanner.web.resources.machine;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.Validate;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.InvalidValue;
+import org.hsqldb.lib.Collection;
import org.navalplanner.business.calendars.daos.IBaseCalendarDAO;
import org.navalplanner.business.calendars.entities.BaseCalendar;
import org.navalplanner.business.calendars.entities.ResourceCalendar;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.common.exceptions.ValidationException;
+import org.navalplanner.business.resources.daos.ICriterionDAO;
+import org.navalplanner.business.resources.daos.ICriterionTypeDAO;
import org.navalplanner.business.resources.daos.IMachineDAO;
import org.navalplanner.business.resources.daos.IResourceDAO;
+import org.navalplanner.business.resources.daos.IWorkerDAO;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.CriterionSatisfaction;
+import org.navalplanner.business.resources.entities.CriterionType;
import org.navalplanner.business.resources.entities.Machine;
import org.navalplanner.business.resources.entities.MachineWorkerAssignment;
import org.navalplanner.business.resources.entities.MachineWorkersConfigurationUnit;
+import org.navalplanner.business.resources.entities.ResourceEnum;
+import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.web.calendars.IBaseCalendarModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -49,21 +61,39 @@ import org.springframework.transaction.annotation.Transactional;
/**
* @author Diego Pino Garcia
+ * @author Javier Moran Rua
*/
@Service
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class MachineModel implements IMachineModel {
+ private static Log LOG = LogFactory.getLog(MachineModel.class);
+ /*
+ * State field. Machine is the root of the aggregate
+ * for holding the state. Includes:
+ *
+ * the Machine instance and associated entities.
+ * The MachineWorkersConfigurationUnit set of the machine,
+ * the MachineWorkerAssigments of each MachineWorkersConfigurationUnit instance,
+ * the Criterion set required by each MachineWorkersConfigurationUnit instance,
+ * the calendar associated with the Machine instance
+ *
+ */
+ private Machine machine;
+ private Map criterions = new HashMap();
+ private Map workers = new HashMap();
@Autowired
private IResourceDAO resourceDAO;
-
@Autowired
private IMachineDAO machineDAO;
-
@Autowired
private IBaseCalendarDAO baseCalendarDAO;
-
- private Machine machine;
+ @Autowired
+ private ICriterionDAO criterionDAO;
+ @Autowired
+ private ICriterionTypeDAO criterionTypeDAO;
+ @Autowired
+ private IWorkerDAO workerDAO;
private ClassValidator validator = new ClassValidator(
Machine.class);
@@ -72,6 +102,30 @@ public class MachineModel implements IMachineModel {
@Qualifier("subclass")
private IBaseCalendarModel baseCalendarModel;
+ private void reattachCriterionsCache() {
+ for (Criterion each: criterions.values()) {
+ criterionDAO.reattachUnmodifiedEntity(each);
+ }
+ }
+
+ private void reattachWorkersCache() {
+ for (Worker each: workers.values()) {
+ workerDAO.reattachUnmodifiedEntity(each);
+ }
+ }
+
+ private void insertInCriterionsCacheIfNotExist(Criterion criterion) {
+ if (!criterions.containsValue(criterion)) {
+ criterions.put(criterion.getId(), criterion);
+ }
+ }
+
+ private void insertInWorkersCacheIfNotExist(Worker worker) {
+ if (!workers.containsValue(worker)) {
+ workers.put(worker.getId(), worker);
+ }
+ }
+
@Override
public void initCreate() {
machine = Machine.create();
@@ -79,8 +133,54 @@ public class MachineModel implements IMachineModel {
@Override
@Transactional(readOnly = true)
- public List getMachines() {
- return machineDAO.getAll();
+ public void initEdit(Machine machine) {
+ Validate.notNull(machine);
+ try {
+ this.machine = (Machine) resourceDAO.find(machine.getId());
+ loadDepedentEntities();
+ } catch (InstanceNotFoundException e) {
+ LOG.error("Machine with id " + machine.getId()
+ + " not found", e);
+ throw new RuntimeException();
+ }
+ }
+
+ private void loadDepedentEntities() {
+ reattachCriterionsCache();
+ reattachWorkersCache();
+ loadCriterionSatisfactions();
+ loadConfigurationUnits();
+ }
+
+ private void loadCriterionSatisfactions() {
+ for (CriterionSatisfaction each: machine.getCriterionSatisfactions()) {
+ each.getStartDate();
+ each.getCriterion().getName();
+ insertInCriterionsCacheIfNotExist(each.getCriterion());
+ }
+ }
+
+ private void loadConfigurationUnits() {
+ for (MachineWorkersConfigurationUnit each : machine.getConfigurationUnits()) {
+ each.getName();
+ loadRequiredCriterionsOf(each);
+ loadMachineWorkersAssignmentsOf(each);
+ }
+ }
+
+ private void loadRequiredCriterionsOf(MachineWorkersConfigurationUnit configurationUnit) {
+ for (Criterion each: configurationUnit.getRequiredCriterions()) {
+ each.getName();
+ insertInCriterionsCacheIfNotExist(each);
+ }
+ }
+
+ private void loadMachineWorkersAssignmentsOf(MachineWorkersConfigurationUnit configurationUnit) {
+ for (MachineWorkerAssignment each: configurationUnit.getWorkerAssignments()) {
+ each.getStartDate();
+ each.getWorker().getName();
+ insertInWorkersCacheIfNotExist(each.getWorker());
+ }
}
@Override
@@ -90,13 +190,61 @@ public class MachineModel implements IMachineModel {
@Override
@Transactional(readOnly = true)
- public List getConfigurationUnits() {
+ public List getConfigurationUnitsOfMachine() {
ArrayList elements = new ArrayList();
if ( machine != null )
elements.addAll(machine.getConfigurationUnits());
return elements;
}
+ @Override
+ public void setCalendarOfMachine(ResourceCalendar resourceCalendar) {
+ if (machine != null) {
+ machine.setCalendar(resourceCalendar);
+ }
+ }
+
+ @Override
+ public ResourceCalendar getCalendarOfMachine() {
+ return (machine != null) ? machine.getCalendar() : null;
+ }
+
+ @Transactional(readOnly=true)
+ @Override
+ public void addWorkerAssigmentToConfigurationUnit(
+ MachineWorkersConfigurationUnit unit) {
+ // TODO: Modify method to add the WorkerAssigment to add
+ Worker worker = workerDAO.getWorkers().iterator().next();
+
+ for (MachineWorkersConfigurationUnit each:
+ machine.getConfigurationUnits()) {
+ if (each == unit) {
+ each.addNewWorkerAssignment(worker);
+ }
+ }
+ }
+
+ @Transactional(readOnly=true)
+ @Override
+ public void addCriterionRequirementToConfigurationUnit(
+ MachineWorkersConfigurationUnit unit) {
+ // TODO: Modify method to add the criterion to add as parameter
+ HashSet appliableToMachine =
+ new HashSet();
+ appliableToMachine.add(ResourceEnum.MACHINE);
+ appliableToMachine.add(ResourceEnum.RESOURCE);
+ boolean stop = false;
+ for (CriterionType each:
+ criterionTypeDAO.getCriterionTypesByResources(appliableToMachine)) {
+ for (Criterion eachCriterion: each.getCriterions()) {
+ unit.addRequiredCriterion(eachCriterion);
+ stop = true;
+ break;
+ }
+ if (stop) break;
+ }
+ }
+
@Override
@Transactional
public void confirmSave() throws ValidationException {
@@ -110,68 +258,6 @@ public class MachineModel implements IMachineModel {
resourceDAO.save(machine);
}
- @Override
- @Transactional(readOnly = true)
- public void initEdit(Machine machine) {
- Validate.notNull(machine);
- this.machine = getFromDB(machine);
- }
-
- private Machine getFromDB(Machine machine) {
- return getFromDB(machine.getId());
- }
-
- private Machine getFromDB(Long id) {
- try {
- Machine machine = (Machine) resourceDAO.find(id);
- initializeCriterionsSatisfactions(machine
- .getCriterionSatisfactions());
- initializeConfigurationUnits(machine.getConfigurationUnits());
- return machine;
- } catch (InstanceNotFoundException e) {
- throw new RuntimeException(e);
- }
- }
-
- private void initializeCriterionsSatisfactions(
- Set criterionSatisfactions) {
- for (CriterionSatisfaction criterionSatisfaction : criterionSatisfactions) {
- initializeCriterionSatisfaction(criterionSatisfaction);
- }
- }
-
- private void initializeCriterionSatisfaction(
- CriterionSatisfaction criterionSatisfaction) {
- initializeCriterion(criterionSatisfaction.getCriterion());
- }
-
- private void initializeCriterion(Criterion criterion) {
- criterion.getName();
- criterion.getName();
- if (criterion.getParent() != null) {
- criterion.getParent().getName();
- }
- }
-
- private void initializeConfigurationUnits(
- Set configurationUnits) {
- for (MachineWorkersConfigurationUnit configurationUnit : configurationUnits) {
- initializeConfigurationUnit(configurationUnit);
- }
- }
-
- private void initializeConfigurationUnit(
- MachineWorkersConfigurationUnit configurationUnit) {
- configurationUnit.getName();
- for (Criterion criterion : configurationUnit.getRequiredCriterions()) {
- criterion.getName();
- }
- for (MachineWorkerAssignment assignment : configurationUnit
- .getWorkerAssignments()) {
- assignment.getWorker().getName();
- }
- }
-
@Override
@Transactional(readOnly = true)
public List getBaseCalendars() {
@@ -179,15 +265,8 @@ public class MachineModel implements IMachineModel {
}
@Override
- public void setCalendar(ResourceCalendar resourceCalendar) {
- if (machine != null) {
- machine.setCalendar(resourceCalendar);
- }
+ @Transactional(readOnly = true)
+ public List getMachines() {
+ return machineDAO.getAll();
}
-
- @Override
- public ResourceCalendar getCalendar() {
- return (machine != null) ? machine.getCalendar() : null;
- }
-
}