1 /*
   2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
   3  * @LastModified: Oct 2017
   4  */
   5 /*
   6  * Licensed to the Apache Software Foundation (ASF) under one or more
   7  * contributor license agreements.  See the NOTICE file distributed with
   8  * this work for additional information regarding copyright ownership.
   9  * The ASF licenses this file to You under the Apache License, Version 2.0
  10  * (the "License"); you may not use this file except in compliance with
  11  * the License.  You may obtain a copy of the License at
  12  *
  13  *      http://www.apache.org/licenses/LICENSE-2.0
  14  *
  15  * Unless required by applicable law or agreed to in writing, software
  16  * distributed under the License is distributed on an "AS IS" BASIS,
  17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18  * See the License for the specific language governing permissions and
  19  * limitations under the License.
  20  */
  21 
  22 package com.sun.org.apache.xerces.internal.dom;
  23 
  24 import com.sun.org.apache.xerces.internal.impl.xs.XSImplementationImpl;
  25 import java.util.ArrayList;
  26 import java.util.List;
  27 import org.w3c.dom.DOMImplementation;
  28 import org.w3c.dom.DOMImplementationList;
  29 
  30 /**
  31  * Allows to retrieve <code>XSImplementation</code>, DOM Level 3 Core and LS implementations
  32  * and PSVI implementation.
  33  * <p>See also the
  34  * <a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#DOMImplementationSource'>
  35  * Document Object Model (DOM) Level 3 Core Specification</a>.
  36  *
  37  * @xerces.internal
  38  *
  39  * @author Elena Litani, IBM
  40  */
  41 public class DOMXSImplementationSourceImpl
  42     extends DOMImplementationSourceImpl {
  43 
  44     /**
  45      * A method to request a DOM implementation.
  46      * @param features A string that specifies which features are required.
  47      *   This is a space separated list in which each feature is specified
  48      *   by its name optionally followed by a space and a version number.
  49      *   This is something like: "XML 1.0 Traversal Events 2.0"
  50      * @return An implementation that has the desired features, or
  51      *   <code>null</code> if this source has none.
  52      */
  53     public DOMImplementation getDOMImplementation(String features) {
  54         DOMImplementation impl = super.getDOMImplementation(features);
  55         if (impl != null){
  56             return impl;
  57         }
  58         // if not try the PSVIDOMImplementation
  59         impl = PSVIDOMImplementationImpl.getDOMImplementation();
  60         if (testImpl(impl, features)) {
  61             return impl;
  62         }
  63         // if not try the XSImplementation
  64         impl = XSImplementationImpl.getDOMImplementation();
  65         if (testImpl(impl, features)) {
  66             return impl;
  67         }
  68 
  69         return null;
  70     }
  71 
  72     /**
  73      * A method to request a list of DOM implementations that support the
  74      * specified features and versions, as specified in .
  75      * @param features A string that specifies which features and versions
  76      *   are required. This is a space separated list in which each feature
  77      *   is specified by its name optionally followed by a space and a
  78      *   version number. This is something like: "XML 3.0 Traversal +Events
  79      *   2.0"
  80      * @return A list of DOM implementations that support the desired
  81      *   features.
  82      */
  83     public DOMImplementationList getDOMImplementationList(String features) {
  84         final List<DOMImplementation> implementations = new ArrayList<>();
  85 
  86         // first check whether the CoreDOMImplementation would do
  87         DOMImplementationList list = super.getDOMImplementationList(features);
  88         //Add core DOMImplementations
  89         for (int i=0; i < list.getLength(); i++ ) {
  90             implementations.add(list.item(i));
  91         }
  92 
  93         DOMImplementation impl = PSVIDOMImplementationImpl.getDOMImplementation();
  94         if (testImpl(impl, features)) {
  95             implementations.add(impl);
  96         }
  97 
  98         impl = XSImplementationImpl.getDOMImplementation();
  99         if (testImpl(impl, features)) {
 100             implementations.add(impl);
 101         }
 102         return new DOMImplementationListImpl(implementations);
 103     }
 104 }