ref #8162 adapt cdmlip to new term package structure
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / common / Group.java
index 52dd239a2138ef949564356b19d91c73c1c23b76..bc6507bf0b2d53a7defd4729af7a4607c7423d41 100644 (file)
-package eu.etaxonomy.cdm.model.common;\r
-\r
-import java.util.HashSet;\r
-import java.util.Set;\r
-\r
-import javax.persistence.Entity;\r
-import javax.persistence.FetchType;\r
-import javax.persistence.ManyToMany;\r
-import javax.persistence.Table;\r
-\r
-import org.hibernate.annotations.NaturalId;\r
-import org.springframework.security.GrantedAuthority;\r
-\r
-@Entity\r
-@Table(name = "PermissionGroup")\r
-public class Group extends CdmBase {\r
-       \r
-       /**\r
-        * \r
-        */\r
-       private static final long serialVersionUID = 7216686200093054648L;\r
-       \r
-       protected String name;\r
-       \r
-       protected Set<User> members = new HashSet<User>();\r
-       \r
-       protected Set <GrantedAuthority> grantedAuthorities = new HashSet<GrantedAuthority>();\r
-       \r
-       @ManyToMany(fetch = FetchType.LAZY, targetEntity = GrantedAuthorityImpl.class)\r
-       public Set<GrantedAuthority> getGrantedAuthorities() {\r
-               return grantedAuthorities;\r
-       }\r
-\r
-       public void setGrantedAuthorities(Set<GrantedAuthority> grantedAuthorities) {\r
-               this.grantedAuthorities = grantedAuthorities;\r
-       }\r
-       \r
-       @NaturalId\r
-       public void setName(String name) {\r
-               this.name = name;\r
-       }\r
-       \r
-       public String getName() {\r
-               return name;\r
-       }\r
-       \r
-       @ManyToMany(fetch = FetchType.LAZY, mappedBy = "groups")\r
-       public Set<User> getMembers() {\r
-               return members;\r
-       }\r
-       \r
-       protected void setMembers(Set<User> members) {\r
-               this.members = members;\r
-       }\r
-\r
-       public boolean addMember(User user) {\r
-               user.getGroups().add(this);\r
-               return this.members.add(user);\r
-       }\r
-\r
-       public boolean removeMember(User user) {\r
-               if(members.contains(user)) {\r
-                       user.getGroups().remove(this);\r
-                   return this.members.remove(user);\r
-               } else {\r
-                       return false;\r
-               }\r
-       }\r
-}\r
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.model.common;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.ManyToMany;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlIDREF;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.CascadeType;
+import org.hibernate.search.annotations.Field;
+import org.springframework.security.core.GrantedAuthority;
+
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Group", propOrder = {
+    "name",
+    "members",
+    "grantedAuthorities"
+})
+@XmlRootElement(name = "Group")
+@Entity
+//@Indexed disabled to reduce clutter in indexes, since this type is not used by any search
+//@Indexed(index = "eu.etaxonomy.cdm.model.common.Group")
+@Table(name = "PermissionGroup")
+public class Group extends CdmBase {
+    private static final long serialVersionUID = 7216686200093054648L;
+    private static final Logger logger = Logger.getLogger(Group.class);
+
+    public final static UUID GROUP_EDITOR_UUID = UUID.fromString("22e5e8af-b99c-4884-a92f-71978efd3770");
+    public final static UUID GROUP_EDITOR_EXTENDED_CREATE_UUID = UUID.fromString("89a7f47f-6f2b-45ac-88d4-a99a4cf29f07");
+    public final static UUID GROUP_PROJECT_MANAGER_UUID = UUID.fromString("645191ae-32a4-4d4e-9b86-c90e0d41944a");
+    public final static UUID GROUP_PUBLISHER_UUID = UUID.fromString("c1f20ad8-1782-40a7-b06b-ce4773acb5ea");
+    public final static UUID GROUP_ADMIN_UUID = UUID.fromString("1739df71-bf73-4dc6-8320-aaaf72cb555f");
+
+    public final static String GROUP_EDITOR_NAME = "Editor";
+    /**
+     * This group will in future replace the group Editor, see issue #7150
+     */
+    public final static String GROUP_EDITOR_EXTENDED_CREATE_NAME = "EditorExtendedCreate";
+    public final static String GROUP_PROJECT_MANAGER_NAME = "ProjectManager";
+    public final static String GROUP_ADMIN_NAME = "Admin";
+
+
+//*********************** FACTORY *********************/
+
+    public static Group NewInstance(){
+        return new Group();
+    }
+
+    public static Group NewInstance(String name){
+        Group group = Group.NewInstance();
+        group.setName(name);
+        return group;
+    }
+
+//**************** FIELDS ******************************/
+
+    @XmlElement(name = "Name")
+    @Column(unique = true)
+    @Field
+    @NotNull
+    protected String name;
+
+    @XmlElementWrapper(name = "Members")
+    @XmlElement(name = "Member")
+    @XmlIDREF
+    @XmlSchemaType(name = "IDREF")
+    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "groups")
+    protected Set<User> members = new HashSet<>();
+
+    @XmlElementWrapper(name = "GrantedAuthorities")
+    @XmlElement(name = "GrantedAuthority", type = GrantedAuthorityImpl.class)
+    @XmlIDREF
+    @XmlSchemaType(name = "IDREF")
+    @ManyToMany(fetch = FetchType.LAZY, targetEntity = GrantedAuthorityImpl.class)
+    @Cascade({CascadeType.SAVE_UPDATE,CascadeType.MERGE})
+    protected Set <GrantedAuthority> grantedAuthorities = new HashSet<>();
+
+// ********************* CONSTRUCTOR ************************/
+
+    protected Group(){
+        super();
+    }
+
+// *************** METHODS ***********************************/
+
+    public Set<GrantedAuthority> getGrantedAuthorities() {
+        return grantedAuthorities;
+    }
+
+    public boolean addGrantedAuthority(GrantedAuthority grantedAuthority){
+        return grantedAuthorities.add(grantedAuthority);
+    }
+
+    public boolean removeGrantedAuthority(GrantedAuthority grantedAuthority){
+        return grantedAuthorities.remove(grantedAuthority);
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Set<User> getMembers() {
+        return members;
+    }
+
+    public boolean addMember(User user) {
+        user.getGroups().add(this);
+        return this.members.add(user);
+    }
+
+    public boolean removeMember(User user) {
+        if(members.contains(user)) {
+            user.getGroups().remove(this);
+            return this.members.remove(user);
+        } else {
+            return false;
+        }
+    }
+
+//*********************** CLONE ********************************************************/
+
+    /**
+     * Clones <i>this</i> Group. This is a shortcut that enables to create
+     * a new instance that differs only slightly from <i>this</i> group by
+     * modifying only some of the attributes.
+     *
+     * @see eu.etaxonomy.cdm.model.term.TermBase#clone()
+     * @see java.lang.Object#clone()
+     */
+    @Override
+    public Object clone() {
+        Group result;
+        try{
+            result = (Group)super.clone();
+            result.grantedAuthorities = new HashSet<>();
+            for (GrantedAuthority grantedauthority: this.grantedAuthorities){
+                result.addGrantedAuthority(grantedauthority);
+            }
+
+            result.members = new HashSet<>();
+            for (User member: this.members){
+                result.addMember(member);
+            }
+
+            //no changes to name
+            return result;
+        } catch (CloneNotSupportedException e) {
+            logger.warn("Object does not implement cloneable");
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+//************************************** toString ***************************************
+
+    @Override
+    public String toString() {
+        if (StringUtils.isNotBlank(name)){
+            return name;
+        }else{
+            return super.toString();
+        }
+    }
+}