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
018package org.apache.commons.jxpath.ri;
019
020import java.io.Serializable;
021
022/**
023 * A qualified name: a combination of an optional namespace prefix and an local name.
024 */
025public class QName implements Serializable {
026
027    private static final long serialVersionUID = 7616199282015091496L;
028
029    /**
030     * Prefix.
031     */
032    private final String prefix;
033
034    /**
035     * Name.
036     */
037    private final String name;
038
039    /**
040     * Qualified name.
041     */
042    private final String qualifiedName;
043
044    /**
045     * Constructs a new QName.
046     *
047     * @param qualifiedName value
048     */
049    public QName(final String qualifiedName) {
050        this.qualifiedName = qualifiedName;
051        final int index = qualifiedName.indexOf(':');
052        prefix = index < 0 ? null : qualifiedName.substring(0, index);
053        name = index < 0 ? qualifiedName : qualifiedName.substring(index + 1);
054    }
055
056    /**
057     * Constructs a new QName.
058     *
059     * @param prefix    ns
060     * @param localName String
061     */
062    public QName(final String prefix, final String localName) {
063        this.prefix = prefix;
064        this.name = localName;
065        this.qualifiedName = prefix == null ? localName : prefix + ':' + localName;
066    }
067
068    @Override
069    public boolean equals(final Object object) {
070        if (this == object) {
071            return true;
072        }
073        if (!(object instanceof QName)) {
074            return false;
075        }
076        return qualifiedName.equals(((QName) object).qualifiedName);
077    }
078
079    /**
080     * Gets the local name.
081     *
082     * @return String
083     */
084    public String getName() {
085        return name;
086    }
087
088    /**
089     * Gets the prefix of this QName.
090     *
091     * @return String
092     */
093    public String getPrefix() {
094        return prefix;
095    }
096
097    @Override
098    public int hashCode() {
099        return name.hashCode();
100    }
101
102    @Override
103    public String toString() {
104        return qualifiedName;
105    }
106}