org.unitime.timetable.action.AddNonUnivLocationAction.java Source code

Java tutorial

Introduction

Here is the source code for org.unitime.timetable.action.AddNonUnivLocationAction.java

Source

/*
 * UniTime 3.2 - 3.5 (University Timetabling Application)
 * Copyright (C) 2008 - 2013, UniTime LLC, and individual contributors
 * as indicated by the @authors tag.
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
*/
package org.unitime.timetable.action;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.util.LabelValueBean;
import org.apache.struts.util.MessageResources;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.unitime.timetable.defaults.ApplicationProperty;
import org.unitime.timetable.defaults.SessionAttribute;
import org.unitime.timetable.form.NonUnivLocationForm;
import org.unitime.timetable.model.ChangeLog;
import org.unitime.timetable.model.Department;
import org.unitime.timetable.model.Location;
import org.unitime.timetable.model.NonUniversityLocation;
import org.unitime.timetable.model.RoomDept;
import org.unitime.timetable.model.dao.NonUniversityLocationDAO;
import org.unitime.timetable.model.dao.RoomTypeDAO;
import org.unitime.timetable.model.dao.SessionDAO;
import org.unitime.timetable.security.SessionContext;
import org.unitime.timetable.security.rights.Right;
import org.unitime.timetable.util.LocationPermIdGenerator;

/** 
 * MyEclipse Struts
 * Creation date: 05-05-2006
 * 
 * XDoclet definition:
 * @struts.action path="/addNonUnivLocation" name="nonUnivLocationForm" input="/admin/addNonUnivLocation.jsp" scope="request" validate="true"
 *
 * @author Tomas Muller
 */
@Service("/addNonUnivLocation")
public class AddNonUnivLocationAction extends Action {

    // --------------------------------------------------------- Instance Variables

    // --------------------------------------------------------- Methods

    @Autowired
    SessionContext sessionContext;

    /** 
     * Method execute
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception 
     */
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        NonUnivLocationForm nonUnivLocationForm = (NonUnivLocationForm) form;
        MessageResources rsc = getResources(request);
        ActionMessages errors = new ActionMessages();

        sessionContext.checkPermission(Right.AddNonUnivLocation);

        Set<Department> departments = Department.getUserDepartments(sessionContext.getUser());

        if (nonUnivLocationForm.getDoit() != null) {
            String doit = nonUnivLocationForm.getDoit();
            if (doit.equals(rsc.getMessage("button.returnToRoomList"))) {
                return mapping.findForward("showRoomList");
            }
            if (doit.equals(rsc.getMessage("button.addNew"))) {
                // Validate input prefs
                errors = nonUnivLocationForm.validate(mapping, request);

                if (errors.isEmpty() && !sessionContext.hasPermission(nonUnivLocationForm.getDeptCode(),
                        "Department", Right.AddNonUnivLocation)) {
                    errors.add("nonUniversityLocation", new ActionMessage("errors.generic", "Acess denied."));
                }

                // No errors
                if (errors.size() == 0) {
                    update(request, nonUnivLocationForm);
                    return mapping.findForward("showRoomList");
                } else {
                    setDepts(request, departments);
                    saveErrors(request, errors);
                    return mapping.findForward("showAdd");
                }
            }
        }

        setDepts(request, departments);

        nonUnivLocationForm.setDeptSize(departments.size());
        if (departments.size() == 1) {
            Department d = departments.iterator().next();
            nonUnivLocationForm.setDeptCode(d.getDeptCode());
        } else if (sessionContext.getAttribute(SessionAttribute.DepartmentCodeRoom) != null) {
            nonUnivLocationForm
                    .setDeptCode((String) sessionContext.getAttribute(SessionAttribute.DepartmentCodeRoom));
        }

        return mapping.findForward("showAdd");
    }

    /**
     * 
     * @param request
     * @param nonUnivLocationForm
     * @throws Exception
     */
    private void update(HttpServletRequest request, NonUnivLocationForm nonUnivLocationForm) throws Exception {

        org.hibernate.Session hibSession = (new NonUniversityLocationDAO()).getSession();
        Transaction tx = null;
        try {
            tx = hibSession.beginTransaction();
            NonUniversityLocation nonUniv = new NonUniversityLocation();

            nonUniv.setSession(
                    SessionDAO.getInstance().get(sessionContext.getUser().getCurrentAcademicSessionId()));

            if (nonUnivLocationForm.getName() != null
                    && !nonUnivLocationForm.getName().trim().equalsIgnoreCase("")) {
                nonUniv.setName(nonUnivLocationForm.getName());
            }

            if (nonUnivLocationForm.getCapacity() != null
                    && !nonUnivLocationForm.getCapacity().trim().equalsIgnoreCase("")) {
                nonUniv.setCapacity(Integer.valueOf(nonUnivLocationForm.getCapacity()));
            }

            nonUniv.setIgnoreTooFar(Boolean.valueOf(nonUnivLocationForm.isIgnoreTooFar()));
            nonUniv.setIgnoreRoomCheck(Boolean.valueOf(nonUnivLocationForm.isIgnoreRoomCheck()));

            nonUniv.setCoordinateX(
                    nonUnivLocationForm.getCoordX() == null || nonUnivLocationForm.getCoordX().length() == 0 ? null
                            : Double.valueOf(nonUnivLocationForm.getCoordX()));
            nonUniv.setCoordinateY(
                    nonUnivLocationForm.getCoordY() == null || nonUnivLocationForm.getCoordY().length() == 0 ? null
                            : Double.valueOf(nonUnivLocationForm.getCoordY()));

            if (nonUnivLocationForm.getExternalId() != null && !nonUnivLocationForm.getExternalId().isEmpty())
                nonUniv.setExternalUniqueId(nonUnivLocationForm.getExternalId());

            Double area = null;
            if (nonUnivLocationForm.getArea() != null && !nonUnivLocationForm.getArea().isEmpty()) {
                try {
                    area = new DecimalFormat(ApplicationProperty.RoomAreaUnitsFormat.value())
                            .parse(nonUnivLocationForm.getArea()).doubleValue();
                } catch (NumberFormatException e) {
                }
            }
            nonUniv.setArea(area);

            nonUniv.setFeatures(new HashSet());
            nonUniv.setAssignments(new HashSet());
            nonUniv.setRoomGroups(new HashSet());
            nonUniv.setRoomDepts(new HashSet());
            nonUniv.setExamCapacity(0);
            nonUniv.setRoomType(RoomTypeDAO.getInstance().get(nonUnivLocationForm.getType()));

            LocationPermIdGenerator.setPermanentId(nonUniv);

            hibSession.saveOrUpdate(nonUniv);

            //set room department for location
            RoomDept rd = new RoomDept();
            rd.setRoom(nonUniv);
            rd.setControl(Boolean.TRUE);

            Department d = Department.findByDeptCode(nonUnivLocationForm.getDeptCode(),
                    sessionContext.getUser().getCurrentAcademicSessionId(), hibSession);
            rd.setDepartment(d);

            hibSession.saveOrUpdate(rd);

            nonUniv.getRoomDepts().add(rd);
            hibSession.saveOrUpdate(nonUniv);

            ChangeLog.addChange(hibSession, sessionContext, (Location) nonUniv, ChangeLog.Source.ROOM_EDIT,
                    ChangeLog.Operation.CREATE, null, d);

            tx.commit();

            hibSession.refresh(d);
        } catch (Exception e) {
            if (tx != null)
                tx.rollback();
            throw e;
        }
    }

    /**
     * 
     * @param request
     * @param nonUnivLocationForm 
     * @throws Exception
     */
    private void setDepts(HttpServletRequest request, Set<Department> departments) throws Exception {
        List<LabelValueBean> list = new ArrayList<LabelValueBean>();
        for (Department d : departments) {
            String code = d.getDeptCode().trim();
            String abbv = d.getName().trim();
            list.add(new LabelValueBean(code + " - " + abbv, code));
        }

        request.setAttribute(Department.DEPT_ATTR_NAME, list);
    }

}