001    /*
002     * Created on Apr 3, 2009
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005     * in compliance with the License. You may obtain a copy of the License at
006     *
007     * http://www.apache.org/licenses/LICENSE-2.0
008     *
009     * Unless required by applicable law or agreed to in writing, software distributed under the License
010     * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011     * or implied. See the License for the specific language governing permissions and limitations under
012     * the License.
013     *
014     * Copyright @2009 the original author or authors.
015     */
016    package org.fest.swing.junit.xml;
017    
018    import static java.lang.String.valueOf;
019    import static org.fest.util.Objects.*;
020    import static org.fest.util.Strings.concat;
021    import static org.fest.util.Strings.quote;
022    
023    /**
024     * Understands an attribute of a <code>{@link XmlNode}</code>. This class is intended for internal use only.  It only
025     * provides the necessary functionality needed by the FEST-Swing JUnit extension.
026     *
027     * @author Alex Ruiz
028     */
029    public class XmlAttribute {
030    
031      private final String name;
032      private final String value;
033    
034      /**
035       * Creates a new <code>{@link XmlAttributeBuilder}</code>.
036       * @param name the name of the attribute that the created builder will build.
037       * @return the created <code>XmlAttributeBuilder</code>.
038       */
039      public static XmlAttributeBuilder name(String name) {
040        return new XmlAttributeBuilder(name);
041      }
042    
043      /**
044       * Understands creation of <code>{@link XmlAttribute}</code>s.
045       *
046       * @author Alex Ruiz
047       */
048      public static class XmlAttributeBuilder {
049        private final String name;
050    
051        XmlAttributeBuilder(String name) {
052          this.name = name;
053        }
054    
055        /**
056         * Creates a new <code>{@link XmlAttribute}</code> using the attribute name passed when this builder was created and
057         * the given value.
058         * @param value the value of the attribute to create.
059         * @return the created <code>XmlAttribute</code>.
060         */
061        public XmlAttribute value(String value) {
062          return new XmlAttribute(name, value);
063        }
064    
065        /**
066         * Creates a new <code>{@link XmlAttribute}</code> using the attribute name passed when this builder was created and
067         * the given value.
068         * @param value the value of the attribute to create.
069         * @return the created <code>XmlAttribute</code>.
070         */
071        public XmlAttribute value(long value) {
072          return new XmlAttribute(name, valueOf(value));
073        }
074    
075        /**
076         * Creates a new <code>{@link XmlAttribute}</code> using the attribute name passed when this builder was created and
077         * the given value.
078         * @param value the value of the attribute to create.
079         * @return the created <code>XmlAttribute</code>.
080         */
081        public XmlAttribute value(double value) {
082          return new XmlAttribute(name, valueOf(value));
083        }
084      }
085    
086      XmlAttribute(String name, String value) {
087        this.name = name;
088        this.value = value;
089      }
090    
091      /**
092       * Returns the name of this attribute.
093       * @return the name of this attribute.
094       */
095      public String name() { return name; }
096    
097      /**
098       * Returns the value of this attribute.
099       * @return the value of this attribute.
100       */
101      public String value() { return value; }
102    
103      /**
104       * Indicates whether the given <code>Object</code> is equal to this attribute. To be equal, the given object should be
105       * a <code>{@link XmlAttribute}</code> with its name and value equal to the ones in this attribute.
106       * @param obj the <code>Object</code> to compare to.
107       * @return <code>true</code> if the given <code>Object</code> is equal to this attribute, <code>false</code>
108       * otherwise.
109       */
110      @Override public boolean equals(Object obj) {
111        if (this == obj) return true;
112        if (obj == null) return false;
113        if (getClass() != obj.getClass()) return false;
114        XmlAttribute other = (XmlAttribute) obj;
115        if (!areEqual(name, other.name)) return false;
116        return areEqual(value, other.value);
117      }
118    
119      /**
120       * Returns the hash code of this attribute, based on its name and value.
121       * @return the hash code of this attribute.
122       */
123      @Override public int hashCode() {
124        int result = 1;
125        result = HASH_CODE_PRIME * result + hashCodeFor(name);
126        result = HASH_CODE_PRIME * result + hashCodeFor(value);
127        return result;
128      }
129    
130      /**
131       * Returns a <code>String</code> representation of this attribute.
132       * @return a <code>String</code> representation of this attribute.
133       */
134      @Override public String toString() {
135        return concat(
136            getClass().getSimpleName(), "[",
137            "name=", quote(name), ",",
138            "value=", quote(value), "]"
139        );
140      }
141    }