/*   Copyright 2004 The Apache Software Foundation
 *
 *   Licensed 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.xmlbeans.impl.common;

import javax.xml.namespace.QName;

class XPathStep {

    final boolean _attr;
    final boolean _deep;

    int _flags;

    final QName _name;

    XPathStep _next, _prev;

    boolean _hasBacktrack;
    XPathStep _backtrack;

    XPathStep(boolean deep, boolean attr, QName name) {
        _name = name;

        _deep = deep;
        _attr = attr;

        int flags = 0;

        if (_deep || !_attr) {
            flags |= XPathExecutionContext.DESCEND;
        }

        if (_attr) {
            flags |= XPathExecutionContext.ATTRS;
        }

        _flags = flags;
    }

    boolean isWild() {
        return _name.getLocalPart().length() == 0;
    }

    boolean match(QName name) {
        String local = _name.getLocalPart();
        String nameLocal = name.getLocalPart();

        int localLength = local.length();

        // match any name to _name when _name is empty ""@""
        if (localLength == 0) {
            String uri = _name.getNamespaceURI();
            return uri.isEmpty() || uri.equals(name.getNamespaceURI());
        }

        if (localLength != nameLocal.length()) {
            return false;
        }

        String uri = _name.getNamespaceURI();
        String nameUri = name.getNamespaceURI();

        if (uri.length() != nameUri.length()) {
            return false;
        }

        return local.equals(nameLocal) && uri.equals(nameUri);
    }
}

