001: /*
002: * GeoTools - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2002-2006, GeoTools Project Managment Committee (PMC)
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation;
009: * version 2.1 of the License.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: */
016: package org.geotools.data.postgis;
017:
018: import java.util.ArrayList;
019: import java.util.Collections;
020: import java.util.List;
021:
022: import org.geotools.data.DataUtilities;
023: import org.geotools.feature.Feature;
024:
025: /**
026: * Represents the difference between two states of the same feature.
027: *
028: * @author aaime
029: * @since 2.4
030: */
031: public class FeatureDiff {
032:
033: /**
034: * Feature does not exists in fromVersion, has been created in the meantime (change map contains
035: * all attributes in this case)
036: */
037: public static final int INSERTED = 0;
038:
039: /**
040: * Feature exists in both versions, but has been modified
041: */
042: public static final int UPDATED = 1;
043:
044: /**
045: * Feature existed in fromVersion, but has been deleted (change map is empty)
046: */
047: public static final int DELETED = 2;
048:
049: String ID;
050:
051: int state;
052:
053: List changedAttributes;
054:
055: Feature feature;
056:
057: Feature oldFeature;
058:
059: /**
060: * Creates a new feature difference for a modified feature
061: *
062: * @param ID
063: * @param oldFeature
064: * @param newFeature
065: * @param changes
066: */
067: FeatureDiff(Feature oldFeature, Feature newFeature) {
068: super ();
069: if (oldFeature == null && newFeature == null)
070: throw new IllegalArgumentException(
071: "Both features are null, that's not a diff!");
072:
073: this .ID = oldFeature != null ? oldFeature.getID() : newFeature
074: .getID();
075: this .feature = newFeature;
076: this .oldFeature = oldFeature;
077: this .changedAttributes = Collections.EMPTY_LIST;
078: if (oldFeature == null) {
079: this .state = INSERTED;
080: } else if (newFeature == null) {
081: this .state = DELETED;
082: } else {
083: this .state = UPDATED;
084: List changedAttributes = new ArrayList();
085: for (int i = 0; i < oldFeature.getNumberOfAttributes(); i++) {
086: String attName = oldFeature.getFeatureType()
087: .getAttributeType(i).getName();
088: Object toAttribute = newFeature.getAttribute(attName);
089: Object fromAttribute = oldFeature.getAttribute(attName);
090: if (!DataUtilities.attributesEqual(fromAttribute,
091: toAttribute)) {
092: changedAttributes.add(attName);
093: }
094: }
095: this .changedAttributes = Collections
096: .unmodifiableList(changedAttributes);
097: }
098: }
099:
100: /**
101: * Returns a read only list of modified attribute names if state is {@link #UPDATED}, an empty
102: * list otherwise
103: *
104: * @return
105: */
106: public List getChangedAttributes() {
107: return changedAttributes;
108: }
109:
110: /**
111: * The feature ID
112: *
113: * @return
114: */
115: public String getID() {
116: return ID;
117: }
118:
119: /**
120: * The type of difference, either::
121: * <ul>
122: * <li>{@link #UPDATED}</li>
123: * <li>{@link #INSERTED}</li>
124: * <li>{@link #DELETED}</li>
125: * </ul>
126: *
127: * @return
128: */
129: public int getState() {
130: return state;
131: }
132:
133: /**
134: * Returns the inserted feature, if the state is {@link #INSERTED}, the new feature, if the
135: * state is {@link #UPDATED}, null otherwise
136: *
137: * @return
138: */
139: public Feature getFeature() {
140: return feature;
141: }
142:
143: /**
144: * Returns the old feature, if the state is {@link #UPDATED}, null otherwise
145: *
146: * @return
147: */
148: public Feature getOldFeature() {
149: return oldFeature;
150: }
151:
152: }
|