Ripped out stale 1.3 XML parsing code.
[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 javax.xml.parsers.DocumentBuilderFactory;
24 import javax.xml.parsers.ParserConfigurationException;
25
26 import org.apache.log4j.Logger;
27 import org.w3c.dom.Element;
28 import org.w3c.dom.Node;
29 import org.w3c.dom.NodeList;
30 import org.xml.sax.InputSource;
31 import org.xml.sax.SAXException;
32
33 import edu.internet2.middleware.shibboleth.aa.arp.Arp;
34 import edu.internet2.middleware.shibboleth.aa.arp.ArpRepository;
35 import edu.internet2.middleware.shibboleth.aa.arp.ArpRepositoryException;
36 import edu.internet2.middleware.shibboleth.common.ShibResource;
37 import edu.internet2.middleware.shibboleth.idp.IdPConfig;
38
39 /**
40  * Simple <code>ArpRepository</code> implementation that uses a filesystem for storage.
41  * 
42  * @author Walter Hoehn (wassa@columbia.edu)
43  */
44
45 public class FileSystemArpRepository extends BaseArpRepository implements ArpRepository {
46
47         private static Logger log = Logger.getLogger(FileSystemArpRepository.class.getName());
48         private final String siteArpFileName = "arp.site.xml";
49
50         private String dataStorePath;
51
52         public FileSystemArpRepository(Element config) throws ArpRepositoryException {
53
54                 super(config);
55
56                 NodeList itemElements = config.getElementsByTagNameNS(IdPConfig.configNameSpace, "Path");
57
58                 if (itemElements.getLength() > 1) {
59                         log
60                                         .warn("Encountered multiple <Path> configuration elements for the File System ARP Repository.  Using first...");
61                 }
62                 Node tnode = itemElements.item(0).getFirstChild();
63                 String path = null;
64                 if (tnode != null && tnode.getNodeType() == Node.TEXT_NODE) {
65                         path = tnode.getNodeValue();
66                 }
67                 if (path == null || path.equals("")) {
68                         log.error("ARP repository path not specified.");
69                         throw new ArpRepositoryException(
70                                         "Cannot initialize FileSystemArpRepository: <ArpRepository> element must contain a <Path> element.");
71                 }
72
73                 try {
74                         File realPath = new ShibResource(path, this.getClass()).getFile();
75
76                         if (!realPath.isDirectory()) {
77                                 log.error("Cannot initialize FileSystemArpRepository: specified path is not a directory: ("
78                                                 + realPath.getPath() + ").");
79                                 throw new ArpRepositoryException("Cannot initialize FileSystemArpRepository");
80                         }
81
82                         dataStorePath = path;
83                         if (!dataStorePath.endsWith("/")) {
84                                 dataStorePath += "/";
85                         }
86                         log.info("Initializing File System Arp Repository with a root of (" + dataStorePath + ").");
87                 } catch (Exception e) {
88                         log.error("Cannot initialize FileSystemArpRepository: error accessing path: (" + path + "): " + e);
89                         throw new ArpRepositoryException("Cannot initialize FileSystemArpRepository");
90                 }
91         }
92
93         /**
94          * @see edu.internet2.middleware.shibboleth.aa.arp.ArpRepository#remove(Arp)
95          */
96         public void remove(Arp arp) throws ArpRepositoryException {
97
98                 throw new ArpRepositoryException("Remove not implemented for FileSystemArpRepository.");
99         }
100
101         /**
102          * @see edu.internet2.middleware.shibboleth.aa.arp.ArpRepository#update(Arp)
103          */
104         public void update(Arp arp) throws ArpRepositoryException {
105
106                 throw new ArpRepositoryException("Update not implemented for FileSystemArpRepository.");
107         }
108
109         /**
110          * @throws ParserConfigurationException 
111          * @see edu.internet2.middleware.shibboleth.aa.arp.provider.BaseArpRepository#retrieveSiteArpXml()
112          */
113         protected Element retrieveSiteArpXml() throws IOException, SAXException, ParserConfigurationException {
114
115                 String fileName = dataStorePath + siteArpFileName;
116                 log.debug("Attempting to load site ARP from: (" + fileName + ").");
117                 return retrieveArpXml(fileName);
118
119         }
120
121         private Element retrieveArpXml(String fileName) throws SAXException, IOException, ParserConfigurationException {
122
123                 try {
124                         ShibResource resource = new ShibResource(fileName, this.getClass());
125                         if (!resource.getFile().exists()) {
126                                 log.debug("No ARP found.");
127                                 return null;
128                         }
129
130                         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
131                         factory.setValidating(false);
132                         factory.setNamespaceAware(true);
133                         return factory.newDocumentBuilder().parse(new InputSource(resource.getInputStream())).getDocumentElement();
134
135                 } catch (ShibResource.ResourceNotAvailableException e) {
136                         log.debug("No ARP found.");
137                         return null;
138                 }
139         }
140
141         /**
142          * @throws ParserConfigurationException 
143          * @see edu.internet2.middleware.shibboleth.aa.arp.provider.BaseArpRepository#retrieveUserArpXml(Principal)
144          */
145         protected Element retrieveUserArpXml(Principal principal) throws IOException, SAXException, ParserConfigurationException {
146
147                 String fileName = dataStorePath + "arp.user." + principal.getName() + ".xml";
148                 log.debug("Attempting to load user (" + principal.getName() + ") ARP from: (" + fileName + ").");
149                 return retrieveArpXml(fileName);
150         }
151
152 }