ItEr39S16CUConfiguracionMaquinasItEr35S09: Searching on all resources not just workers

This commit is contained in:
Óscar González Fernández 2009-12-14 22:52:28 +01:00
parent 6947ee03c7
commit 1b87d3d8d0
5 changed files with 116 additions and 82 deletions

View file

@ -20,12 +20,14 @@
package org.navalplanner.web.resources.search;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.CriterionType;
import org.navalplanner.business.resources.entities.Machine;
import org.navalplanner.business.resources.entities.Resource;
import org.navalplanner.business.resources.entities.Worker;
/**
@ -33,7 +35,7 @@ import org.navalplanner.business.resources.entities.Worker;
*
* @author Diego Pino Garcia <dpino@igalia.com>
*/
public interface IWorkerSearchModel {
public interface IResourceSearchModel {
/**
* Returns all {@link Worker} matching by name (firstname or surname)
@ -41,30 +43,29 @@ public interface IWorkerSearchModel {
* @param name
* @return
*/
List<Worker> findWorkers(String name);
List<Resource> findResources(String name);
/**
* Queries database for retrieving all workers that match to the parameters
*
* Queries database for retrieving all resources that match to the
* parameters
* @param name
* matches name/NIF of {@link Worker}
* matches name/NIF of {@link Worker} or name/code of
* {@link Machine}
* @param criterions
* {@link Worker} that complies all criterions
* {@link Resource} that satisfy all criterions
* @return
*/
List<Worker> findWorkers(String name, List<Criterion> criterions);
List<Resource> findResources(String name, List<Criterion> criterions);
/**
* Returns all workers
*
* Returns all resources
* @return
*/
List<Worker> getAllWorkers();
List<Resource> getAllResources();
/**
* Gets all {@link Criterion} and groups then by {@link CriterionType}
*
* @return HashMap<CriterionType, Set<Criterion>>
*/
HashMap<CriterionType, Set<Criterion>> getCriterions();
Map<CriterionType, Set<Criterion>> getCriterions();
}

View file

@ -30,7 +30,7 @@ import java.util.Map.Entry;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.CriterionType;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.business.resources.entities.Resource;
import org.navalplanner.web.common.components.NewAllocationSelector.AllocationType;
import org.navalplanner.web.planner.allocation.INewAllocationsAdder;
import org.springframework.beans.factory.annotation.Autowired;
@ -59,17 +59,15 @@ import org.zkoss.zul.TreeitemRenderer;
import org.zkoss.zul.Treerow;
/**
* Controller for searching for {@link Worker}
*
* Controller for searching for {@link Resource}
* @author Diego Pino Garcia <dpino@igalia.com>
*
*/
public class NewAllocationSelectorController extends GenericForwardComposer {
@Autowired
private IWorkerSearchModel workerSearchModel;
private IResourceSearchModel resourceSearchModel;
private WorkerListRenderer workerListRenderer = new WorkerListRenderer();
private ResourceListRenderer resourceListRenderer = new ResourceListRenderer();
private Textbox txtName;
@ -77,7 +75,7 @@ public class NewAllocationSelectorController extends GenericForwardComposer {
private Tree criterionsTree;
private Listbox listBoxWorkers;
private Listbox listBoxResources;
private CriterionRenderer criterionRenderer = new CriterionRenderer();
@ -106,17 +104,17 @@ public class NewAllocationSelectorController extends GenericForwardComposer {
// is executed, refreshing the results into the workers listbox
@Override
public void onEvent(Event event) throws Exception {
searchWorkers(txtName.getValue(), getSelectedCriterions());
searchResources(txtName.getValue(), getSelectedCriterions());
}
});
}
// Initialize components
criterionsTree.setTreeitemRenderer(criterionRenderer);
listBoxWorkers.setItemRenderer(getListitemRenderer());
listBoxResources.setItemRenderer(getListitemRenderer());
// Show all workers
refreshListBoxWorkers(workerSearchModel.getAllWorkers());
refreshListBoxResources(resourceSearchModel.getAllResources());
allocationTypeSelector.addEventListener(Events.ON_CHECK,
new EventListener() {
@ -128,12 +126,13 @@ public class NewAllocationSelectorController extends GenericForwardComposer {
onType(type);
}
});
listBoxWorkers.addEventListener(Events.ON_SELECT, new EventListener() {
listBoxResources.addEventListener(Events.ON_SELECT,
new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
if (currentAllocationType == AllocationType.GENERIC) {
clearSelection(listBoxWorkers);
clearSelection(listBoxResources);
}
}
});
@ -147,9 +146,9 @@ public class NewAllocationSelectorController extends GenericForwardComposer {
}
private void onType(AllocationType type) {
listBoxWorkers.setDisabled(AllocationType.GENERIC == type);
listBoxResources.setDisabled(AllocationType.GENERIC == type);
if (AllocationType.GENERIC == type) {
clearSelection(listBoxWorkers);
clearSelection(listBoxResources);
}
currentAllocationType = type;
}
@ -177,7 +176,7 @@ public class NewAllocationSelectorController extends GenericForwardComposer {
* @param event
*/
public void searchWorkers(InputEvent event) {
searchWorkers(event.getValue(), getSelectedCriterions());
searchResources(event.getValue(), getSelectedCriterions());
}
/**
@ -186,10 +185,11 @@ public class NewAllocationSelectorController extends GenericForwardComposer {
* @param name
* @param criterions
*/
private void searchWorkers(String name, List<Criterion> criterions) {
final List<Worker> workers = workerSearchModel.findWorkers(name,
private void searchResources(String name, List<Criterion> criterions) {
final List<Resource> resources = resourceSearchModel.findResources(
name,
criterions);
refreshListBoxWorkers(workers);
refreshListBoxResources(resources);
}
/**
@ -212,12 +212,12 @@ public class NewAllocationSelectorController extends GenericForwardComposer {
return result;
}
private void refreshListBoxWorkers(List<Worker> workers) {
listBoxWorkers.setModel(new SimpleListModel(workers));
private void refreshListBoxResources(List<? extends Resource> resources) {
listBoxResources.setModel(new SimpleListModel(resources));
}
public WorkerListRenderer getListitemRenderer() {
return workerListRenderer;
public ResourceListRenderer getListitemRenderer() {
return resourceListRenderer;
}
public void onClose() {
@ -226,39 +226,37 @@ public class NewAllocationSelectorController extends GenericForwardComposer {
public void clearAll() {
txtName.setValue("");
refreshListBoxWorkers(workerSearchModel.getAllWorkers());
refreshListBoxResources(resourceSearchModel.getAllResources());
criterionsTree.setModel(getCriterions());
clearSelection(listBoxWorkers);
clearSelection(listBoxResources);
clearSelection(criterionsTree);
doInitialSelection();
}
public List<Worker> getSelectedWorkers() {
public List<Resource> getSelectedWorkers() {
if(currentAllocationType== AllocationType.GENERIC){
return allWorkersShown();
return allResourcesShown();
} else {
return getSelectedWorkersOnListbox();
return getSelectedResourcesOnListbox();
}
}
@SuppressWarnings("unchecked")
private List<Worker> allWorkersShown() {
List<Worker> result = new ArrayList<Worker>();
List<Listitem> selectedItems = listBoxWorkers.getItems();
private List<Resource> allResourcesShown() {
List<Resource> result = new ArrayList<Resource>();
List<Listitem> selectedItems = listBoxResources.getItems();
for (Listitem item : selectedItems) {
Worker worker = (Worker) item.getValue();
result.add(worker);
result.add((Resource) item.getValue());
}
return result;
}
@SuppressWarnings("unchecked")
private List<Worker> getSelectedWorkersOnListbox() {
List<Worker> result = new ArrayList<Worker>();
Set<Listitem> selectedItems = listBoxWorkers.getSelectedItems();
private List<Resource> getSelectedResourcesOnListbox() {
List<Resource> result = new ArrayList<Resource>();
Set<Listitem> selectedItems = listBoxResources.getSelectedItems();
for (Listitem item : selectedItems) {
Worker worker = (Worker) item.getValue();
result.add(worker);
result.add((Resource) item.getValue());
}
return result;
}
@ -300,7 +298,7 @@ public class NewAllocationSelectorController extends GenericForwardComposer {
* @return
*/
public TreeModel getCriterions() {
Map<CriterionType, Set<Criterion>> criterions = workerSearchModel
Map<CriterionType, Set<Criterion>> criterions = resourceSearchModel
.getCriterions();
List<CriterionTreeNode> rootList = new ArrayList<CriterionTreeNode>();
@ -353,30 +351,24 @@ public class NewAllocationSelectorController extends GenericForwardComposer {
}
/**
* Render for listBoxWorkers
*
* Render for listBoxResources
* @author Diego Pino García <dpino@igalia.com>
*
*/
private class WorkerListRenderer implements ListitemRenderer {
private class ResourceListRenderer implements ListitemRenderer {
@Override
public void render(Listitem item, Object data) throws Exception {
item.setValue((Worker) data);
item.setValue((Resource) data);
appendLabelWorker(item);
appendLabelResource(item);
}
private void appendLabelWorker(Listitem item) {
Worker worker = (Worker) item.getValue();
private void appendLabelResource(Listitem item) {
Resource resource = (Resource) item.getValue();
Listcell listWorker = new Listcell();
listWorker.appendChild(new Label(worker.getName()));
item.appendChild(listWorker);
Listcell listName = new Listcell();
listName.appendChild(new Label(worker.getNif()));
item.appendChild(listName);
Listcell cell = new Listcell();
cell.appendChild(new Label(resource.getShortDescription()));
item.appendChild(cell);
}
}

View file

@ -20,16 +20,22 @@
package org.navalplanner.web.resources.search;
import java.util.ArrayList;
import java.util.Collections;
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.StringUtils;
import org.navalplanner.business.resources.daos.ICriterionDAO;
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.CriterionType;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.business.resources.entities.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
@ -41,17 +47,23 @@ import org.springframework.transaction.annotation.Transactional;
/**
* @author Diego Pino Garcia <dpino@igalia.com>
*/
public class WorkerSearchModel implements IWorkerSearchModel {
public class ResourceSearchModel implements IResourceSearchModel {
@Autowired
private IWorkerDAO workerDAO;
@Autowired
private IMachineDAO machineDAO;
@Autowired
private IResourceDAO resourceDAO;
@Autowired
private ICriterionDAO criterionDAO;
@Override
@Transactional(readOnly = true)
public HashMap<CriterionType, Set<Criterion>> getCriterions() {
public Map<CriterionType, Set<Criterion>> getCriterions() {
HashMap<CriterionType, Set<Criterion>> result = new HashMap<CriterionType, Set<Criterion>>();
List<Criterion> criterions = criterionDAO.getAll();
@ -67,24 +79,54 @@ public class WorkerSearchModel implements IWorkerSearchModel {
@Override
@Transactional(readOnly = true)
public List<Worker> findWorkers(String name, List<Criterion> criterions) {
return workerDAO.findByNameAndCriterions(name, criterions);
public List<Resource> findResources(String name, List<Criterion> criterions) {
return findByNameAndCriterions(name, criterions);
}
@Override
@Transactional(readOnly = true)
public List<Worker> findWorkers(String name) {
return workerDAO.findByNameOrNif(name);
public List<Resource> findResources(String name) {
return findByNameAndCriterions(name, Collections
.<Criterion> emptyList());
}
public List<Worker> findByNameAndCriterions(String name,
private List<Resource> findByNameAndCriterions(String name,
List<Criterion> criterions) {
return workerDAO.findByNameAndCriterions(name, criterions);
final boolean emptyName = StringUtils.isEmpty(name);
if (criterions.isEmpty() && emptyName) {
return resourceDAO.list(Resource.class);
}
Set<Resource> resourcesMatchingCriterions = null;
if (!criterions.isEmpty()) {
resourcesMatchingCriterions = new HashSet<Resource>(resourceDAO
.findAllSatisfyingCriterions(criterions));
if (resourcesMatchingCriterions.isEmpty()) {
return new ArrayList<Resource>();
}
}
if (emptyName) {
return new ArrayList<Resource>(resourcesMatchingCriterions);
}
Set<Resource> result = intersect(workerDAO.findByNameOrNif(name),
resourcesMatchingCriterions);
result.addAll(intersect(machineDAO.findByNameOrCode(name),
resourcesMatchingCriterions));
return new ArrayList<Resource>(result);
}
private static Set<Resource> intersect(List<? extends Resource> all,
Set<Resource> filteringBy) {
if (filteringBy == null) {
return new HashSet<Resource>(all);
}
Set<Resource> result = new HashSet<Resource>(filteringBy);
result.retainAll(all);
return result;
}
@Override
@Transactional(readOnly = true)
public List<Worker> getAllWorkers() {
return workerDAO.getWorkers();
public List<Resource> getAllResources() {
return resourceDAO.getResources();
}
}

View file

@ -89,7 +89,7 @@
<tabbox mold="accordion">
<tabs>
<tab id="tbResourceAllocation" label="${i18n:_('Resource allocation')}" image="common/img/collapse.gif" />
<tab id="workerSearchTab" label="${i18n:_('Worker search')}" image="common/img/collapse.gif"/>
<tab id="workerSearchTab" label="${i18n:_('Resources search')}" image="common/img/collapse.gif"/>
</tabs>
<tabpanels>
<tabpanel>

View file

@ -49,18 +49,17 @@
<vbox style="margin-right: 3px">
<!-- Name -->
<label value="${i18n:_('Name/NIF')}" />
<label value="${i18n:_('Name/Code')}" />
<textbox id="txtName" width="200px" style="margin-bottom: 5px"
onChanging="selectorController.searchWorkers(event)" />
<!--Matchings -->
<label value="${i18n:_('Found workers')}"/>
<listbox id="listBoxWorkers" width="270px" rows="18"
<listbox id="listBoxResources" width="270px" rows="18"
vflex="true" multiple="true"
itemRenderer="@{selectorController.listitemRenderer}">
<listhead>
<listheader label="${i18n:_('Name')}" sort="auto" />
<listheader label="${i18n:_('NIF')}" sort="auto" />
<listheader label="${i18n:_('Description')}" sort="auto" />
</listhead>
</listbox>
</vbox>