All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.axiom.om.dom.DOMMetaFactory Maven / Gradle / Ivy

There is a newer version: 5.0.22
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.axiom.om.dom;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMComment;
import org.apache.axiom.om.OMContainer;
import org.apache.axiom.om.OMDocType;
import org.apache.axiom.om.OMDocument;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMEntityReference;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMInformationItem;
import org.apache.axiom.om.OMMetaFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.OMProcessingInstruction;
import org.apache.axiom.om.OMText;
import org.apache.axiom.soap.SOAPFactory;
import org.w3c.dom.Attr;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.DOMException;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.Node;
import org.w3c.dom.ProcessingInstruction;
import org.w3c.dom.Text;

/**
 * Extension interface for {@link OMMetaFactory} implementations that support
 * {@link OMAbstractFactory#FEATURE_DOM}.
 * 

* Axiom implementations supporting this feature MUST conform to the Axiom API as well as the DOM * API, and nodes created by the implementation MUST implement both the Axiom interfaces and the DOM * interfaces corresponding, as specified by the following table: *

*

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Mapping between Axiom and DOM interfaces
Axiom interfaceDOM interface
{@link OMDocument}{@link Document}
{@link OMDocType}{@link DocumentType}
{@link OMElement}{@link Element} [1]
{@link OMAttribute}{@link Attr} [2]
{@link OMText} with type {@link OMNode#TEXT_NODE} or {@link OMNode#SPACE_NODE}{@link Text}
{@link OMText} with type {@link OMNode#CDATA_SECTION_NODE}{@link CDATASection}
{@link OMComment}{@link Comment}
{@link OMProcessingInstruction}{@link ProcessingInstruction}
{@link OMEntityReference}{@link EntityReference}
-{@link DocumentFragment}
*
*
[1] *
Only applies to elements created using DOM 2 methods such as * {@link Document#createElementNS(String, String)}. *
[2] *
Only applies to attributes created using DOM 2 methods such as * {@link Document#createAttributeNS(String, String)} and that don't represent namespace * declarations. Axiom doesn't use {@link OMAttribute} to represent namespace declarations, and * {@link OMNamespace} instances representing namespace declarations are not expected to implement * {@link Attr}. *
*

* The Axiom API is designed such that nodes are created using a factory ({@link OMFactory} or * {@link SOAPFactory}) that is expected to be a singleton and stateless. On the other hand, in the * DOM API, the {@link Document} instance plays the role of node factory, and each node (explicitly * or implicitly) keeps a reference to the {@link Document} instance from which it was created (the * owner document). To address this difference in a consistent way and to make it possible to * use both the Axiom API and the DOM API on the same object model instance, the implementation MUST * conform to the following rules: *

    *
  1. Nodes created using the Axiom API and for which a parent node is specified will have as their * owner document the owner document of the parent. Note that this is simply a consequence of the * fact that DOM is designed such that two nodes that are part of the same tree must have the same * owner document. *
  2. Nodes created using the Axiom API and for which no parent node is specified will get a new * owner document. This applies to methods in {@link OMFactory} that don't have an * {@link OMContainer} parameter or that are invoked with a null {@link OMContainer} * as well as to methods such as {@link OMElement#cloneOMElement()}. *
  3. When the Axiom API is used to add a node A as a child of another node B, then the owner * document of B becomes the new owner document of A and all its descendants. In DOM parlance, this * means that node A is automatically adopted by the owner document of B. This implies that no * method defined by the Axiom API will ever trigger a {@link DOMException#WRONG_DOCUMENT_ERR} * error. *
  4. When a node is detached from its parent using the Axiom API, it will get a new owner * document. This rule exists for consistency because together with the other rules it implies that * every tree has a distinct owner document as long as only the Axiom API is used to manipulate the * nodes. That rule applies to the following methods: *
      *
    • {@link OMNode#detach()} *
    • {@link OMElement#removeAttribute(OMAttribute)} *
    • {@link OMElement#setText(String)} and {@link OMElement#setText(QName)} (in the case where the * side effect of the invocation is to detach preexisting nodes) *
    • {@link OMElement#addAttribute(OMAttribute)} and * {@link OMElement#addAttribute(String, String, OMNamespace)} (in the case where the new attribute * replaces an existing one, which will be removed from its owner) *
    *
  5. {@link Document} instances created using the {@link DocumentBuilderFactory} and * {@link DOMImplementation} APIs as well as the {@link Document} instances implicitly created (as * owner documents) by the Axiom API will have as their {@link OMFactory} (as reported by * {@link OMInformationItem#getOMFactory()}) the instance returned by * {@link OMMetaFactory#getOMFactory()}. Any additional nodes created using the DOM API will inherit * the {@link OMFactory} of the owner document. *
*

* The implementation SHOULD instantiate the implicitly created owner documents lazily (typically * when explicitly requested using DOM's {@link Node#getOwnerDocument()} API) to avoid creating a * large number of temporary {@link Document} instances when the Axiom API is used. Note however * that this has no impact on the behavior visible to the application code. *

* As indicated in the table above, although {@link Attr} and {@link DocumentFragment} nodes are * parent nodes in the DOM API, they MUST NOT implement the {@link OMContainer} interface. Only * {@link OMDocument} and {@link OMElement} instances can implement that interface. * */ public interface DOMMetaFactory extends OMMetaFactory { /** * Create a new {@link DocumentBuilderFactory}. Since Axiom doesn't support non namespace aware * processing, the returned factory is always configured with namespaceAware set to * true (in contrast to the default settings used by * {@link DocumentBuilderFactory#newInstance()}). * * @return the factory instance */ DocumentBuilderFactory newDocumentBuilderFactory(); /** * Get the {@link DOMImplementation} instance. * * @return the {@link DOMImplementation} instance */ DOMImplementation getDOMImplementation(); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy