3c8b7d99757ee3c3c677cfb07d9b9259320c62ea
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / aa / arp / provider / FileSystemArpRepository.java
1 /*
2  * Copyright [2005] [University Corporation for Advanced Internet Development, Inc.]
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package edu.internet2.middleware.shibboleth.aa.arp.provider;
18
19 import java.io.File;
20 import java.io.IOException;
21 import java.security.Principal;
22
23 import org.apache.log4j.Logger;
24 import org.opensaml.SAMLException;
25 import org.w3c.dom.Element;
26 import org.w3c.dom.Node;
27 import org.w3c.dom.NodeList;
28 import org.xml.sax.InputSource;
29 import org.xml.sax.SAXException;
30 import edu.internet2.middleware.shibboleth.aa.arp.Arp;
31 import edu.internet2.middleware.shibboleth.aa.arp.ArpRepository;
32 import edu.internet2.middleware.shibboleth.aa.arp.ArpRepositoryException;
33 import edu.internet2.middleware.shibboleth.common.ShibResource;
34 import edu.internet2.middleware.shibboleth.idp.IdPConfig;
35 import edu.internet2.middleware.shibboleth.xml.Parser;
36
37 /**
38  * Simple <code>ArpRepository</code> implementation that uses a filesystem for storage.
39  * 
40  * @author Walter Hoehn (wassa@columbia.edu)
41  */
42
43 public class FileSystemArpRepository extends BaseArpRepository implements ArpRepository {
44
45         private static Logger log = Logger.getLogger(FileSystemArpRepository.class.getName());
46         private final String siteArpFileName = "arp.site.xml";
47
48         private String dataStorePath;
49
50         public FileSystemArpRepository(Element config) throws ArpRepositoryException {
51
52                 super(config);
53
54                 NodeList itemElements = config.getElementsByTagNameNS(IdPConfig.configNameSpace, "Path");
55
56                 if (itemElements.getLength() > 1) {
57                         log
58                                         .warn("Encountered multiple <Path> configuration elements for the File System ARP Repository.  Using first...");
59                 }
60                 Node tnode = itemElements.item(0).getFirstChild();
61                 String path = null;
62                 if (tnode != null && tnode.getNodeType() == Node.TEXT_NODE) {
63                         path = tnode.getNodeValue();
64                 }
65                 if (path == null || path.equals("")) {
66                         log.error("ARP repository path not specified.");
67                         throw new ArpRepositoryException(
68                                         "Cannot initialize FileSystemArpRepository: <ArpRepository> element must contain a <Path> element.");
69                 }
70
71                 try {
72                         File realPath = new ShibResource(path, this.getClass()).getFile();
73
74                         if (!realPath.isDirectory()) {
75                                 log.error("Cannot initialize FileSystemArpRepository: specified path is not a directory: ("
76                                                 + realPath.getPath() + ").");
77                                 throw new ArpRepositoryException("Cannot initialize FileSystemArpRepository");
78                         }
79
80                         dataStorePath = path;
81                         if (!dataStorePath.endsWith("/")) {
82                                 dataStorePath += "/";
83                         }
84                         log.info("Initializing File System Arp Repository with a root of (" + dataStorePath + ").");
85                 } catch (Exception e) {
86                         log.error("Cannot initialize FileSystemArpRepository: error accessing path: (" + path + "): " + e);
87                         throw new ArpRepositoryException("Cannot initialize FileSystemArpRepository");
88                 }
89         }
90
91         /**
92          * @see edu.internet2.middleware.shibboleth.aa.arp.ArpRepository#remove(Arp)
93          */
94         public void remove(Arp arp) throws ArpRepositoryException {
95
96                 throw new ArpRepositoryException("Remove not implemented for FileSystemArpRepository.");
97         }
98
99         /**
100          * @see edu.internet2.middleware.shibboleth.aa.arp.ArpRepository#update(Arp)
101          */
102         public void update(Arp arp) throws ArpRepositoryException {
103
104                 throw new ArpRepositoryException("Update not implemented for FileSystemArpRepository.");
105         }
106
107         /**
108          * @see edu.internet2.middleware.shibboleth.aa.arp.provider.BaseArpRepository#retrieveSiteArpXml()
109          */
110         protected Element retrieveSiteArpXml() throws IOException, SAXException {
111
112                 String fileName = dataStorePath + siteArpFileName;
113                 log.debug("Attempting to load site ARP from: (" + fileName + ").");
114                 return retrieveArpXml(fileName);
115
116         }
117
118         private Element retrieveArpXml(String fileName) throws SAXException, IOException {
119
120                 try {
121                         ShibResource resource = new ShibResource(fileName, this.getClass());
122                         if (!resource.getFile().exists()) {
123                                 log.debug("No ARP found.");
124                                 return null;
125                         }
126
127                         Parser.DOMParser parser = new Parser.DOMParser(true);
128                         try {
129                                 parser.parse(new InputSource(resource.getInputStream()));
130                         } catch (SAMLException e) {
131                                 throw new SAXException(e);
132                         }
133                         return parser.getDocument().getDocumentElement();
134
135                 } catch (ShibResource.ResourceNotAvailableException e) {
136                         log.debug("No ARP found.");
137                         return null;
138                 }
139         }
140
141         /**
142          * @see edu.internet2.middleware.shibboleth.aa.arp.provider.BaseArpRepository#retrieveUserArpXml(Principal)
143          */
144         protected Element retrieveUserArpXml(Principal principal) throws IOException, SAXException {
145
146                 String fileName = dataStorePath + "arp.user." + principal.getName() + ".xml";
147                 log.debug("Attempting to load user (" + principal.getName() + ") ARP from: (" + fileName + ").");
148                 return retrieveArpXml(fileName);
149         }
150
151 }