ItEr17S10CUCreacionProxectoPlanificacionItEr16S12: The adapter is moved to a top level class managed by Spring to allow the posibility of using reatachments.

Changes are still not saved.
This commit is contained in:
Óscar González Fernández 2009-07-19 17:41:46 +02:00 committed by Javier Moran Rua
parent 3c41301d10
commit 5a7c6686d2
4 changed files with 154 additions and 99 deletions

View file

@ -0,0 +1,15 @@
package org.navalplanner.web.planner;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.planner.entities.TaskElement;
import org.zkoss.ganttz.adapters.IAdapterToTaskFundamentalProperties;
/**
* Contract for {@link TaskElementAdapter} <br />
* @author Óscar González Fernández <ogonzalez@igalia.com>
*/
public interface ITaskElementAdapter extends IAdapterToTaskFundamentalProperties<TaskElement>{
void setOrder(Order order);
}

View file

@ -1,124 +1,30 @@
package org.navalplanner.web.planner;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.orders.services.IOrderService;
import org.navalplanner.business.planner.entities.Dependency;
import org.navalplanner.business.planner.entities.TaskElement;
import org.navalplanner.business.planner.entities.Dependency.Type;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.zkoss.ganttz.adapters.DomainDependency;
import org.zkoss.ganttz.adapters.IAdapterToTaskFundamentalProperties;
import org.zkoss.ganttz.adapters.IStructureNavigator;
import org.zkoss.ganttz.adapters.PlannerConfiguration;
import org.zkoss.ganttz.util.DefaultFundamentalProperties;
import org.zkoss.ganttz.util.DependencyType;
import org.zkoss.ganttz.util.ITaskFundamentalProperties;
/**
* @author Óscar González Fernández <ogonzalez@igalia.com>
*/
@Component
@Scope(BeanDefinition.SCOPE_SINGLETON)
public class OrderPlanningModel implements IOrderPlanningModel {
public abstract class OrderPlanningModel implements IOrderPlanningModel {
@Autowired
private IOrderService orderService;
private final class TaskElementToFundamentalProperties implements
IAdapterToTaskFundamentalProperties<TaskElement> {
private final Order order;
private List<Dependency> dependenciesCreated = new ArrayList<Dependency>();
private TaskElementToFundamentalProperties(Order order) {
this.order = order;
}
@Override
public ITaskFundamentalProperties adapt(final TaskElement taskElement) {
// FIXME We'll need a custom ITaskFundamentalProperties
// implementation to edit the taskElement
DefaultFundamentalProperties result = new DefaultFundamentalProperties();
result.setName(taskElement.getOrderElement().getName());
result
.setBeginDate(taskElement.getStartDate() != null ? taskElement
.getStartDate()
: order.getInitDate());
OrderElement orderElement = taskElement.getOrderElement();
Integer workHours = orderElement.getWorkHours();
result.setLengthMilliseconds(workHours * 3600l * 1000);
result.setNotes(null);
return result;
}
@Override
public List<DomainDependency<TaskElement>> getDependenciesOriginating(
TaskElement taskElement) {
Set<Dependency> dependenciesWithThisOrigin = taskElement
.getDependenciesWithThisOrigin();
List<DomainDependency<TaskElement>> result = new ArrayList<DomainDependency<TaskElement>>();
for (Dependency dependency : dependenciesWithThisOrigin) {
result.add(DomainDependency.createDependency(taskElement,
dependency.getDestination(), toGanntType(dependency
.getType())));
}
return result;
}
private DependencyType toGanntType(Type type) {
switch (type) {
case END_START:
return DependencyType.END_START;
case START_START:
return DependencyType.START_START;
case END_END:
return DependencyType.END_END;
case START_END:
default:
throw new RuntimeException(type + " not supported yet");
}
}
private Type toDomainType(DependencyType type) {
switch (type) {
case END_START:
return Type.END_START;
case START_START:
return Type.START_START;
case END_END:
return Type.END_END;
default:
throw new RuntimeException(type + " not supported yet");
}
}
@Override
public void addDependency(DomainDependency<TaskElement> dependency) {
TaskElement source = dependency.getSource();
TaskElement destination = dependency.getDestination();
Type domainType = toDomainType(dependency.getType());
Dependency domainDependency = Dependency.createDependency(source,
destination, domainType);
}
@Override
public boolean canAddDependency(DomainDependency<TaskElement> dependency) {
return true;
}
}
private List<TaskElement> state;
private final class TaskElementNavigator implements
IStructureNavigator<TaskElement> {
@ -145,11 +51,31 @@ public class OrderPlanningModel implements IOrderPlanningModel {
private PlannerConfiguration<TaskElement> createConfiguration(
Order orderReloaded) {
return new PlannerConfiguration<TaskElement>(
new TaskElementToFundamentalProperties(orderReloaded),
new TaskElementNavigator(), orderReloaded.getAssociatedTasks());
ITaskElementAdapter taskElementAdapter = getTaskElementAdapter();
taskElementAdapter.setOrder(orderReloaded);
state = orderReloaded.getAssociatedTasks();
forceLoadOfDependenciesCollections(state);
return new PlannerConfiguration<TaskElement>(taskElementAdapter,
new TaskElementNavigator(), state);
}
private void forceLoadOfDependenciesCollections(List<TaskElement> elements) {
for (TaskElement task : elements) {
forceLoadOfDepedenciesCollections(task);
if (!task.isLeaf()) {
forceLoadOfDependenciesCollections(task.getChildren());
}
}
}
private void forceLoadOfDepedenciesCollections(TaskElement task) {
task.getDependenciesWithThisOrigin().size();
task.getDependenciesWithThisDestination().size();
}
// spring method injection
protected abstract ITaskElementAdapter getTaskElementAdapter();
private Order reload(Order order) {
try {
return orderService.find(order.getId());

View file

@ -0,0 +1,110 @@
package org.navalplanner.web.planner;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.planner.entities.Dependency;
import org.navalplanner.business.planner.entities.TaskElement;
import org.navalplanner.business.planner.entities.Dependency.Type;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.zkoss.ganttz.adapters.DomainDependency;
import org.zkoss.ganttz.util.DefaultFundamentalProperties;
import org.zkoss.ganttz.util.DependencyType;
import org.zkoss.ganttz.util.ITaskFundamentalProperties;
/**
* Responsible of adaptating a {@link TaskElement} into a
* {@link ITaskFundamentalProperties} <br />
* This class is managed by spring so version checking and reatachments are
* allowed, but they're not used by now.
* @author Óscar González Fernández <ogonzalez@igalia.com>
*/
@Component
@Scope(BeanDefinition.SCOPE_SINGLETON)
public class TaskElementAdapter implements ITaskElementAdapter {
private Order order;
@Override
public void setOrder(Order order) {
this.order = order;
}
public TaskElementAdapter() {
}
@Override
public ITaskFundamentalProperties adapt(final TaskElement taskElement) {
// FIXME We'll need a custom ITaskFundamentalProperties
// implementation to edit the taskElement
DefaultFundamentalProperties result = new DefaultFundamentalProperties();
result.setName(taskElement.getOrderElement().getName());
result.setBeginDate(taskElement.getStartDate() != null ? taskElement
.getStartDate() : order.getInitDate());
OrderElement orderElement = taskElement.getOrderElement();
Integer workHours = orderElement.getWorkHours();
result.setLengthMilliseconds(workHours * 3600l * 1000);
result.setNotes(null);
return result;
}
@Override
public List<DomainDependency<TaskElement>> getDependenciesOriginating(
TaskElement taskElement) {
Set<Dependency> dependenciesWithThisOrigin = taskElement
.getDependenciesWithThisOrigin();
List<DomainDependency<TaskElement>> result = new ArrayList<DomainDependency<TaskElement>>();
for (Dependency dependency : dependenciesWithThisOrigin) {
result.add(DomainDependency.createDependency(taskElement,
dependency.getDestination(), toGanntType(dependency
.getType())));
}
return result;
}
private DependencyType toGanntType(Type type) {
switch (type) {
case END_START:
return DependencyType.END_START;
case START_START:
return DependencyType.START_START;
case END_END:
return DependencyType.END_END;
case START_END:
default:
throw new RuntimeException(type + " not supported yet");
}
}
private Type toDomainType(DependencyType type) {
switch (type) {
case END_START:
return Type.END_START;
case START_START:
return Type.START_START;
case END_END:
return Type.END_END;
default:
throw new RuntimeException(type + " not supported yet");
}
}
@Override
public void addDependency(DomainDependency<TaskElement> dependency) {
TaskElement source = dependency.getSource();
TaskElement destination = dependency.getDestination();
Type domainType = toDomainType(dependency.getType());
Dependency.createDependency(source, destination, domainType);
}
@Override
public boolean canAddDependency(DomainDependency<TaskElement> dependency) {
return true;
}
}

View file

@ -15,5 +15,9 @@
<context:annotation-config />
<bean class="org.navalplanner.web.common.entrypoints.RedirectorSynthetiser"></bean>
<bean class="org.navalplanner.web.planner.OrderPlanningModel" scope="prototype">
<lookup-method name="getTaskElementAdapter" bean="taskElementAdapter"/>
</bean>
<context:component-scan base-package="org.navalplanner.web"/>
</beans>