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.GroupManager;
23 import org.apache.fulcrum.security.entity.Group;
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 * This implementation keeps all objects in memory. This is mostly meant to help
30 * with testing and prototyping of ideas.
31 *
32 * @author <a href="mailto:epugh@upstate.com">Eric Pugh</a>
33 * @version $Id$
34 */
35 public abstract class AbstractGroupManager extends AbstractEntityManager implements GroupManager
36 {
37 /**
38 * serial id
39 */
40 private static final long serialVersionUID = 1L;
41
42 protected abstract <T extends Group> T persistNewGroup(T group) throws DataBackendException;
43
44 /**
45 * Construct a blank Group object.
46 *
47 * This method calls getGroupClass, and then creates a new object using the
48 * default constructor.
49 *
50 * @return an object implementing Group interface.
51 * @throws DataBackendException
52 * if the object could not be instantiated.
53 */
54 @Override
55 public <T extends Group> T getGroupInstance() throws DataBackendException
56 {
57 try
58 {
59 @SuppressWarnings("unchecked")
60 T group = (T) Class.forName(getClassName()).newInstance();
61 return group;
62 }
63 catch (Exception e)
64 {
65 throw new DataBackendException("Problem creating instance of class " + getClassName(), e);
66 }
67 }
68
69 /**
70 * Construct a blank Group object.
71 *
72 * This method calls getGroupClass, and then creates a new object using the
73 * default constructor.
74 *
75 * @param groupName
76 * The name of the Group
77 *
78 * @return an object implementing Group interface.
79 *
80 * @throws DataBackendException
81 * if the object could not be instantiated.
82 */
83 @Override
84 public <T extends Group> T getGroupInstance(String groupName) throws DataBackendException
85 {
86 T group = getGroupInstance();
87 group.setName(groupName);
88 return group;
89 }
90
91 /**
92 * Retrieve a Group object with specified name.
93 *
94 * @param name
95 * the name of the Group.
96 * @return an object representing the Group with specified name.
97 * @throws DataBackendException
98 * if there was an error accessing the data backend.
99 * @throws UnknownEntityException
100 * if the group does not exist.
101 */
102 @Override
103 public <T extends Group> T getGroupByName(String name) throws DataBackendException, UnknownEntityException
104 {
105 @SuppressWarnings("unchecked")
106 T group = (T) getAllGroups().getByName(name);
107 if (group == null)
108 {
109 throw new UnknownEntityException("The specified group does not exist");
110 }
111 return group;
112 }
113
114 /**
115 * Retrieve a Group object with specified Id.
116 *
117 * @param id
118 * the ID of the Group.
119 *
120 * @return an object representing the Group with specified name.
121 *
122 * @throws UnknownEntityException
123 * if the permission does not exist in the database.
124 * @throws DataBackendException
125 * if there is a problem accessing the storage.
126 */
127 @Override
128 public <T extends Group> T getGroupById(Object id) throws DataBackendException, UnknownEntityException
129 {
130 @SuppressWarnings("unchecked")
131 T group = (T) getAllGroups().getById(id);
132 if (group == null)
133 {
134 throw new UnknownEntityException("The specified group does not exist");
135 }
136 return group;
137 }
138
139 /**
140 * Creates a new group with specified attributes.
141 *
142 * @param group
143 * the object describing the group to be created.
144 * @return a new Group object that has id set up properly.
145 * @throws DataBackendException
146 * if there was an error accessing the data backend.
147 * @throws EntityExistsException
148 * if the group already exists.
149 */
150 @Override
151 public synchronized <T extends Group> T addGroup(T group) throws DataBackendException, EntityExistsException
152 {
153 boolean groupExists = false;
154 if (StringUtils.isEmpty(group.getName()))
155 {
156 throw new DataBackendException("Could not create a group with empty name!");
157 }
158 // if (group.getId() == null)
159 // {
160 // throw new DataBackendException("Could not create a group with an id of null!");
161 // }
162 groupExists = checkExists(group);
163 if (!groupExists)
164 {
165
166 // return the object with correct id
167 return persistNewGroup(group);
168 }
169 else
170 {
171 throw new EntityExistsException("Group '" + group + "' already exists");
172 }
173 }
174
175 /**
176 * Check whether a specified group exists.
177 *
178 * The name is used for looking up the group
179 *
180 * @param group
181 * The group to be checked.
182 * @return true if the specified group exists
183 * @throws DataBackendException
184 * if there was an error accessing the data backend.
185 */
186 @Override
187 public boolean checkExists(Group group) throws DataBackendException
188 {
189 return checkExists(group.getName());
190 }
191
192 }