Package org.springmodules.xt.examples.domain

Source Code of org.springmodules.xt.examples.domain.MemoryRepository

package org.springmodules.xt.examples.domain;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.springmodules.xt.examples.domain.codes.OfficeErrorCodes;
import org.springmodules.xt.examples.domain.util.DomainUtils;
import org.springmodules.xt.model.notification.Message;
import org.springmodules.xt.model.notification.MessageImpl;
import org.springmodules.xt.model.notification.Notification;
import org.springmodules.xt.model.notification.NotificationImpl;
import org.springmodules.xt.model.specifications.composite.CompositeSpecification;
import org.springmodules.xt.model.specifications.composite.CompositeSpecificationImpl;

/**
* In memory store.
*
* @author Sergio Bossa
*/
public class MemoryRepository {
   
    private MemoryRepositoryLoader loader;
   
    private Map<String, IEmployee> employeesMap = new HashMap<String, IEmployee>();
    private Map<String, IOffice> officesMap = new HashMap<String, IOffice>();
   
    private CompositeSpecification<BaseSpecification, IOffice> officeSpecification = new CompositeSpecificationImpl(BaseSpecification.class, "isSatisfiedBy");
   
    public MemoryRepository() {
        this.setRules();
    }
   
    public void init() {
        this.loader.loadInto(this);
    }
   
    public void addEmployee(IEmployee e) {
        this.internalAddEmployee(e);
        for (IOffice o : this.officesMap.values()) {
            if (o.getEmployees().contains(e)) {
                o.addEmployee(e);
            }
        }
    }
   
    public void addOffice(IOffice o) {
        this.internalAddOffice(o);
        for (IEmployee emp : o.getEmployees()) {
            this.internalAddEmployee(emp);
        }
    }
   
    public IEmployee getEmployee(String matriculationCode) {
        IEmployee result = employeesMap.get(matriculationCode);
        if (result != null) {
            return result.copy();
        }
        else {
            return null;
        }
    }
   
    public IOffice getOffice(String officeId) {
        IOffice result = officesMap.get(officeId);
        if (result != null) {
            return result.copy();
        }
        else {
            return null;
        }
    }
   
    public Collection<IOffice> getOffices() {
        List<IOffice> result = new LinkedList<IOffice>(officesMap.values());
        Collections.sort(result, new Comparator() {
            public int compare(Object o1, Object o2) {
                IOffice office1 = (IOffice) o1;
                IOffice office2 = (IOffice) o2;
                return office1.getName().compareTo(office2.getName());
            }
        });
        return this.copyOfficeList(result);
    }
   
    public Collection<IEmployee> getEmployeesByOffice(IOffice o) {
        List<IEmployee> result = new LinkedList<IEmployee>();
        for (IEmployee e : employeesMap.values()) {
            if (o.getEmployees().contains(e)) {
                result.add(e);
            }
        }
        Collections.sort(result, new Comparator() {
            public int compare(Object o1, Object o2) {
                IEmployee emp1 = (IEmployee) o1;
                IEmployee emp2 = (IEmployee) o2;
                return emp1.getSurname().compareTo(emp2.getSurname());
            }
        });
        return this.copyEmployeeList(result);
    }
   
    public Collection<IEmployee> getEmployees() {
        Collection<IEmployee> employees = this.employeesMap.values();
        List<IEmployee> result = new LinkedList<IEmployee>(employees);
        Collections.sort(result, new Comparator() {
            public int compare(Object o1, Object o2) {
                IEmployee emp1 = (IEmployee) o1;
                IEmployee emp2 = (IEmployee) o2;
                return emp1.getSurname().compareTo(emp2.getSurname());
            }
        });
        return this.copyEmployeeList(result);
    }

    public void setLoader(MemoryRepositoryLoader loader) {
        this.loader = loader;
    }
   
    private void setRules() {
        OfficeIdSpecification idSpecification = new OfficeIdSpecification();
        FullOfficeSpecification fullOfficeSpecification = new FullOfficeSpecification();
        Message wrongIdMessage = new MessageImpl(OfficeErrorCodes.WRONG_ID, Message.Type.ERROR, "officeId" ,"Wrong office id");
        Message fullOfficeMessage = new MessageImpl(OfficeErrorCodes.FULL, Message.Type.ERROR, "employees", "Too many employees");
       
        this.officeSpecification.compose(idSpecification).withMessage(wrongIdMessage, false)
                                           .andNot(fullOfficeSpecification).withMessage(fullOfficeMessage, true);
    }
   
    private Collection<IEmployee> copyEmployeeList(Collection<IEmployee> list) {
        Collection<IEmployee> copy = new LinkedList<IEmployee>();
        for (IEmployee emp : list) {
            copy.add(emp.copy());
        }
        return copy;
    }
   
    private Collection<IOffice> copyOfficeList(Collection<IOffice> list) {
        Collection<IOffice> copy = new LinkedList<IOffice>();
        for (IOffice office : list) {
            copy.add(office.copy());
        }
        return copy;
    }
   
    private void internalAddOffice(IOffice o) {
        Notification n = new NotificationImpl();
        if (this.officeSpecification.evaluate(o, n) == false) {
            BusinessException ex = DomainUtils.notificationErrorsToBusinessException(n);
            throw ex;
        }
        else {
            this.officesMap.put(o.getOfficeId(), o);
        }
    }
   
    private void internalAddEmployee(IEmployee e) {
        this.employeesMap.put(e.getMatriculationCode(), e);
    }
}
TOP

Related Classes of org.springmodules.xt.examples.domain.MemoryRepository

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.