SDSS WAYF patch for multi-federation support
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / xml / SchemasResourceListImpl.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.xml;
18
19 import java.io.InputStream;
20
21 import org.apache.log4j.Logger;
22 import org.w3c.dom.Document;
23 import org.w3c.dom.Element;
24 import org.xml.sax.InputSource;
25
26 /**
27  *  
28  * Find Schemas as a list of resource files.
29  * 
30  * <p>Java resources are files found in the Classpath of the current
31  * ClassLoader. They may be in directories on disk, in jar files, or
32  * elsewhere. This class must be passed a list of resource names, but
33  * it uses the Java runtime to actually locate the xsd data.
34  * 
35  * @author Howard Gilbert
36  */
37 public class SchemasResourceListImpl extends SchemaStore {
38     
39     // This class is used by both the Idp and SP, so it must use
40     // a conventionally declared logger. The SP has a special logger
41     // setup so this package also logs to the init log.
42     private static Logger log = Logger.getLogger(SchemasResourceListImpl.class);
43     
44     private String resourceprefix = "/schemas/";
45     private String[] resourceNames = null;
46
47     /**
48      * @param resourcedir
49      */
50     public SchemasResourceListImpl(String resourcedir, String[] resources) {
51         this.resourceprefix = resourcedir;
52         this.resourceNames = resources;
53         this.loadBucket();
54     }
55     
56    
57     private void loadBucket() {
58                 for (int i=0;i<resourceNames.length;i++) {
59             String filename = resourceNames[i];
60             if (!filename.endsWith(".xsd")) {
61                 log.error(filename + " doesn't end in .xsd, ignoring it.");
62                 continue;
63             }
64             String resourceName = resourceprefix+filename;
65             InputStream inputStream =
66                 SchemasResourceListImpl.class.getResourceAsStream(
67                             resourceName);
68             if (inputStream == null) {
69                 log.error("Resource "+resourceName+" not found, ignoring it.");
70                 continue;
71             }
72             InputSource insrc = new InputSource(inputStream);
73             insrc.setSystemId(resourceName);
74            
75             // Non-validating parse to DOM
76             Document xsddom;
77                         try {
78                                 xsddom = Parser.loadDom(insrc,false);
79                         } catch (Exception e) {
80                                 log.error("Error parsing XML schema (" + resourceName + "): " + e);
81                                 continue;
82                         }
83             
84             // Get the target namespace from the root element
85             Element ele = xsddom.getDocumentElement();
86             if (!ele.getLocalName().equals("schema")) {
87                 log.error("Schema file wrong root element:"+resourceName);
88                 continue;
89             }
90             String targetNamespace = ele.getAttribute("targetNamespace");
91             if (targetNamespace==null || targetNamespace == "") {
92                 log.error("Schema has no targetNamespace: "+resourceName);
93                 continue;
94             }
95             
96             // Put the DOM in the Bucket keyed by namespace
97             if (bucket.containsKey(targetNamespace)) {
98                 log.debug("Replacing XSD for namespace: "+targetNamespace+" "+filename);
99             } else {
100                 log.debug("Defining XSD for namespace:  "+targetNamespace+" "+filename);
101             }
102             bucket.put(targetNamespace,xsddom);
103         }
104         }
105
106 }