sernet.gs.ui.rcp.main.service.taskcommands.LoadChildrenAndMassnahmen.java Source code

Java tutorial

Introduction

Here is the source code for sernet.gs.ui.rcp.main.service.taskcommands.LoadChildrenAndMassnahmen.java

Source

/*******************************************************************************
 * Copyright (c) 2009 Daniel Murygin <dm[at]sernet[dot]de>.
 * This program is free software: you can redistribute it and/or 
 * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
 *     You should have received a copy of the GNU Lesser General Public 
 * License along with this program. 
 * If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     
 ******************************************************************************/
package sernet.gs.ui.rcp.main.service.taskcommands;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;

import sernet.gs.service.RuntimeCommandException;
import sernet.gs.ui.rcp.main.bsi.model.TodoViewItem;
import sernet.verinice.interfaces.CommandException;
import sernet.verinice.interfaces.GenericCommand;
import sernet.verinice.interfaces.IBaseDao;
import sernet.verinice.model.bsi.Anwendung;
import sernet.verinice.model.bsi.Client;
import sernet.verinice.model.bsi.Gebaeude;
import sernet.verinice.model.bsi.ITVerbund;
import sernet.verinice.model.bsi.MassnahmenUmsetzung;
import sernet.verinice.model.bsi.NetzKomponente;
import sernet.verinice.model.bsi.Person;
import sernet.verinice.model.bsi.Raum;
import sernet.verinice.model.bsi.Server;
import sernet.verinice.model.bsi.SonstIT;
import sernet.verinice.model.bsi.TelefonKomponente;
import sernet.verinice.model.bsi.risikoanalyse.GefaehrdungsUmsetzung;
import sernet.verinice.model.common.CnATreeElement;

/**
 * 
 * @author Daniel Murygin <dm[at]sernet[dot]de>
 * 
 */
@SuppressWarnings("serial")
public class LoadChildrenAndMassnahmen extends GenericCommand implements ILoadChildren {

    private static final Logger LOG = Logger.getLogger(LoadChildrenAndMassnahmen.class);

    private final Comparator<CnATreeElement> cnAComparator = new CnAComparator();

    private static final int MASSNAHMEN_LIST_SIZE = 20;
    private static final int DEFAULT_LIST_SIZE = 10;

    private Set<TodoViewItem> massnahmen = new HashSet<TodoViewItem>(MASSNAHMEN_LIST_SIZE);

    private List<CnATreeElement> gebaeudeList = new ArrayList<CnATreeElement>(DEFAULT_LIST_SIZE);
    private List<CnATreeElement> raumList = new ArrayList<CnATreeElement>(DEFAULT_LIST_SIZE);
    private List<CnATreeElement> clienteList = new ArrayList<CnATreeElement>(DEFAULT_LIST_SIZE);
    private List<CnATreeElement> serverList = new ArrayList<CnATreeElement>(DEFAULT_LIST_SIZE);
    private List<CnATreeElement> netzList = new ArrayList<CnATreeElement>(DEFAULT_LIST_SIZE);
    private List<CnATreeElement> anwendungList = new ArrayList<CnATreeElement>(DEFAULT_LIST_SIZE);
    private List<CnATreeElement> personList = new ArrayList<CnATreeElement>(DEFAULT_LIST_SIZE);
    private List<CnATreeElement> tkKomponenteList = new ArrayList<CnATreeElement>(DEFAULT_LIST_SIZE);
    private List<CnATreeElement> sonstItList = new ArrayList<CnATreeElement>(DEFAULT_LIST_SIZE);

    private Set<UnresolvedItem> unresolvedItems = new HashSet<UnresolvedItem>();

    private Integer id = null;

    private Set<String> executionSet;

    private Set<String> sealSet;

    @SuppressWarnings("serial")
    private class LoadChildrenAndMassnahmenCallback implements HibernateCallback, Serializable {

        private Integer id;

        LoadChildrenAndMassnahmenCallback(Integer id) {
            this.id = id;
        }

        public Object doInHibernate(Session session) throws HibernateException, SQLException {

            Query query = session.createQuery(
                    "from CnATreeElement el " + "join fetch el.children.children.entity " + "where el.dbId = :id ");
            query.setReadOnly(true);
            return query.list();
        }

    }

    public LoadChildrenAndMassnahmen() {
    }

    public LoadChildrenAndMassnahmen(Integer dbId) {
        this.id = dbId;
    }

    /* (non-Javadoc)
     * @see sernet.gs.ui.rcp.main.service.taskcommands.ILoadChildren#execute()
     */
    public void execute() {
        try {
            long start = System.currentTimeMillis();
            List<CnATreeElement> list = null;
            IBaseDao<ITVerbund, Serializable> dao = getDaoFactory().getDAO(ITVerbund.class);
            DetachedCriteria crit = DetachedCriteria.forClass(CnATreeElement.class);
            crit.add(Restrictions.eq("dbId", id));
            crit.setFetchMode("children", FetchMode.JOIN);
            crit.setFetchMode("children.children", FetchMode.JOIN);
            crit.setFetchMode("children.children.entity", FetchMode.JOIN);
            crit.setFetchMode("children.children.entity.typedPropertyLists", FetchMode.JOIN);
            crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
            list = dao.findByCriteria(crit);
            if (list != null && list.size() > 0) {
                // create display items:
                fillLists(list.get(0));
            }
            if (LOG.isDebugEnabled()) {
                long runtime = System.currentTimeMillis() - start;
                LOG.debug("FindMassnahmenForITVerbund runtime: " + runtime + " ms.");
            }
        } catch (CommandException e) {
            throw new RuntimeCommandException(e);
        }
    }

    /**
     * Initialize lazy loaded field values needed for the view.
     * 
     * @param all
     * @throws CommandException
     */
    private void fillLists(CnATreeElement el) throws CommandException {
        for (CnATreeElement cl : el.getChildren()) {
            for (CnATreeElement clcl : cl.getChildren()) {
                if (clcl instanceof MassnahmenUmsetzung) {
                    TodoViewItem item = createToDoItem((MassnahmenUmsetzung) clcl);
                    if (item != null) {
                        massnahmen.add(item);
                    }
                } else {
                    hydrate(clcl);
                    String entityTypeId = clcl.getTypeId();
                    if (Anwendung.TYPE_ID.equals(entityTypeId)) {
                        anwendungList.add(clcl);
                    } else if (Client.TYPE_ID.equals(entityTypeId)) {
                        clienteList.add(clcl);
                    } else if (Gebaeude.TYPE_ID.equals(entityTypeId)) {
                        gebaeudeList.add(clcl);
                    } else if (Person.TYPE_ID.equals(entityTypeId)) {
                        personList.add(clcl);
                    } else if (NetzKomponente.TYPE_ID.equals(entityTypeId)) {
                        netzList.add(clcl);
                    } else if (Raum.TYPE_ID.equals(entityTypeId)) {
                        raumList.add(clcl);
                    } else if (Server.TYPE_ID.equals(entityTypeId)) {
                        serverList.add(clcl);
                    } else if (TelefonKomponente.TYPE_ID.equals(entityTypeId)) {
                        tkKomponenteList.add(clcl);
                    } else if (SonstIT.TYPE_ID.equals(entityTypeId)) {
                        sonstItList.add(clcl);
                    } else {
                        LOG.error("Unknown object type: " + entityTypeId);
                    }
                }
            }
        }

        Collections.sort(anwendungList, cnAComparator);
        Collections.sort(clienteList, cnAComparator);
        Collections.sort(gebaeudeList, cnAComparator);
        Collections.sort(personList, cnAComparator);
        Collections.sort(netzList, cnAComparator);
        Collections.sort(raumList, cnAComparator);
        Collections.sort(serverList, cnAComparator);
        Collections.sort(tkKomponenteList, cnAComparator);
        Collections.sort(sonstItList, cnAComparator);

        // find persons according to roles and relation:
        FindResponsiblePersons command = new FindResponsiblePersons(unresolvedItems,
                MassnahmenUmsetzung.P_VERANTWORTLICHE_ROLLEN_UMSETZUNG);
        command = this.getCommandService().executeCommand(command);
        unresolvedItems = command.getResolvedItems();
        for (UnresolvedItem resolvedItem : unresolvedItems) {
            massnahmen.add(resolvedItem.getItem());
        }

    }

    private TodoViewItem createToDoItem(MassnahmenUmsetzung el) {
        String umsetzung = el.getUmsetzung();
        String siegelStufe = String.valueOf(el.getStufe());
        TodoViewItem item = null;
        if ((getExecutionSet() == null || getExecutionSet().contains(umsetzung))
                && (getSealSet() == null || getSealSet().contains(siegelStufe))) {

            item = new TodoViewItem();

            if (el.getParent() instanceof GefaehrdungsUmsetzung) {
                item.setParentTitle(el.getParent().getParent().getParent().getTitle());
            } else {
                item.setParentTitle(el.getParent().getParent().getTitle());
            }
            item.setTitel(el.getTitle());
            item.setUmsetzung(umsetzung);
            item.setUmsetzungBis(el.getUmsetzungBis());
            item.setNaechsteRevision(el.getNaechsteRevision());
            item.setRevisionDurch(el.getRevisionDurch());

            item.setStufe(siegelStufe.charAt(0));
            item.setUrl(el.getUrl());
            item.setStand(el.getStand());
            item.setDbId(el.getDbId());

            if (el.getUmsetzungDurch() != null && el.getUmsetzungDurch().length() > 0) {
                item.setUmsetzungDurch(el.getUmsetzungDurch());
                massnahmen.add(item);
            } else {
                unresolvedItems.add(new UnresolvedItem(item, el));
            }
        }
        return item;
    }

    public void hydrate(CnATreeElement el) {
        el.getTitle();
    }

    public Set<TodoViewItem> getMassnahmen() {
        return massnahmen;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    /* (non-Javadoc)
     * @see sernet.gs.ui.rcp.main.service.taskcommands.ILoadChildren#getGebaeudeList()
     */
    public List<CnATreeElement> getGebaeudeList() {
        return gebaeudeList;
    }

    public void setGebaeudeList(List<CnATreeElement> gebaeudeList) {
        this.gebaeudeList = gebaeudeList;
    }

    /* (non-Javadoc)
     * @see sernet.gs.ui.rcp.main.service.taskcommands.ILoadChildren#getRaumList()
     */
    public List<CnATreeElement> getRaumList() {
        return raumList;
    }

    public void setRaumList(List<CnATreeElement> raumList) {
        this.raumList = raumList;
    }

    /* (non-Javadoc)
     * @see sernet.gs.ui.rcp.main.service.taskcommands.ILoadChildren#getClienteList()
     */
    public List<CnATreeElement> getClienteList() {
        return clienteList;
    }

    public void setClienteList(List<CnATreeElement> clienteList) {
        this.clienteList = clienteList;
    }

    /* (non-Javadoc)
     * @see sernet.gs.ui.rcp.main.service.taskcommands.ILoadChildren#getServerList()
     */
    public List<CnATreeElement> getServerList() {
        return serverList;
    }

    public void setServerList(List<CnATreeElement> serverList) {
        this.serverList = serverList;
    }

    /* (non-Javadoc)
     * @see sernet.gs.ui.rcp.main.service.taskcommands.ILoadChildren#getNetzList()
     */
    public List<CnATreeElement> getNetzList() {
        return netzList;
    }

    public void setNetzList(List<CnATreeElement> netzList) {
        this.netzList = netzList;
    }

    /* (non-Javadoc)
     * @see sernet.gs.ui.rcp.main.service.taskcommands.ILoadChildren#getAnwendungList()
     */
    public List<CnATreeElement> getAnwendungList() {
        return anwendungList;
    }

    public void setAnwendungList(List<CnATreeElement> anwendungList) {
        this.anwendungList = anwendungList;
    }

    /* (non-Javadoc)
     * @see sernet.gs.ui.rcp.main.service.taskcommands.ILoadChildren#getPersonList()
     */
    public List<CnATreeElement> getPersonList() {
        return personList;
    }

    public void setPersonList(List<CnATreeElement> personList) {
        this.personList = personList;
    }

    public List<CnATreeElement> getTkKomponenteList() {
        return tkKomponenteList;
    }

    public List<CnATreeElement> getSonstItList() {
        return sonstItList;
    }

    public void setMassnahmen(Set<TodoViewItem> massnahmen) {
        this.massnahmen = massnahmen;
    }

    public Set<String> getExecutionSet() {
        return executionSet;
    }

    public void setExecutionSet(Set<String> umsetzungSet) {
        this.executionSet = umsetzungSet;
    }

    public Set<String> getSealSet() {
        return sealSet;
    }

    public void setSealSet(Set<String> sealSet) {
        this.sealSet = sealSet;
    }

    public class CnAComparator implements Comparator<CnATreeElement> {

        /* (non-Javadoc)
         * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
         */
        public int compare(CnATreeElement o1, CnATreeElement o2) {
            int result = -1;
            if (o1 != null && o1.getTitle() != null) {
                if (o2 == null || o2.getTitle() == null) {
                    result = 1;
                } else {
                    result = o1.getTitle().compareTo(o2.getTitle());
                }
            } else if (o2 == null || o2.getTitle() == null) {
                result = 0;
            }
            return result;
        }

    }

}