    001    /*
    002     * Licensed to the Apache Software Foundation (ASF) under one or more
    003     * contributor license agreements.  See the NOTICE file distributed with
    004     * this work for additional information regarding copyright ownership.
    005     * The ASF licenses this file to You under the Apache License, Version 2.0
    006     * (the "License"); you may not use this file except in compliance with
    007     * the License.  You may obtain a copy of the License at
    008     *
    009     *     http://www.apache.org/licenses/LICENSE-2.0
    010     *
    011     * Unless required by applicable law or agreed to in writing, software
    012     * distributed under the License is distributed on an "AS IS" BASIS,
    013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014     * See the License for the specific language governing permissions and
    015     * limitations under the License.
    016     */
    017    package org.apache.commons.jxpath;
    018
    019    import java.util.Iterator;
    020
    021    /**
    022     * Represents a compiled XPath. The interpretation of compiled XPaths
    023     * may be faster, because it bypasses the compilation step. The reference
    024     * implementation of {@link JXPathContext} also globally caches some of the
    025     * results of compilation, so the direct use of JXPathContext is not
    026     * always less efficient than the use of CompiledExpression.
    027     * <p>
    028     * Use CompiledExpression only when there is a need to evaluate the
    029     * same expression multiple times and the CompiledExpression can be
    030     * conveniently cached.
    031     * <p>
    032     * To acquire a CompiledExpression, call {@link JXPathContext#compile
    033     * JXPathContext.compile}
    034     *
    035     * @author Dmitri Plotnikov
    036     * @version $Revision: 652845 $ $Date: 2008-05-02 12:46:46 -0500 (Fri, 02 May 2008) $
    037     */
    038    public interface CompiledExpression {
    039
    040        /**
    041         * Evaluates the xpath and returns the resulting object. Primitive
    042         * types are wrapped into objects.
    043         * @param context to evaluate
    044         * @return Object
    045         */
    046        Object getValue(JXPathContext context);
    047
    048        /**
    049         * Evaluates the xpath, converts the result to the specified class and
    050         * returns the resulting object.
    051         * @param context to evaluate
    052         * @param requiredType return type
    053         * @return Object
    054         */
    055        Object getValue(JXPathContext context, Class requiredType);
    056
    057        /**
    058         * Modifies the value of the property described by the supplied xpath.
    059         * Will throw an exception if one of the following conditions occurs:
    060         * <ul>
    061         * <li>The xpath does not in fact describe an existing property
    062         * <li>The property is not writable (no public, non-static set method)
    063         * </ul>
    064         * @param context base
    065         * @param value to set
    066         */
    067        void setValue(JXPathContext context, Object value);
    068
    069        /**
    070         * Creates intermediate elements of
    071         * the path by invoking an {@link AbstractFactory}, which should first be
    072         * installed on the context by calling {@link JXPathContext#setFactory}.
    073         * @param context base
    074         * @return Pointer created
    075         */
    076        Pointer createPath(JXPathContext context);
    077
    078        /**
    079         * The same as setValue, except it creates intermediate elements of
    080         * the path by invoking an {@link AbstractFactory}, which should first be
    081         * installed on the context by calling {@link JXPathContext#setFactory}.
    082         * <p>
    083         * Will throw an exception if one of the following conditions occurs:
    084         * <ul>
    085         * <li>Elements of the xpath aleady exist, by the path does not in
    086         *  fact describe an existing property
    087         * <li>The AbstractFactory fails to create an instance for an intermediate
    088         * element.
    089         * <li>The property is not writable (no public, non-static set method)
    090         * </ul>
    091         * @param context base
    092         * @param value to set
    093         * @return Pointer created
    094         */
    095        Pointer createPathAndSetValue(JXPathContext context, Object value);
    096
    097        /**
    098         * Traverses the xpath and returns a Iterator of all results found
    099         * for the path. If the xpath matches no properties
    100         * in the graph, the Iterator will not be null.
    101         * @param context base
    102         * @return Iterator
    103         */
    104        Iterator iterate(JXPathContext context);
    105
    106        /**
    107         * Traverses the xpath and returns a Pointer.
    108         * A Pointer provides easy access to a property.
    109         * If the xpath matches no properties
    110         * in the graph, the pointer will be null.
    111         * @param context base
    112         * @param xpath string
    113         * @return Pointer found
    114         */
    115        Pointer getPointer(JXPathContext context, String xpath);
    116
    117        /**
    118         * Traverses the xpath and returns an Iterator of Pointers.
    119         * A Pointer provides easy access to a property.
    120         * If the xpath matches no properties
    121         * in the graph, the Iterator be empty, but not null.
    122         * @param context to iterate
    123         * @return Iterator<Pointer>
    124         */
    125        Iterator iteratePointers(JXPathContext context);
    126
    127        /**
    128         * Remove the graph element described by this expression.
    129         * @param context base
    130         */
    131        void removePath(JXPathContext context);
    132
    133        /**
    134         * Remove all graph elements described by this expression.
    135         * @param context base
    136         */
    137        void removeAll(JXPathContext context);
    138    }