ItEr42S17CUGravacionModelosUnidadesTraballoItEr41S20: Extracting superclass from AssignedMaterialsToOrderElementModel.

This commit is contained in:
Óscar González Fernández 2010-01-07 17:02:30 +01:00
parent a85669b7ca
commit acc1b103b9
2 changed files with 277 additions and 175 deletions

View file

@ -0,0 +1,245 @@
/*
* This file is part of ###PROJECT_NAME###
*
* Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.navalplanner.web.orders.materials;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.navalplanner.business.materials.daos.IMaterialCategoryDAO;
import org.navalplanner.business.materials.daos.IMaterialDAO;
import org.navalplanner.business.materials.entities.Material;
import org.navalplanner.business.materials.entities.MaterialCategory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.zkoss.ganttz.util.MutableTreeModel;
import org.zkoss.zul.TreeModel;
/**
* @author Óscar González Fernández <ogonzalez@igalia.com>
*
*/
public abstract class AssignedMaterialsModel<T, A> {
@Autowired
private IMaterialCategoryDAO categoryDAO;
@Autowired
private IMaterialDAO materialDAO;
private MutableTreeModel<MaterialCategory> materialCategories = MutableTreeModel
.create(MaterialCategory.class);
private MutableTreeModel<MaterialCategory> allMaterialCategories = MutableTreeModel
.create(MaterialCategory.class);
private List<Material> matchingMaterials = new ArrayList<Material>();
@Transactional(readOnly = true)
public void initEdit(T element) {
assignAndReattach(element);
materialCategories = MutableTreeModel.create(MaterialCategory.class);
initializeMaterialAssigments();
// Initialize matching materials
matchingMaterials.clear();
matchingMaterials.addAll(materialDAO.getAll());
initializeMaterials(matchingMaterials);
}
protected abstract void initializeMaterialAssigments();
protected abstract void assignAndReattach(T element);
private void initializeMaterials(Collection<Material> materials) {
for (Material each : materials) {
initializeMaterial(each);
}
}
protected void initializeMaterialCategories(
Collection<MaterialCategory> materialCategories) {
for (MaterialCategory each : materialCategories) {
initializeMaterialCategory(each);
}
}
protected void initializeMaterialCategory(MaterialCategory materialCategory) {
materialCategory.getName();
initializeMaterials(materialCategory.getMaterials());
initializeMaterialCategories(materialCategory.getSubcategories());
}
private void initializeMaterial(Material material) {
material.getDescription();
material.getCategory().getName();
}
@Transactional(readOnly = true)
public MutableTreeModel<MaterialCategory> getMaterialCategories() {
if (isInitialized() && materialCategories.isEmpty()) {
feedTree(materialCategories, getAssignments());
initializeMaterialCategories(materialCategories.asList());
}
return materialCategories;
}
protected abstract List<A> getAssignments();
protected abstract Material getMaterial(A assignment);
private void feedTree(MutableTreeModel<MaterialCategory> tree,
Collection<? extends A> materialAssignments) {
for (A each : materialAssignments) {
final Material material = getMaterial(each);
addCategory(tree, material.getCategory());
}
}
/**
* Adds category to treeModel If category.parent is not in treeModel add it
* to treeModel recursively.
*/
private void addCategory(
MutableTreeModel<MaterialCategory> materialCategories,
MaterialCategory materialCategory) {
categoryDAO.reattach(materialCategory);
final MaterialCategory parent = materialCategory.getParent();
if (parent == null) {
if (!materialCategories.contains(parent, materialCategory)) {
materialCategories.addToRoot(materialCategory);
}
} else {
if (!materialCategories.contains(parent, materialCategory)) {
addCategory(materialCategories, parent);
materialCategories.add(parent, materialCategory);
}
}
}
@Transactional(readOnly = true)
public TreeModel getAllMaterialCategories() {
if (allMaterialCategories.isEmpty()) {
feedTree(allMaterialCategories, categoryDAO.getAll());
initializeMaterialCategories(allMaterialCategories.asList());
}
return allMaterialCategories;
}
private void feedTree(MutableTreeModel<MaterialCategory> tree,
List<MaterialCategory> materialCategories) {
for (MaterialCategory each : materialCategories) {
addCategory(tree, each);
}
}
protected abstract boolean isInitialized();
public List<A> getAssignedMaterials(MaterialCategory materialCategory) {
List<A> result = new ArrayList<A>();
if (isInitialized()) {
for (A each : getAssignments()) {
final Material material = getMaterial(each);
if (materialCategory == null
|| materialCategory.getId().equals(
material.getCategory().getId())) {
result.add(each);
}
}
}
return result;
}
@Transactional(readOnly = true)
public void searchMaterials(String text, MaterialCategory materialCategory) {
matchingMaterials = materialDAO
.findMaterialsInCategoryAndSubCategories(text, materialCategory);
initializeMaterials(matchingMaterials);
}
public List<Material> getMatchingMaterials() {
return matchingMaterials;
}
protected abstract void addMaterialAssignment(Material material);
@Transactional(readOnly = true)
public void addMaterialAssignment(A materialAssignment) {
MaterialCategory category = addAssignment(materialAssignment);
addCategory(materialCategories, category);
}
protected abstract MaterialCategory addAssignment(A materialAssignment);
protected abstract MaterialCategory removeAssignment(A materialAssignment);
public void removeMaterialAssignment(A materialAssignment) {
MaterialCategory materialCategory = removeAssignment(materialAssignment);
removeCategory(materialCategories, materialCategory);
}
private void removeCategory(
MutableTreeModel<MaterialCategory> materialCategories,
MaterialCategory materialCategory) {
categoryDAO.reattach(materialCategory);
final boolean canDelete = materialCategory.getSubcategories().isEmpty()
&& getAssignedMaterials(materialCategory).isEmpty();
if (canDelete) {
materialCategories.remove(materialCategory);
final MaterialCategory parent = materialCategory.getParent();
if (parent != null) {
removeCategory(materialCategories, parent);
}
}
}
public double getUnits(MaterialCategory materialCategory) {
double result = 0;
if (isInitialized()) {
for (A each : getAssignments()) {
final Material material = getMaterial(each);
if (materialCategory.equals(material.getCategory())) {
result += getUnits(each);
}
}
}
return result;
}
protected abstract Double getUnits(A assigment);
public BigDecimal getPrice(MaterialCategory category) {
BigDecimal result = new BigDecimal(0);
if (isInitialized()) {
for (A each : getAssignments()) {
final Material material = getMaterial(each);
if (category.equals(material.getCategory())) {
result = result.add(getTotalPrice(each));
}
}
}
return result;
}
protected abstract BigDecimal getTotalPrice(A each);
}

View file

@ -22,12 +22,9 @@ package org.navalplanner.web.orders.materials;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.navalplanner.business.materials.daos.IMaterialCategoryDAO;
import org.navalplanner.business.materials.daos.IMaterialDAO;
import org.navalplanner.business.materials.entities.Material;
import org.navalplanner.business.materials.entities.MaterialAssignment;
import org.navalplanner.business.materials.entities.MaterialCategory;
@ -38,48 +35,30 @@ import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.zkoss.ganttz.util.MutableTreeModel;
import org.zkoss.zul.TreeModel;
/**
* @author Diego Pino Garcia <dpino@igalia.com>
*/
@Service
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class AssignedMaterialsToOrderElementModel implements
public class AssignedMaterialsToOrderElementModel extends
AssignedMaterialsModel<OrderElement, MaterialAssignment> implements
IAssignedMaterialsToOrderElementModel {
@Autowired
private IMaterialCategoryDAO categoryDAO;
@Autowired
private IMaterialDAO materialDAO;
@Autowired
private IOrderElementDAO orderElementDAO;
private OrderElement orderElement;
private MutableTreeModel<MaterialCategory> materialCategories = MutableTreeModel
.create(MaterialCategory.class);
private MutableTreeModel<MaterialCategory> allMaterialCategories = MutableTreeModel
.create(MaterialCategory.class);
private List<Material> matchingMaterials = new ArrayList<Material>();
@Override
protected void assignAndReattach(OrderElement element) {
this.orderElement = element;
orderElementDAO.reattach(this.orderElement);
}
@Override
@Transactional(readOnly = true)
public void initEdit(OrderElement orderElement) {
this.orderElement = orderElement;
orderElementDAO.reattach(this.orderElement);
materialCategories = MutableTreeModel.create(MaterialCategory.class);
protected void initializeMaterialAssigments() {
initializeMaterialAssigments(this.orderElement.getMaterialAssignments());
// Initialize matching materials
matchingMaterials.clear();
matchingMaterials.addAll(materialDAO.getAll());
initializeMaterials(matchingMaterials);
}
private void initializeMaterialAssigments(
@ -90,123 +69,27 @@ public class AssignedMaterialsToOrderElementModel implements
}
}
@Transactional(readOnly = true)
private void initializeMaterialCategories(
Collection<MaterialCategory> materialCategories) {
for (MaterialCategory each : materialCategories) {
initializeMaterialCategory(each);
}
}
private void initializeMaterialCategory(MaterialCategory materialCategory) {
materialCategory.getName();
initializeMaterials(materialCategory.getMaterials());
initializeMaterialCategories(materialCategory.getSubcategories());
}
private void initializeMaterials(Collection<Material> materials) {
for (Material each : materials) {
initializeMaterial(each);
}
}
private void initializeMaterial(Material material) {
material.getDescription();
material.getCategory().getName();
}
@Override
public OrderElement getOrderElement() {
return orderElement;
}
@Override
@Transactional(readOnly = true)
public MutableTreeModel<MaterialCategory> getMaterialCategories() {
if (orderElement != null && materialCategories.isEmpty()) {
feedTree(materialCategories, orderElement.getMaterialAssignments());
initializeMaterialCategories(materialCategories.asList());
}
return materialCategories;
}
private void feedTree(MutableTreeModel<MaterialCategory> tree,
Set<MaterialAssignment> materialAssignments) {
for (MaterialAssignment each : materialAssignments) {
final Material material = (Material) each.getMaterial();
addCategory(tree, material.getCategory());
}
}
/**
* Adds category to treeModel
*
* If category.parent is not in treeModel add it to treeModel recursively.
*
*/
private void addCategory(
MutableTreeModel<MaterialCategory> materialCategories,
MaterialCategory materialCategory) {
categoryDAO.reattach(materialCategory);
final MaterialCategory parent = materialCategory.getParent();
if (parent == null) {
if (!materialCategories.contains(parent, materialCategory)) {
materialCategories.addToRoot(materialCategory);
}
} else {
if (!materialCategories.contains(parent, materialCategory)) {
addCategory(materialCategories, parent);
materialCategories.add(parent, materialCategory);
}
}
protected List<MaterialAssignment> getAssignments() {
return new ArrayList<MaterialAssignment>(orderElement
.getMaterialAssignments());
}
@Override
@Transactional(readOnly = true)
public TreeModel getAllMaterialCategories() {
if (allMaterialCategories.isEmpty()) {
feedTree(allMaterialCategories, categoryDAO.getAll());
initializeMaterialCategories(allMaterialCategories.asList());
}
return allMaterialCategories;
}
private void feedTree(MutableTreeModel<MaterialCategory> tree,
List<MaterialCategory> materialCategories) {
for (MaterialCategory each : materialCategories) {
addCategory(tree, each);
}
protected Material getMaterial(MaterialAssignment assignment) {
return assignment.getMaterial();
}
@Override
public List<MaterialAssignment> getAssignedMaterials(
MaterialCategory materialCategory) {
List<MaterialAssignment> result = new ArrayList<MaterialAssignment>();
if (orderElement != null) {
for (MaterialAssignment materialAssigment : orderElement
.getMaterialAssignments()) {
final Material material = materialAssigment.getMaterial();
if (materialCategory == null
|| materialCategory.getId().equals(material.getCategory().getId())) {
result.add(materialAssigment);
}
}
}
return result;
}
@Override
@Transactional(readOnly = true)
public void searchMaterials(String text, MaterialCategory materialCategory) {
matchingMaterials = materialDAO
.findMaterialsInCategoryAndSubCategories(text, materialCategory);
initializeMaterials(matchingMaterials);
}
@Override
public List<Material> getMatchingMaterials() {
return matchingMaterials;
protected MaterialCategory removeAssignment(
MaterialAssignment materialAssignment) {
orderElement.removeMaterialAssignment(materialAssignment);
return materialAssignment.getMaterial().getCategory();
}
@Override
@ -219,51 +102,15 @@ public class AssignedMaterialsToOrderElementModel implements
}
@Override
@Transactional(readOnly = true)
public void addMaterialAssignment(MaterialAssignment materialAssignment) {
protected MaterialCategory addAssignment(
MaterialAssignment materialAssignment) {
orderElement.addMaterialAssignment(materialAssignment);
// Add material category to materialCategories tree
final MaterialCategory materialCategory = materialAssignment.getMaterial().getCategory();
addCategory(materialCategories, materialCategory);
return materialAssignment.getMaterial().getCategory();
}
@Override
@Transactional(readOnly = true)
public void removeMaterialAssignment(MaterialAssignment materialAssignment) {
orderElement.removeMaterialAssignment(materialAssignment);
// Remove material category from materialCategories tree
final MaterialCategory materialCategory = materialAssignment.getMaterial().getCategory();
removeCategory(materialCategories, materialCategory);
}
private void removeCategory(
MutableTreeModel<MaterialCategory> materialCategories,
MaterialCategory materialCategory) {
categoryDAO.reattach(materialCategory);
final boolean canDelete = materialCategory.getSubcategories().isEmpty() && getAssignedMaterials(materialCategory).isEmpty();
if (canDelete) {
materialCategories.remove(materialCategory);
final MaterialCategory parent = materialCategory.getParent();
if (parent != null) {
removeCategory(materialCategories, parent);
}
}
}
@Override
public double getUnits(MaterialCategory materialCategory) {
double result = 0;
if (orderElement != null) {
for (MaterialAssignment materialAssignment : orderElement
.getMaterialAssignments()) {
final Material material = materialAssignment.getMaterial();
if (materialCategory.equals(material.getCategory())) {
result += materialAssignment.getUnits();
}
}
}
return result;
protected Double getUnits(MaterialAssignment assigment) {
return assigment.getUnits();
}
@Override
@ -281,4 +128,14 @@ public class AssignedMaterialsToOrderElementModel implements
return result;
}
@Override
protected BigDecimal getTotalPrice(MaterialAssignment materialAssignment) {
return materialAssignment.getTotalPrice();
}
@Override
protected boolean isInitialized() {
return orderElement != null;
}
}