1   /**
2    * 
3    */
4   package org.melati.poem.test;
5   
6   import java.util.Enumeration;
7   
8   import org.melati.poem.AccessToken;
9   import org.melati.poem.CachedCount;
10  import org.melati.poem.Capability;
11  import org.melati.poem.DeletionIntegrityPoemException;
12  import org.melati.poem.Field;
13  import org.melati.poem.Group;
14  import org.melati.poem.GroupCapability;
15  import org.melati.poem.GroupMembership;
16  import org.melati.poem.NonRootSetAccessTokenPoemException;
17  import org.melati.poem.Persistent;
18  import org.melati.poem.PoemThread;
19  import org.melati.poem.ReadPersistentAccessPoemException;
20  import org.melati.poem.User;
21  import org.melati.poem.util.StringUtils;
22  
23  /**
24   * @author timp
25   * @since 26 Jan 2007
26   *
27   */
28  public class ProtectedPersistentTest extends PersistentTest {
29  
30    /**
31     * Constructor.
32     * @param name
33     */
34    public ProtectedPersistentTest(String name) {
35      super(name);
36    }
37  
38    /**
39     * {@inheritDoc}
40     * @see org.melati.poem.test.PersistentTest#setUp()
41     */
42    protected void setUp() throws Exception {
43      super.setUp();
44    }
45  
46    /**
47     * {@inheritDoc}
48     * @see org.melati.poem.test.PersistentTest#tearDown()
49     */
50    protected void tearDown() throws Exception {
51      super.tearDown();
52    }
53  
54    protected void databaseUnchanged() { 
55      deleteUser("moneypenny");
56      deleteUser("smiley");
57      deleteUser("bond");
58      deleteGroup("officeWorkers");
59      deleteGroup("spyMasters");
60      deleteCapability("monitor");
61      deleteCapability("commission");
62      getDb().getUserTable().getTableInfo().setDefaultcanread(null);
63      super.databaseUnchanged();
64    } 
65    private void deleteCapability(String name) {
66      Capability c = (Capability)getDb().getCapabilityTable().getNameColumn().firstWhereEq(name);
67      
68      if (c != null) { 
69        System.err.println("Cleaning up: " + c);      
70        c.delete();      
71      } else { 
72        System.err.println("Nothing to clean up");            
73      }
74    }
75  
76    private void deleteUser(String name) {
77      User u = (User)getDb().getUserTable().getLoginColumn().firstWhereEq(name);
78      if (u != null) { 
79        System.err.println("Cleaning up: " + u);      
80        u.delete();
81      } else 
82        System.err.println("Nothing to clean up");      
83    }
84    private void deleteGroup(String group) {
85      Group g = (Group)getDb().getGroupTable().getNameColumn().firstWhereEq(group);
86      if (g != null) { 
87        System.err.println("Cleaning up: " + g);
88        Enumeration gcs = getDb().getGroupCapabilityTable().getGroupColumn().selectionWhereEq(g.getTroid());
89        while(gcs.hasMoreElements()) { 
90          GroupCapability gc = (GroupCapability)gcs.nextElement();
91          System.err.println("Cleaning up: " + gc);
92          gc.delete();
93        }
94        Enumeration gms = getDb().getGroupMembershipTable().getGroupColumn().
95                              selectionWhereEq(g.getTroid());
96        while (gms.hasMoreElements()) { 
97          GroupMembership gm = (GroupMembership)gms.nextElement();
98          System.err.println("Cleaning up: " + gm);
99          gm.delete();
100       }
101       try {
102         g.delete();
103       } catch (DeletionIntegrityPoemException e) {
104         Enumeration refs = e.references;
105         while (refs.hasMoreElements()) { 
106           Object o = refs.nextElement();
107           System.err.println("Failed to delete " + g + " due to " +o);
108         }
109       }
110     }
111     
112   }
113 
114   /** 
115    * {@inheritDoc}
116    * @see org.melati.poem.test.PersistentTest#testDelete()
117    */
118   public void testDelete() {
119     if (!getDb().getDbms().canDropColumns()) {
120       return;
121     }
122     super.testDelete();
123   }
124 
125   /** 
126    * {@inheritDoc}
127    * @see org.melati.poem.test.PersistentTest#testDeleteAndCommit()
128    */
129   public void testDeleteAndCommit() {
130     if (!getDb().getDbms().canDropColumns()) {
131       return;
132     }
133     super.testDeleteAndCommit();
134   }
135 
136   /**
137    * @see org.melati.poem.Persistent#assertCanRead(AccessToken)
138    */
139   public void testAssertCanReadAccessToken() {
140     Persistent admin = getDb().getUserTable().administratorUser();
141     AccessToken guest  = getDb().getUserTable().guestUser();
142     if (admin.getTable().getTableInfo().getDefaultcanread() == null) // May be set from previous run
143       admin.assertCanRead(guest);
144     admin.getTable().getTableInfo().setDefaultcanread(getDb().getCanAdminister());
145     try {
146       admin.assertCanRead(guest);
147       System.err.println("WTF:" + guest.givesCapability(getDb().administerCapability()));
148       fail("Should have bombed");
149     } catch (ReadPersistentAccessPoemException e) {
150       e = null;
151     }
152     AccessToken a  = getDb().getUserTable().administratorUser();
153     admin.assertCanRead(a);
154     admin.getTable().getTableInfo().setDefaultcanread(null);
155   }
156 
157   /**
158    * @see org.melati.poem.Persistent#assertCanRead()
159    */
160   public void testAssertCanRead() {
161     Persistent p = getDb().getUserTable().administratorUser();
162     p.assertCanRead();
163     p.getTable().getTableInfo().setDefaultcanread(getDb().getCanAdminister());
164     AccessToken g  = getDb().getUserTable().guestUser();
165     PoemThread.setAccessToken(g);
166     try {
167       p.assertCanRead();
168       fail("Should have bombed");
169     } catch (ReadPersistentAccessPoemException e) {
170       e = null;
171     }
172     AccessToken a  = getDb().getUserTable().administratorUser();
173     try { 
174       PoemThread.setAccessToken(a);
175       fail("Should have bombed");
176     } catch (NonRootSetAccessTokenPoemException e) {
177       e = null;
178     }
179     /** @see #everythingDatabaseUnchanged() */
180     //p.getTable().getTableInfo().setDefaultcanread(null);
181   }
182 
183   /**
184    * @see org.melati.poem.Persistent#getReadable()
185    */
186   public void testGetReadable() {
187     Persistent p = getDb().getUserTable().administratorUser();
188     assertTrue(p.getReadable());
189     p.getTable().getTableInfo().setDefaultcanread(getDb().getCanAdminister());
190     AccessToken g  = getDb().getUserTable().guestUser();
191     PoemThread.setAccessToken(g);
192     assertFalse(p.getReadable());
193     /** @see #everythingDatabaseUnchanged() */
194     //p.getTable().getTableInfo().setDefaultcanread(null);
195   }
196 
197   /**
198    * @see org.melati.poem.Persistent#getPrimaryDisplayField()
199    */
200   public void testGetPrimaryDisplayField() {
201     Persistent p = getDb().getGroupMembershipTable().getObject(0);
202     Field f = p.getPrimaryDisplayField();
203     assertEquals("id: 0", f.toString());
204   }
205 
206 
207   /**
208    * @see org.melati.poem.Table#cachedCount(String, boolean, boolean)
209    */
210   public void testCachedCountStringBooleanBoolean() {
211     EverythingDatabase db = (EverythingDatabase)getDb();
212     Capability commission = db.getCapabilityTable().ensure("commission");
213     Capability monitor = db.getCapabilityTable().ensure("monitor");
214     
215     User spy = ensureUser("bond");
216     User smiley = ensureUser("smiley");
217     User moneypenny = ensureUser("moneypenny");
218 
219     Protected spyMission = (Protected)db.getProtectedTable().newPersistent();
220     spyMission.setCanRead(monitor);
221     spyMission.setCanSelect(monitor);
222     spyMission.setCanWrite(monitor);
223     spyMission.setCanDelete(commission);
224     spyMission.setSpy(spy);
225     spyMission.setMission("impossible");
226     spyMission.setDeleted(false);
227     spyMission.makePersistent();
228 
229     Group officeWorkers = db.getGroupTable().ensure("officeWorkers");
230     GroupMembership inOfficeWorkersMoneyPenny = (GroupMembership)db.getGroupMembershipTable().newPersistent();
231     inOfficeWorkersMoneyPenny.setGroup(officeWorkers);
232     inOfficeWorkersMoneyPenny.setUser(moneypenny);
233     inOfficeWorkersMoneyPenny.makePersistent();
234     //GroupCapability officeWorkersMonitor = db.getGroupCapabilityTable().ensure(officeWorkers, monitor);
235     
236     Group spyMasters = db.getGroupTable().ensure("spyMasters");
237     GroupMembership inSpyMastersSmiley = (GroupMembership)db.getGroupMembershipTable().newPersistent();
238     inSpyMastersSmiley.setGroup(spyMasters);
239     inSpyMastersSmiley.setUser(smiley);
240     inSpyMastersSmiley.makePersistent();
241     
242     db.getGroupCapabilityTable().ensure(spyMasters, commission);
243     db.getGroupCapabilityTable().ensure(spyMasters, monitor);
244     
245     PoemThread.setAccessToken(smiley);
246     spyMission.assertCanRead();
247     String query = db.getProtectedTable().getMissionColumn().fullQuotedName() + "='impossible'";
248     CachedCount cached = db.getProtectedTable().
249       cachedCount(query,false,true); 
250     assertEquals(1, cached.count());
251     
252     spyMission.delete();
253 
254     
255     // Deletion performed above
256   }
257   
258   private User ensureUser(String name) {
259     User u = (User)((EverythingDatabase)getDb()).getUserTable().newPersistent();
260     u.setLogin(name);
261     u.setName(StringUtils.capitalised(name));
262     u.setPassword(name);
263     u.makePersistent();
264     return u;
265   }
266 }