View Javadoc
1   package org.apache.fulcrum.security.spi;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  import org.apache.commons.lang3.StringUtils;
22  import org.apache.fulcrum.security.RoleManager;
23  import org.apache.fulcrum.security.entity.Role;
24  import org.apache.fulcrum.security.util.DataBackendException;
25  import org.apache.fulcrum.security.util.EntityExistsException;
26  import org.apache.fulcrum.security.util.UnknownEntityException;
27  
28  /**
29   *
30   * This implementation keeps all objects in memory. This is mostly meant to help
31   * with testing and prototyping of ideas.
32   *
33   * @author <a href="mailto:epugh@upstate.com">Eric Pugh</a>
34   * @version $Id$
35   */
36  public abstract class AbstractRoleManager extends AbstractEntityManager implements RoleManager
37  {
38      /** default serial id */
39  	private static final long serialVersionUID = 1L;
40  
41  	/**
42  	 * @param <T> role type
43  	 * @param role to persist
44  	 * @return the Role object
45  	 * @throws DataBackendException if fail to connect to datasource
46  	 */
47  	protected abstract <T extends Role> T persistNewRole(T role) throws DataBackendException;
48  
49      /**
50       * Construct a blank Role object.
51       *
52       * This method calls getRoleClass, and then creates a new object using the
53       * default constructor.
54       *
55       * @param <T> role type
56       * @return an object implementing Role interface.
57       * @throws DataBackendException
58       *             if the object could not be instantiated.
59       */
60      @Override
61  	public <T extends Role> T getRoleInstance() throws DataBackendException
62      {
63          try
64          {
65              @SuppressWarnings("unchecked")
66  			T role = (T) Class.forName(getClassName()).newInstance();
67              return role;
68          }
69          catch (Exception e)
70          {
71              throw new DataBackendException("Problem creating instance of class " + getClassName(), e);
72          }
73      }
74  
75      /**
76       * Construct a blank Role object.
77       *
78       * This method calls getRoleClass, and then creates a new object using the
79       * default constructor.
80       * 
81       * @param <T> type of role 
82       *
83       * @param roleName
84       *            The name of the role.
85       *
86       * @return an object implementing Role interface.
87       *
88       * @throws DataBackendException
89       *             if the object could not be instantiated.
90       */
91      @Override
92  	public <T extends Role> T getRoleInstance(String roleName) throws DataBackendException
93      {
94          T role = getRoleInstance();
95          role.setName(roleName);
96          return role;
97      }
98  
99      /**
100      * Retrieve a Role object with specified name.
101      *
102      * @see org.apache.fulcrum.security.RoleManager#getRoleByName(java.lang.String)
103      * 
104      * @param <T> type of role
105      *
106      * @param name
107      *            the name of the Role.
108      * @return an object representing the Role with specified name.
109      * @throws DataBackendException
110      *             if there was an error accessing the data backend.
111      * @throws UnknownEntityException
112      *             if the role does not exist.
113      * 
114      */
115     @Override
116 	public <T extends Role> T getRoleByName(String name) throws DataBackendException, UnknownEntityException
117     {
118         @SuppressWarnings("unchecked")
119 		T role = (T) getAllRoles().getByName(name);
120         if (role == null)
121         {
122             throw new UnknownEntityException("The specified role does not exist");
123         }
124         return role;
125     }
126 
127     /**
128      * Retrieve a Role object with specified Id.
129      * 
130      * @param <T> the role type
131      *
132      * @param id
133      *            the ID of the Role.
134      *
135      * @return an object representing the Role with specified name.
136      *
137      * @throws UnknownEntityException
138      *             if the permission does not exist in the database.
139      * @throws DataBackendException
140      *             if there is a problem accessing the storage.
141      */
142     @Override
143 	public <T extends Role> T getRoleById(Object id) throws DataBackendException, UnknownEntityException
144     {
145         @SuppressWarnings("unchecked")
146 		T role = (T) getAllRoles().getById(id);
147         if (role == null)
148         {
149             throw new UnknownEntityException("The specified role does not exist");
150         }
151         return role;
152     }
153 
154     /**
155      * Creates a new role with specified attributes.
156      * 
157      * @param <T> role type
158      *
159      * @param role
160      *            the object describing the role to be created.
161      * @return a new Role object that has id set up properly.
162      * @throws DataBackendException
163      *             if there was an error accessing the data backend.
164      * @throws EntityExistsException
165      *             if the role already exists.
166      */
167     @Override
168 	public synchronized <T extends Role> T addRole(T role) throws DataBackendException, EntityExistsException
169     {
170         boolean roleExists = false;
171         if (StringUtils.isEmpty(role.getName()))
172         {
173             throw new DataBackendException("Could not create a role with empty name!");
174         }
175 //        if (role.getId() == null)
176 //        {
177 //            throw new DataBackendException("Could not create a role with an id of null!");
178 //        }
179         try
180         {
181             roleExists = checkExists(role);
182             if (!roleExists)
183             {
184                 return persistNewRole(role);
185             }
186         }
187         catch (Exception e)
188         {
189             throw new DataBackendException("addRole(Role) failed", e);
190         }
191 
192         // the only way we could get here without return/throw triggered
193         // is that the roleExists was true.
194         throw new EntityExistsException("Role '" + role + "' already exists");
195     }
196 
197     /**
198      * Check whether a specified role exists.
199      *
200      * The name is used for looking up the role
201      *
202      * @param role
203      *            The role to be checked.
204      * @return true if the specified role exists
205      * @throws DataBackendException
206      *             if there was an error accessing the data backend.
207      */
208     @Override
209 	public boolean checkExists(Role role) throws DataBackendException
210     {
211         return checkExists(role.getName());
212     }
213 }