001package org.apache.archiva.redback.rbac.jpa.model;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.apache.archiva.redback.rbac.AbstractRole;
023import org.apache.archiva.redback.rbac.Permission;
024import org.apache.archiva.redback.rbac.Role;
025import org.slf4j.Logger;
026import org.slf4j.LoggerFactory;
027import org.springframework.core.annotation.Order;
028
029import javax.persistence.*;
030import java.io.Serializable;
031import java.util.ArrayList;
032import java.util.List;
033
034/**
035 * Created by martin on 25.09.16.
036 */
037@Entity
038@Table(
039        name="SECURITY_ROLES"
040)
041@IdClass( RoleId.class )
042public class JpaRole extends AbstractRole implements Serializable {
043
044    private static final Logger log = LoggerFactory.getLogger( JpaRole.class );
045    private static final long serialVersionUID = 4564608138465995665L;
046
047    @Id
048    @Column(name="NAME", unique = true)
049    private String name;
050    @Id
051    @Column( name = "ID", unique = true )
052    private String id;
053    @Column(name="DESCRIPTION")
054    private String description;
055    @Column(name="ASSIGNABLE",nullable = false)
056    private Boolean assignable = false;
057    @Column(name="PERMANENT", nullable = false)
058    private Boolean permanent = false;
059    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
060    @OrderColumn(name="INTEGER_IDX", nullable = false)
061    @JoinTable(
062            name="SECURITY_ROLE_PERMISSION_MAP",
063            joinColumns={ @JoinColumn(name="NAME_OID", referencedColumnName="NAME", nullable = false) },
064            inverseJoinColumns = {
065                    @JoinColumn(name="NAME_EID",referencedColumnName = "NAME")
066            }
067    )
068    List<JpaPermission> permissions = new ArrayList<JpaPermission>();
069
070    @ElementCollection(fetch = FetchType.EAGER)
071    @OrderColumn(name="INTEGER_IDX",nullable = false)
072    @Column(name="STRING_ELE")
073    @CollectionTable(
074            name="SECURITY_ROLE_CHILDROLE_MAP",
075            joinColumns = {
076                    @JoinColumn(name="NAME_OID",referencedColumnName = "NAME", nullable = false)
077            }
078    )
079    List<String> childRoleNames = new ArrayList<String>();
080
081    @ElementCollection(fetch = FetchType.EAGER)
082    @OrderColumn(name="INTEGER_IDX",nullable = false)
083    @Column(name="CHILD_IDS")
084    @CollectionTable(
085        name="SECURITY_ROLE_CHILDROLE_ID_MAP",
086        joinColumns = {
087            @JoinColumn(name="ID_OID",referencedColumnName = "ID", nullable = false)
088        }
089    )
090    List<String> childRoleIds = new ArrayList<String>();
091
092    @Column(name="TEMPLATE_INSTANCE",nullable = false)
093    private Boolean templateInstance = false;
094
095    @Column(name="MODEL_ID",nullable = false)
096    private String modelId = "";
097
098    @Column(name="RESOURCE",nullable = false)
099    private String resource = "";
100
101    public JpaRole( )
102    {
103    }
104
105    @Override
106    public void addPermission(Permission permission) {
107        if (permission instanceof JpaPermission) {
108            this.permissions.add((JpaPermission) permission);
109        }
110
111    }
112
113    @Override
114    public void addChildRoleName(String name) {
115        this.childRoleNames.add(name);
116    }
117
118    @Override
119    public void addChildRoleId( String id )
120    {
121        this.childRoleIds.add( id );
122    }
123
124    @Override
125    public List<String> getChildRoleNames() {
126        return childRoleNames;
127    }
128
129    @Override
130    public List<String> getChildRoleIds( )
131    {
132        return childRoleIds;
133    }
134
135    @Override
136    public String getDescription() {
137        return description;
138    }
139
140    @Override
141    public String getName() {
142        return name;
143    }
144
145    @Override
146    public List<? extends Permission> getPermissions() {
147        return permissions;
148    }
149
150    @Override
151    public boolean isAssignable() {
152        return assignable;
153    }
154
155    @Override
156    public void removePermission(Permission permission) {
157        this.permissions.remove(permission);
158    }
159
160    @Override
161    public void setAssignable(boolean assignable) {
162        this.assignable=assignable;
163    }
164
165    @Override
166    public void setChildRoleNames(List<String> names) {
167        this.childRoleNames.clear();
168        this.childRoleNames.addAll(names);
169    }
170
171    @Override
172    public void setChildRoleIds( List<String> childRoleIds )
173    {
174        this.childRoleIds.clear();
175        this.childRoleIds.addAll( childRoleIds );
176    }
177
178    @Override
179    public void setDescription(String description) {
180        this.description=description;
181
182    }
183
184    @Override
185    public void setName(String name) {
186        this.name=name;
187
188    }
189
190    @Override
191    public void setPermissions(List<Permission> permissions) {
192        this.permissions.clear();
193        for (Permission p : permissions) {
194            if (p instanceof JpaPermission) {
195                permissions.add(p);
196            }
197        }
198    }
199
200    @Override
201    public boolean isPermanent() {
202        return permanent;
203    }
204
205    @Override
206    public void setPermanent(boolean permanent) {
207        this.permanent=permanent;
208    }
209
210    @Override
211    public void setId( String id )
212    {
213        if (id==null)  {
214            log.error( "Null value for role id" );
215            throw new NullPointerException( "ID may not be null" );
216        }
217        this.id = id;
218    }
219
220    @Override
221    public String getId( )
222    {
223        return id;
224    }
225
226    @Override
227    public void setModelId( String modelId )
228    {
229        if (modelId==null) {
230            this.modelId = "";
231        } else
232        {
233            this.modelId = modelId;
234        }
235    }
236
237    @Override
238    public String getModelId( )
239    {
240        return modelId;
241    }
242
243    @Override
244    public void setTemplateInstance( boolean templateInstanceFlag )
245    {
246        this.templateInstance = templateInstanceFlag;
247    }
248
249    @Override
250    public boolean isTemplateInstance( )
251    {
252        return this.templateInstance;
253    }
254
255    @Override
256    public void setResource( String resource )
257    {
258        if (resource==null) {
259            this.resource = "";
260        } else
261        {
262            this.resource = resource;
263        }
264    }
265
266    @Override
267    public String getResource( )
268    {
269        return resource;
270    }
271
272    @Override
273    public boolean equals( Object o )
274    {
275        if ( this == o ) return true;
276        if ( o == null || getClass( ) != o.getClass( ) ) return false;
277        if ( !super.equals( o ) ) return false;
278
279        JpaRole jpaRole = (JpaRole) o;
280
281        if ( !name.equals( jpaRole.name ) ) return false;
282        return id.equals( jpaRole.id );
283    }
284
285    @Override
286    public int hashCode( )
287    {
288        int result = name.hashCode( );
289        result = 31 * result + id.hashCode( );
290        return result;
291    }
292}