View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.jxpath;
18  
19  import java.net.URL;
20  
21  import javax.xml.transform.Source;
22  import javax.xml.transform.Transformer;
23  import javax.xml.transform.TransformerFactory;
24  import javax.xml.transform.dom.DOMResult;
25  
26  import org.apache.commons.jxpath.xml.DocumentContainer;
27  
28  /**
29   * An XML document container reads and parses XML only when it is
30   * accessed.  JXPath traverses Containers transparently -
31   * you use the same paths to access objects in containers as you
32   * do to access those objects directly.  You can create
33   * XMLDocumentContainers for various XML documents that may or
34   * may not be accessed by XPaths.  If they are, they will be automatically
35   * read, parsed and traversed. If they are not - they won't be
36   * read at all.
37   *
38   * @deprecated 1.1 Please use {@link DocumentContainer}
39   *
40   * @author Dmitri Plotnikov
41   * @version $Revision: 1234255 $ $Date: 2012-01-21 04:11:46 +0100 (Sa, 21 Jan 2012) $
42   */
43  public class XMLDocumentContainer implements Container {
44  
45      private DocumentContainer delegate;
46      private Object document;
47      private URL xmlURL;
48      private Source source;
49  
50      /**
51       * Create a new XMLDocumentContainer.
52       * @param xmlURL a URL for an XML file. Use getClass().getResource(resourceName)
53       *               to load XML from a resource file.
54       */
55      public XMLDocumentContainer(URL xmlURL) {
56          this.xmlURL = xmlURL;
57          delegate = new DocumentContainer(xmlURL);
58      }
59  
60      /**
61       * Create a new XMLDocumentContainer.
62       * @param source XML source
63       */
64      public XMLDocumentContainer(Source source) {
65          this.source = source;
66          if (source == null) {
67              throw new RuntimeException("Source is null");
68          }
69      }
70  
71      /**
72       * Reads XML, caches it internally and returns the Document.
73       * @return Object value
74       */
75      public Object getValue() {
76          if (document == null) {
77              try {
78                  if (source != null) {
79                      DOMResult result = new DOMResult();
80                      Transformer trans =
81                          TransformerFactory.newInstance().newTransformer();
82                      trans.transform(source, result);
83                      document = result.getNode();
84                  }
85                  else {
86                      document = delegate.getValue();
87                  }
88              }
89              catch (Exception ex) {
90                  throw new JXPathException(
91                      "Cannot read XML from: "
92                          + (xmlURL != null
93                              ? xmlURL.toString()
94                              : (source != null
95                                  ? source.getSystemId()
96                                  : "<<undefined source>>")),
97                      ex);
98              }
99          }
100         return document;
101     }
102 
103     /**
104      * Throws an UnsupportedOperationException
105      * @param value to set
106      */
107     public void setValue(Object value) {
108         throw new UnsupportedOperationException();
109     }
110 }