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.ri.model.beans;
018    
019    import org.apache.commons.jxpath.ri.QName;
020    import org.apache.commons.jxpath.ri.compiler.NodeTest;
021    import org.apache.commons.jxpath.ri.model.NodePointer;
022    
023    /**
024     * A Pointer that points to the "lang" attribute of a JavaBean. The value
025     * of the attribute is based on the locale supplied to it in the constructor.
026     *
027     * @author Dmitri Plotnikov
028     * @version $Revision: 652884 $ $Date: 2008-05-02 15:02:00 -0500 (Fri, 02 May 2008) $
029     */
030    public class LangAttributePointer extends NodePointer {
031    
032        private static final long serialVersionUID = -8665319197100034134L;
033    
034        /**
035         * Create a new LangAttributePointer.
036         * @param parent parent pointer.
037         */
038        public LangAttributePointer(NodePointer parent) {
039            super(parent);
040        }
041    
042        public QName getName() {
043            return new QName("xml", "lang");
044        }
045    
046        public String getNamespaceURI() {
047            return null;
048        }
049    
050        public boolean isCollection() {
051            return false;
052        }
053    
054        public int getLength() {
055            return 1;
056        }
057    
058        public Object getBaseValue() {
059            return parent.getLocale().toString().replace('_', '-');
060        }
061    
062        public Object getImmediateNode() {
063            return getBaseValue();
064        }
065    
066        public boolean isLeaf() {
067            return true;
068        }
069    
070        /**
071         * {@inheritDoc}
072         *
073         * Throws UnsupportedOperationException.
074         * @param value Object
075         */
076        public void setValue(Object value) {
077            throw new UnsupportedOperationException(
078                    "Cannot change locale using the 'lang' attribute");
079        }
080    
081        public String asPath() {
082            StringBuffer buffer = new StringBuffer();
083            if (parent != null) {
084                buffer.append(parent.asPath());
085                if (buffer.length() == 0
086                    || buffer.charAt(buffer.length() - 1) != '/') {
087                    buffer.append('/');
088                }
089            }
090            buffer.append("@xml:lang");
091            return buffer.toString();
092        }
093    
094        public int hashCode() {
095            return 0;
096        }
097    
098        public boolean equals(Object object) {
099            return object instanceof LangAttributePointer;
100        }
101    
102        public boolean testNode(NodeTest test) {
103            return false;
104        }
105    
106        public int compareChildNodePointers(
107            NodePointer pointer1,
108            NodePointer pointer2) {
109            // Won't happen - lang attributes don't have children
110            return 0;
111        }
112    }