de.terrestris.shogun.model.Group.java Source code

Java tutorial

Introduction

Here is the source code for de.terrestris.shogun.model.Group.java

Source

/* Copyright (c) 2012-2014, terrestris GmbH & Co. KG
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. Neither the name of the copyright holder nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * (This is the BSD 3-Clause, sometimes called 'BSD New' or 'BSD Simplified',
 * see http://opensource.org/licenses/BSD-3-Clause)
 */
package de.terrestris.shogun.model;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import de.terrestris.shogun.dao.DatabaseDao;
import de.terrestris.shogun.serializer.LeanBaseModelSetSerializer;

/**
 * Group POJO
 *
 * @author terrestris GmbH & Co. KG
 *
 * TODO check for the deprecated org.hibernate.cache.CacheConcurrencyStrategy;
 *
 */
@JsonAutoDetect
@Entity
@Table(name = "TBL_GROUP")
@Embeddable
public class Group extends BaseModel {

    // TODO refactor as an enum
    public static final String ROLENAME_SUPERADMIN = "ROLE_SUPERADMIN";
    public static final String ROLENAME_USER = "ROLE_USER";
    public static final String ROLENAME_ADMIN = "ROLE_ADMIN";
    public static final String ROLENAME_ANONYMOUS = "ROLE_ANONYMOUS";

    /**
     * These roles will be assigned for new groups when they do not have
     * roles already. This Set isn't applied in a constructor, but when
     * creating instances of the Group-class e.g. in the service.
     */
    public static final Set<String> DEFAULT_ROLENAMES = new HashSet<String>(
            Arrays.asList(ROLENAME_USER, ROLENAME_ANONYMOUS));

    public static final String DEFAULT_ADMIN_GROUP = "default-admin-group";
    public static final String DEFAULT_USER_GROUP = "default-user-group";

    private String name;
    private String group_nr;
    private String company;
    private String street;
    private String housenumber;
    private String country;
    private String contact_salutation;
    private String contact_firstname;
    private String contact_name;
    private String contact_position;
    private String phone1;
    private String phone2;
    private String fax;
    private String mail;
    private String url;
    private String notes;
    private String language;

    private Set<User> users;
    private Set<Module> modules;
    private Set<MapLayer> mapLayers;
    private Set<Role> roles;

    private String group_module_list;
    private Set<Integer> grantedUsers;
    private Set<Integer> grantedMapLayers;

    private boolean deletable;

    /**
     *
     */
    public Group() {
        super();
        this.setUsers(new HashSet<User>());
    }

    /**
     * @return the name
     */
    @Column(name = "NAME")
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the group_nr
     */
    @Column(name = "GROUP_NR", nullable = false, unique = true)
    public String getGroup_nr() {
        return group_nr;
    }

    /**
     * @param group_nr the group_nr to set
     */
    public void setGroup_nr(String group_nr) {
        this.group_nr = group_nr;
    }

    /**
     * @return the company
     */
    @Column(name = "COMPANY", nullable = false)
    public String getCompany() {
        return company;
    }

    /**
     * @param company the company to set
     */
    public void setCompany(String company) {
        this.company = company;
    }

    /**
     * @return the street
     */
    @Column(name = "STREET", length = 80)
    public String getStreet() {
        return street;
    }

    /**
     * @param street the street to set
     */
    public void setStreet(String street) {
        this.street = street;
    }

    /**
     * @return the housenumber
     */
    @Column(name = "HOUSENUMBER", length = 10)
    public String getHousenumber() {
        return housenumber;
    }

    /**
     * @param housenumber the housenumber to set
     */
    public void setHousenumber(String housenumber) {
        this.housenumber = housenumber;
    }

    /**
     * @return the country
     */
    @Column(name = "COUNTRY", length = 100)
    public String getCountry() {
        return country;
    }

    /**
     * @param country the country to set
     */
    public void setCountry(String country) {
        this.country = country;
    }

    /**
     * @return the contact_salutation
     */
    @Column(name = "CONTACT_SALUTATION", length = 80)
    public String getContact_salutation() {
        return contact_salutation;
    }

    /**
     * @param contact_salutation the contact_salutation to set
     */
    public void setContact_salutation(String contact_salutation) {
        this.contact_salutation = contact_salutation;
    }

    /**
     * @return the contact_firstname
     */
    @Column(name = "CONTACT_FIRSTNAME")
    public String getContact_firstname() {
        return contact_firstname;
    }

    /**
     * @param contact_firstname the contact_firstname to set
     */
    public void setContact_firstname(String contact_firstname) {
        this.contact_firstname = contact_firstname;
    }

    /**
     * @return the contact_name
     */
    @Column(name = "CONTACT_NAME")
    public String getContact_name() {
        return contact_name;
    }

    /**
     * @param contact_name the contact_name to set
     */
    public void setContact_name(String contact_name) {
        this.contact_name = contact_name;
    }

    /**
     * @return the contact_position
     */
    @Column(name = "CONTACT_POSITION")
    public String getContact_position() {
        return contact_position;
    }

    /**
     * @param contact_position the contact_position to set
     */
    public void setContact_position(String contact_position) {
        this.contact_position = contact_position;
    }

    /**
     * @return the phone1
     */
    @Column(name = "PHONE1", length = 100)
    public String getPhone1() {
        return phone1;
    }

    /**
     * @param phone1 the phone1 to set
     */
    public void setPhone1(String phone1) {
        this.phone1 = phone1;
    }

    /**
     * @return the phone2
     */
    @Column(name = "PHONE2", length = 100)
    public String getPhone2() {
        return phone2;
    }

    /**
     * @param phone2 the phone2 to set
     */
    public void setPhone2(String phone2) {
        this.phone2 = phone2;
    }

    /**
     * @return the fax
     */
    @Column(name = "FAX", length = 100)
    public String getFax() {
        return fax;
    }

    /**
     * @param fax the fax to set
     */
    public void setFax(String fax) {
        this.fax = fax;
    }

    /**
     * @return the mail
     */
    @Column(name = "MAIL")
    public String getMail() {
        return mail;
    }

    /**
     * @param mail the mail to set
     */
    public void setMail(String mail) {
        this.mail = mail;
    }

    /**
     * @return the url
     */
    @Column(name = "URL", length = 1000)
    public String getUrl() {
        return url;
    }

    /**
     * @param url the url to set
     */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
     * @return the notes
     */
    @Column(name = "NOTES", length = 1024)
    public String getNotes() {
        return notes;
    }

    /**
     * @param notes the notes to set
     */
    public void setNotes(String notes) {
        this.notes = notes;
    }

    /**
     * @return the language
     */
    public String getLanguage() {
        return language;
    }

    /**
     * @param language the language to set
     */
    public void setLanguage(String language) {
        this.language = language;
    }

    /**
     * @return the users
     */
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "TBL_GROUP_TBL_USER", joinColumns = {
            @JoinColumn(name = "GROUP_FK", nullable = true, updatable = false) }, inverseJoinColumns = {
                    @JoinColumn(name = "USER_FK", nullable = true, updatable = false) })
    @Fetch(FetchMode.SUBSELECT)
    @JsonSerialize(using = LeanBaseModelSetSerializer.class)
    public Set<User> getUsers() {
        return users;
    }

    /**
     * @param users the users to set
     */
    public void setUsers(Set<User> users) {
        this.users = users;
    }

    /**
     * @return the modules
     */
    @ManyToMany(fetch = FetchType.LAZY, targetEntity = Module.class)
    @JoinTable(name = "TBL_GROUP_TBL_MODULE", joinColumns = {
            @JoinColumn(name = "GROUP_ID", nullable = false, updatable = false) }, inverseJoinColumns = {
                    @JoinColumn(name = "MODULE_ID", nullable = false, updatable = false) })
    @Fetch(FetchMode.SUBSELECT)
    @JsonSerialize(using = LeanBaseModelSetSerializer.class)
    public Set<Module> getModules() {
        return modules;
    }

    /**
     * @param modules the modules to set
     */
    public void setModules(Set<Module> modules) {
        this.modules = modules;
    }

    /**
     * @return the mapLayers
     */
    @ManyToMany(fetch = FetchType.EAGER, targetEntity = MapLayer.class)
    @JoinTable(name = "TBL_GROUP_TBL_MAPLAYER", joinColumns = {
            @JoinColumn(name = "GROUP_ID", nullable = false, updatable = false) }, inverseJoinColumns = {
                    @JoinColumn(name = "MAPLAYER_ID", nullable = false, updatable = false) })
    @Fetch(FetchMode.JOIN)
    @JsonSerialize(using = LeanBaseModelSetSerializer.class)
    public Set<MapLayer> getMapLayers() {
        return mapLayers;
    }

    /**
     * @param mapLayers the mapLayers to set
     */
    public void setMapLayers(Set<MapLayer> mapLayers) {
        this.mapLayers = mapLayers;
    }

    /**
     * @return the roles
     */
    @ManyToMany(fetch = FetchType.EAGER, targetEntity = Role.class)
    @JoinTable(name = "TBL_GROUP_TBL_ROLE", joinColumns = {
            @JoinColumn(name = "GROUP_ID", nullable = false, updatable = false) }, inverseJoinColumns = {
                    @JoinColumn(name = "ROLE_ID", nullable = false, updatable = false) })
    @Fetch(FetchMode.SUBSELECT)
    @JsonSerialize(using = LeanBaseModelSetSerializer.class)
    public Set<Role> getRoles() {
        return roles;
    }

    /**
     * @param roles the roles to set
     */
    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

    /**
     * @return the group_module_list
     */
    public String getGroup_module_list() {
        return group_module_list;
    }

    /**
     * @param group_module_list the group_module_list to set
     */
    public void setGroup_module_list(String group_module_list) {
        this.group_module_list = group_module_list;
    }

    /**
     * @return the deletable
     */
    public boolean isDeletable() {
        return deletable;
    }

    /**
     * @param deletable the deletable to set
     */
    public void setDeletable(boolean deletable) {
        this.deletable = deletable;
    }

    /**
     * @return the grantedUsers
     */
    @Transient
    public Set<Integer> getGrantedUsers() {
        return grantedUsers;
    }

    /**
     * @param grantedUsers the grantedUsers to set
     */
    @Transient
    public void setGrantedUsers(Set<Integer> grantedUsers) {
        this.grantedUsers = grantedUsers;
    }

    /**
     * @return the grantedMapLayers
     */
    @Transient
    public Set<Integer> getGrantedMapLayers() {
        return grantedMapLayers;
    }

    /**
     * @param grantedMapLayers the grantedMapLayers to set
     */
    @Transient
    public void setGrantedMapLayers(Set<Integer> grantedMapLayers) {
        this.grantedMapLayers = grantedMapLayers;
    }

    /**
     * The method transforms the comma-separated list of module IDs stored in
     * the member variable <i>user_module_list</i> into a list with
     * {@link Module} objects. This list is set to the <i>modules</i> variable
     * of the calling {@link Group} instance
     *
     * @param databaseDAO a {@link DatabaseDao} instance in order to access the database
     */
    public void transformSimpleModuleListToModuleObjects(DatabaseDao databaseDAO) {

        // create Module object list from comma separated string (user_module_list)
        List<Module> newModules = null;
        if (this.getGroup_module_list() != null && this.getGroup_module_list().equals("") == false) {

            // split the comma-separated list and make an Array of Integer
            String[] moduleIdArray = this.getGroup_module_list().split(",");
            List<Integer> intArray = new ArrayList<Integer>();
            for (int i = 0; i < moduleIdArray.length; i++) {
                Integer inte = new Integer(moduleIdArray[i]);
                intArray.add(inte);
            }

            // get the module objects from the database
            List<? extends Object> modules = databaseDAO.getEntitiesByIds(intArray.toArray(), Module.class);

            // iterate to cast the returned Objects to Module
            newModules = new ArrayList<Module>(modules.size());
            for (Iterator<?> iterator2 = modules.iterator(); iterator2.hasNext();) {
                Module module = (Module) iterator2.next();
                newModules.add(module);
            }

            modules = null;

        } else {

            // return an empty list
            newModules = new ArrayList<Module>();
        }

        newModules = null;
    }

    /**
     * @see java.lang.Object#hashCode()
     *
     * According to
     * http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java
     * it is recommended only to use getter-methods when using ORM like Hibernate
     */
    @Override
    public int hashCode() {
        return new HashCodeBuilder(7, 17). // two randomly chosen prime numbers
                appendSuper(super.hashCode()).append(getName()).toHashCode();
    }

    /**
     * @see java.lang.Object#equals(java.lang.Object)
     *
     * According to
     * http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java
     * it is recommended only to use getter-methods when using ORM like Hibernate
     */
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Group))
            return false;
        Group other = (Group) obj;

        return new EqualsBuilder().appendSuper(super.equals(other)).append(getName(), other.getName()).isEquals();
    }

    /**
     *
     */
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).appendSuper(super.toString())
                .append("name", name).append("group_nr", group_nr).toString();
    }

}