View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3.builder;
18  
19  import java.lang.reflect.Type;
20  import java.util.Objects;
21  
22  import org.apache.commons.lang3.ObjectUtils;
23  import org.apache.commons.lang3.reflect.TypeUtils;
24  import org.apache.commons.lang3.tuple.Pair;
25  
26  /**
27   * A {@link Diff} contains the differences between two {@link Diffable} class
28   * fields.
29   *
30   * <p>
31   * Typically, {@link Diff}s are retrieved by using a {@link DiffBuilder} to
32   * produce a {@link DiffResult}, containing the differences between two objects.
33   * </p>
34   *
35   * @param <T>
36   *            The type of object contained within this {@link Diff}. Differences
37   *            between primitive objects are stored as their Object wrapper
38   *            equivalent.
39   * @since 3.3
40   */
41  public abstract class Diff<T> extends Pair<T, T> {
42  
43      private static final long serialVersionUID = 1L;
44  
45      /** The field type. */
46      private final Type type;
47  
48      /** The field name. */
49      private final String fieldName;
50  
51      /**
52       * Constructs a new {@link Diff} for the given field name.
53       *
54       * @param fieldName
55       *            the field name
56       */
57      protected Diff(final String fieldName) {
58          this.fieldName = Objects.requireNonNull(fieldName);
59          this.type = ObjectUtils.defaultIfNull(TypeUtils.getTypeArguments(getClass(), Diff.class).get(Diff.class.getTypeParameters()[0]), Object.class);
60      }
61  
62      Diff(final String fieldName, final Type type) {
63          this.fieldName = Objects.requireNonNull(fieldName);
64          this.type = Objects.requireNonNull(type);
65      }
66  
67      /**
68       * Gets the name of the field.
69       *
70       * @return the field name
71       */
72      public final String getFieldName() {
73          return fieldName;
74      }
75  
76      /**
77       * Gets the type of the field.
78       *
79       * @return the field type
80       * @deprecated Unused, will be removed in 4.0.0.
81       */
82      @Deprecated
83      public final Type getType() {
84          return type;
85      }
86  
87      /**
88       * Throws {@link UnsupportedOperationException}.
89       *
90       * @param value
91       *            ignored
92       * @return nothing
93       */
94      @Override
95      public final T setValue(final T value) {
96          throw new UnsupportedOperationException("Cannot alter Diff object.");
97      }
98  
99      /**
100      * Returns a {@link String} representation of the {@link Diff}, with the
101      * following format:
102      *
103      * <pre>
104      * [fieldname: left-value, right-value]
105      * </pre>
106      *
107      * @return the string representation
108      */
109     @Override
110     public final String toString() {
111         return String.format("[%s: %s, %s]", fieldName, getLeft(), getRight());
112     }
113 }