    1   /*
    2    * Copyright 1999-2004 The Apache Software Foundation
    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  package org.apache.commons.jxpath;
    17
    18  import java.net.URL;
    19
    20  import javax.xml.transform.Source;
    21  import javax.xml.transform.Transformer;
    22  import javax.xml.transform.TransformerFactory;
    23  import javax.xml.transform.dom.DOMResult;
    24
    25  import org.apache.commons.jxpath.xml.DocumentContainer;
    26  import org.w3c.dom.Document;
    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 org.apache.commons.jxpath.xml.DocumentContainer
    39   *
    40   * @author Dmitri Plotnikov
    41   * @version $Revision: 1.11 $ $Date: 2004/02/29 14:17:42 $
    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      private String parser;
    50
    51      /***
    52       * @param  URL is a URL for an XML file. Use getClass().getResource
    53       * (resourceName) to load XML from a resource file.
    54       */
    55      public XMLDocumentContainer(URL xmlURL) {
    56          delegate = new DocumentContainer(xmlURL);
    57      }
    58
    59      public XMLDocumentContainer(Source source) {
    60          this.source = source;
    61          if (source == null) {
    62              throw new RuntimeException("Source is null");
    63          }
    64      }
    65
    66      /***
    67       * Reads XML, caches it internally and returns the Document.
    68       */
    69      public Object getValue() {
    70          if (document == null) {
    71              try {
    72                  if (source != null) {
    73                      DOMResult result = new DOMResult();
    74                      Transformer trans =
    75                          TransformerFactory.newInstance().newTransformer();
    76                      trans.transform(source, result);
    77                      document = (Document) result.getNode();
    78                  }
    79                  else {
    80                      document = delegate.getValue();
    81                  }
    82              }
    83              catch (Exception ex) {
    84                  throw new JXPathException(
    85                      "Cannot read XML from: "
    86                          + (xmlURL != null
    87                              ? xmlURL.toString()
    88                              : (source != null
    89                                  ? source.getSystemId()
    90                                  : "<<undefined source>>")),
    91                      ex);
    92              }
    93          }
    94          return document;
    95      }
    96
    97      /***
    98       * Throws an UnsupportedOperationException
    99       */
    100     public void setValue(Object value) {
    101         throw new UnsupportedOperationException();
    102     }
    103 }