013c8bb906548b3922dd36da5c841d06ebfe366f
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / aa / ArpFileFactory.java
1 /* 
2  * The Shibboleth License, Version 1. 
3  * Copyright (c) 2002 
4  * University Corporation for Advanced Internet Development, Inc. 
5  * All rights reserved
6  * 
7  * 
8  * Redistribution and use in source and binary forms, with or without 
9  * modification, are permitted provided that the following conditions are met:
10  * 
11  * Redistributions of source code must retain the above copyright notice, this 
12  * list of conditions and the following disclaimer.
13  * 
14  * Redistributions in binary form must reproduce the above copyright notice, 
15  * this list of conditions and the following disclaimer in the documentation 
16  * and/or other materials provided with the distribution, if any, must include 
17  * the following acknowledgment: "This product includes software developed by 
18  * the University Corporation for Advanced Internet Development 
19  * <http://www.ucaid.edu>Internet2 Project. Alternately, this acknowledegement 
20  * may appear in the software itself, if and wherever such third-party 
21  * acknowledgments normally appear.
22  * 
23  * Neither the name of Shibboleth nor the names of its contributors, nor 
24  * Internet2, nor the University Corporation for Advanced Internet Development, 
25  * Inc., nor UCAID may be used to endorse or promote products derived from this 
26  * software without specific prior written permission. For written permission, 
27  * please contact shibboleth@shibboleth.org
28  * 
29  * Products derived from this software may not be called Shibboleth, Internet2, 
30  * UCAID, or the University Corporation for Advanced Internet Development, nor 
31  * may Shibboleth appear in their name, without prior written permission of the 
32  * University Corporation for Advanced Internet Development.
33  * 
34  * 
35  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
36  * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
37  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
38  * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK 
39  * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE. 
40  * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY 
41  * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, 
42  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
43  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
44  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
46  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
47  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48  */
49
50 package edu.internet2.middleware.shibboleth.aa;
51
52 /**
53  *  Attribute Authority & Release Policy
54  *  File implementation of a repository for ARPs
55  *
56  * @author     Parviz Dousti (dousti@cmu.edu)
57  * @created    June, 2002
58  */
59
60
61 import java.io.*;
62 import java.util.Date;
63 import java.security.acl.*;
64 import java.security.Principal;
65 import org.apache.log4j.Logger;
66
67 public class ArpFileFactory implements ArpFactory{
68
69     static String dataStore;
70     private static Logger log = Logger.getLogger(ArpFileFactory.class.getName());    
71     public ArpFileFactory(String pathData){
72         dataStore = pathData;
73     }
74
75     /**
76      * returns an Arp instance. It tries to retrieve the Arp from file system
77      * If not found then creates a new emplty Arp.  
78      * Arp can be check by its isNew() to see how it was generated
79      */
80
81     public Arp getInstance(String arpName, boolean isAdmin)
82     throws AAException{
83         try{
84
85             String fileName = dataStore+System.getProperty("file.separator")+arpName;
86             log.info("AA: Looking for ARP "+fileName);
87
88             FileInputStream f = new FileInputStream(fileName);
89             ObjectInput s = new ObjectInputStream(f);
90             Arp arp = (Arp)s.readObject();
91             if(!arpName.equals(arp.getName()))
92                throw new AAException("Wrong ARP name.  ARP maybe renamed in datastore. ");
93             arp.setNew(false);
94             arp.setLastRead(new Date());
95             log.info("AA: Found and using ARP "+arpName);
96             return arp;
97             
98         }catch(FileNotFoundException e){
99             // check the IO error to make sure "file not found"
100             log.info("AA: Got File Not Found for "+arpName+" in "+dataStore);
101             try{
102                 Arp arp = new Arp(arpName, isAdmin);
103                 arp.setNew(true);
104                 arp.setLastRead(new Date());
105                 return arp;
106             }catch(NotOwnerException noe){
107                 throw new AAException("Cannot create an ARP. Not owner.");
108             }
109
110         }catch(IOException fe){
111             throw new AAException("Reading ARP failed: "+fe);
112         }catch(ClassNotFoundException ce){
113             throw new AAException("ARP retrival failed: "+ce);
114         }catch(Exception oe){
115             throw new AAException(oe.toString());
116         }
117     }
118
119     public void write(Arp arp) throws AAException{
120         // XXX do we need to check any permissions?
121         try{
122             String fileName = dataStore+System.getProperty("file.separator")+arp.getName();
123             FileOutputStream f = new FileOutputStream(fileName);
124             ObjectOutput s = new ObjectOutputStream(f);
125             arp.setNew(false);
126             s.writeObject(arp);
127             s.flush();      
128         }catch(IOException e){
129             throw new AAException("IO Problem:"+e);
130         }
131     }
132
133     /**
134      * Reread the arp from file system if the copy on disk
135      * is newer than the copy in memory.
136      */
137
138     public Arp reread(Arp arp) throws AAException{
139         String fileName = dataStore+System.getProperty("file.separator")+arp.getName();
140         File file = new File(fileName);
141         if(file == null)
142             throw new AAException("Arp not found on disk while trying to re-read. :"+arp);
143         Date timeStamp = new Date(file.lastModified());
144         log.info("AA: Check ARP's freshness: in memory ("+arp.getLastRead()+") vs on disk ("+timeStamp+")");
145         if(timeStamp.after(arp.getLastRead())){
146             log.info("AA: ARP has been modified on disk. Re-read "+arp.getName());
147             return getInstance(arp.getName(), arp.isAdmin());
148         }
149         return arp;  // return the old one.
150     }
151
152     public void remove(Arp arp) throws AAException{
153         try{
154             String fileName = dataStore+System.getProperty("file.separator")+arp.getName();
155             File f = new File(fileName);
156             f.delete();
157         }catch(Exception e){
158             throw new AAException("IO Problem:"+e);
159         }
160     }
161
162     public String toString(){
163         return "ArpFileFactory:dir="+dataStore;
164     }
165 }
166