View Javadoc

1   /* Copyright 2004, 2005 Acegi Technology Pty Limited
2    *
3    * Licensed under the Apache License, Version 2.0 (the "License");
4    * you may not use this file except in compliance with the License.
5    * You may obtain a copy of the License at
6    *
7    *     http://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  package sample.contact.annotation;
17  
18  import java.util.List;
19  import java.util.Random;
20  
21  import org.acegisecurity.Authentication;
22  import org.acegisecurity.acl.basic.AclObjectIdentity;
23  import org.acegisecurity.acl.basic.BasicAclExtendedDao;
24  import org.acegisecurity.acl.basic.NamedEntityObjectIdentity;
25  import org.acegisecurity.acl.basic.SimpleAclEntry;
26  import org.acegisecurity.annotation.Secured;
27  import org.acegisecurity.context.SecurityContextHolder;
28  import org.acegisecurity.userdetails.UserDetails;
29  
30  import org.springframework.beans.factory.InitializingBean;
31  import org.springframework.context.support.ApplicationObjectSupport;
32  import org.springframework.transaction.annotation.Transactional;
33  import org.springframework.util.Assert;
34  
35  import sample.contact.Contact;
36  import sample.contact.ContactDao;
37  import sample.contact.ContactManager;
38  
39  
40  /***
41   * Concrete implementation of Java 5 Annotated {@link ContactManager}.
42   *
43   * @author Mark St.Godard
44   * @version $Id: ContactManagerBackend.java,v 1.4 2005/11/29 13:10:10 benalex Exp $
45   */
46  @Transactional
47  public class ContactManagerBackend extends ApplicationObjectSupport
48      implements ContactManager, InitializingBean {
49      //~ Instance fields ========================================================
50  
51      private BasicAclExtendedDao basicAclExtendedDao;
52      private ContactDao contactDao;
53      private int counter = 100;
54  
55      //~ Methods ================================================================
56  
57      @Secured ({"ROLE_USER","AFTER_ACL_COLLECTION_READ"})
58      @Transactional(readOnly=true)
59      public List getAll() {
60          if (logger.isDebugEnabled()) {
61              logger.debug("Returning all contacts");
62          }
63  
64          return contactDao.findAll();
65      }
66  
67      @Secured ({"ROLE_USER"})
68      @Transactional(readOnly=true)
69      public List getAllRecipients() {
70          if (logger.isDebugEnabled()) {
71              logger.debug("Returning all recipients");
72          }
73  
74          List list = contactDao.findAllPrincipals();
75          list.addAll(contactDao.findAllRoles());
76  
77          return list;
78      }
79  
80      public void setBasicAclExtendedDao(BasicAclExtendedDao basicAclExtendedDao) {
81          this.basicAclExtendedDao = basicAclExtendedDao;
82      }
83  
84      public BasicAclExtendedDao getBasicAclExtendedDao() {
85          return basicAclExtendedDao;
86      }
87  
88      @Secured ({"ROLE_USER","AFTER_ACL_READ"})
89      @Transactional(readOnly=true)
90      public Contact getById(Long id) {
91          if (logger.isDebugEnabled()) {
92              logger.debug("Returning contact with id: " + id);
93          }
94  
95          return contactDao.getById(id);
96      }
97  
98      public void setContactDao(ContactDao contactDao) {
99          this.contactDao = contactDao;
100     }
101 
102     public ContactDao getContactDao() {
103         return contactDao;
104     }
105 
106     /***
107      * This is a public method.
108      *
109      * @return DOCUMENT ME!
110      */
111     public Contact getRandomContact() {
112         if (logger.isDebugEnabled()) {
113             logger.debug("Returning random contact");
114         }
115 
116         Random rnd = new Random();
117         List contacts = contactDao.findAll();
118         int getNumber = rnd.nextInt(contacts.size());
119 
120         return (Contact) contacts.get(getNumber);
121     }
122 
123     @Secured ({"ACL_CONTACT_ADMIN"})
124     public void addPermission(Contact contact, String recipient,
125         Integer permission) {
126         SimpleAclEntry simpleAclEntry = new SimpleAclEntry();
127         simpleAclEntry.setAclObjectIdentity(makeObjectIdentity(contact));
128         simpleAclEntry.setMask(permission.intValue());
129         simpleAclEntry.setRecipient(recipient);
130         basicAclExtendedDao.create(simpleAclEntry);
131 
132         if (logger.isDebugEnabled()) {
133             logger.debug("Added permission " + permission + " for recipient "
134                 + recipient + " contact " + contact);
135         }
136     }
137 
138     public void afterPropertiesSet() throws Exception {
139         Assert.notNull(contactDao, "contactDao required");
140         Assert.notNull(basicAclExtendedDao, "basicAclExtendedDao required");
141     }
142 
143     @Secured ({"ROLE_USER"})
144     public void create(Contact contact) {
145         // Create the Contact itself
146         contact.setId(new Long(counter++));
147         contactDao.create(contact);
148 
149         // Grant the current principal access to the contact 
150         addPermission(contact, getUsername(),
151             new Integer(SimpleAclEntry.ADMINISTRATION));
152 
153         if (logger.isDebugEnabled()) {
154             logger.debug("Created contact " + contact
155                 + " and granted admin permission to recipient " + getUsername());
156         }
157     }
158 
159     @Secured ({"ACL_CONTACT_DELETE"})
160     public void delete(Contact contact) {
161         contactDao.delete(contact.getId());
162 
163         // Delete the ACL information as well
164         basicAclExtendedDao.delete(makeObjectIdentity(contact));
165 
166         if (logger.isDebugEnabled()) {
167             logger.debug("Deleted contact " + contact
168                 + " including ACL permissions");
169         }
170     }
171 
172     @Secured ({"ACL_CONTACT_ADMIN"})
173     public void deletePermission(Contact contact, String recipient) {
174         basicAclExtendedDao.delete(makeObjectIdentity(contact), recipient);
175 
176         if (logger.isDebugEnabled()) {
177             logger.debug("Deleted contact " + contact
178                 + " ACL permissions for recipient " + recipient);
179         }
180     }
181 
182     public void update(Contact contact) {
183         contactDao.update(contact);
184 
185         if (logger.isDebugEnabled()) {
186             logger.debug("Updated contact " + contact);
187         }
188     }
189 
190     protected String getUsername() {
191         Authentication auth = SecurityContextHolder.getContext()
192                                                    .getAuthentication();
193 
194         if (auth.getPrincipal() instanceof UserDetails) {
195             return ((UserDetails) auth.getPrincipal()).getUsername();
196         } else {
197             return auth.getPrincipal().toString();
198         }
199     }
200 
201     private AclObjectIdentity makeObjectIdentity(Contact contact) {
202         return new NamedEntityObjectIdentity(contact.getClass().getName(),
203             contact.getId().toString());
204     }
205 }