/*
 * 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.commons.configuration2.tree.xpath;

import org.apache.commons.configuration2.tree.NodeHandler;
import org.apache.commons.configuration2.tree.QueryResult;
import org.apache.commons.jxpath.ri.Compiler;
import org.apache.commons.jxpath.ri.QName;
import org.apache.commons.jxpath.ri.compiler.NodeTest;
import org.apache.commons.jxpath.ri.compiler.NodeTypeTest;
import org.apache.commons.jxpath.ri.model.NodePointer;

A specialized NodePointer implementation for the attributes of a configuration node.

Type parameters:
  • <T> – the type of the nodes this pointer deals with
Since:2.0
/** * <p> * A specialized {@code NodePointer} implementation for the attributes of * a configuration node. * </p> * * @since 2.0 * @param <T> the type of the nodes this pointer deals with */
class ConfigurationAttributePointer<T> extends NodePointer {
The serial version UID.
/** * The serial version UID. */
private static final long serialVersionUID = 5504551041716043748L;
Stores information about the represented attribute.
/** Stores information about the represented attribute. */
private final QueryResult<T> attributeResult;
Creates a new instance of ConfigurationAttributePointer.
Params:
  • parent – the parent node pointer
  • attrName – the name of the managed attribute
/** * Creates a new instance of {@code ConfigurationAttributePointer}. * * @param parent the parent node pointer * @param attrName the name of the managed attribute */
public ConfigurationAttributePointer(final ConfigurationNodePointer<T> parent, final String attrName) { super(parent); attributeResult = QueryResult.createAttributeResult( parent.getConfigurationNode(), attrName); }
Returns a reference to the parent node pointer.
Returns:the parent pointer
/** * Returns a reference to the parent node pointer. * * @return the parent pointer */
public ConfigurationNodePointer<T> getParentPointer() { // safe to cast because the constructor only expects pointers of this // type @SuppressWarnings("unchecked") final ConfigurationNodePointer<T> configurationNodePointer = (ConfigurationNodePointer<T>) getParent(); return configurationNodePointer; }
Compares two child node pointers. Attributes do not have any children, so this is just a dummy implementation.
Params:
  • p1 – the first pointer
  • p2 – the second pointer
Returns:the order of these pointers
/** * Compares two child node pointers. Attributes do not have any children, so * this is just a dummy implementation. * * @param p1 the first pointer * @param p2 the second pointer * @return the order of these pointers */
@Override public int compareChildNodePointers(final NodePointer p1, final NodePointer p2) { return 0; }
Returns the base value. We return the value.
Returns:the base value
/** * Returns the base value. We return the value. * * @return the base value */
@Override public Object getBaseValue() { return getValue(); }
Returns the immediate node. This is actually a QueryResult object describing the represented attribute.
Returns:the immediate node
/** * Returns the immediate node. This is actually a {@link QueryResult} * object describing the represented attribute. * * @return the immediate node */
@Override public Object getImmediateNode() { return attributeResult; }
Returns the length of the represented node. This is always 1.
Returns:the length
/** * Returns the length of the represented node. This is always 1. * * @return the length */
@Override public int getLength() { return 1; }
Returns the name of this node. This is the attribute name.
Returns:the name of this node
/** * Returns the name of this node. This is the attribute name. * * @return the name of this node */
@Override public QName getName() { return new QName(null, attributeResult.getAttributeName()); }
Returns a flag whether the represented node is a collection. This is not the case.
Returns:the collection flag
/** * Returns a flag whether the represented node is a collection. This is not * the case. * * @return the collection flag */
@Override public boolean isCollection() { return false; }
Returns a flag whether the represented node is a leaf. This is the case for attributes.
Returns:the leaf flag
/** * Returns a flag whether the represented node is a leaf. This is the case * for attributes. * * @return the leaf flag */
@Override public boolean isLeaf() { return true; }
Returns a flag whether this node is an attribute. Of course, this is the case.
Returns:the attribute flag
/** * Returns a flag whether this node is an attribute. Of course, this is the * case. * * @return the attribute flag */
@Override public boolean isAttribute() { return true; }
Returns the value of this node.
Returns:this node's value
/** * Returns the value of this node. * * @return this node's value */
@Override public Object getValue() { return attributeResult.getAttributeValue(getNodeHandler()); }
Sets the value of this node. This is not supported because the classes of the XPathExpressionEngine are only used for queries. This implementation always throws an exception.
Params:
  • value – the new value
/** * Sets the value of this node. This is not supported because the classes of * the {@code XPathExpressionEngine} are only used for queries. This * implementation always throws an exception. * * @param value the new value */
@Override public void setValue(final Object value) { throw new UnsupportedOperationException( "Updating the value is not supported!"); }
Tests if this node matches the given test. Attribute nodes are text nodes, too, because they can contain a value.
Params:
  • test – the test object
Returns:a flag if this node corresponds to the test
/** * Tests if this node matches the given test. Attribute nodes are text * nodes, too, because they can contain a value. * * @param test the test object * @return a flag if this node corresponds to the test */
@Override public boolean testNode(final NodeTest test) { if (test instanceof NodeTypeTest && ((NodeTypeTest) test).getNodeType() == Compiler.NODE_TYPE_TEXT) { return true; } return super.testNode(test); }
Returns a reference to the current node handler. The handler is obtained from the parent pointer.
Returns:the node handler
/** * Returns a reference to the current node handler. The handler is obtained * from the parent pointer. * * @return the node handler */
private NodeHandler<T> getNodeHandler() { return getParentPointer().getNodeHandler(); } }