001 /*
002 * JBoss, Home of Professional Open Source.
003 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
004 * as indicated by the @author tags. See the copyright.txt file in the
005 * distribution for a full listing of individual contributors.
006 *
007 * This is free software; you can redistribute it and/or modify it
008 * under the terms of the GNU Lesser General Public License as
009 * published by the Free Software Foundation; either version 2.1 of
010 * the License, or (at your option) any later version.
011 *
012 * This software is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this software; if not, write to the Free
019 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021 */
022 package org.jboss.dna.connector.federation.merge;
023
024 import java.util.UUID;
025 import org.jboss.dna.graph.commands.CreateNodeCommand;
026 import org.jboss.dna.graph.commands.NodeConflictBehavior;
027 import org.jboss.dna.graph.commands.basic.BasicGetNodeCommand;
028 import org.jboss.dna.graph.properties.Path;
029
030 /**
031 * An in-memory (and temporary) representation of a federated node and it's merged properties and children.
032 *
033 * @author Randall Hauch
034 */
035 public class FederatedNode extends BasicGetNodeCommand implements CreateNodeCommand {
036
037 protected static final NodeConflictBehavior DEFAULT_CONFLICT_BEHAVIOR = NodeConflictBehavior.UPDATE;
038
039 private static final long serialVersionUID = 1L;
040
041 private UUID uuid;
042 private MergePlan mergePlan;
043 private NodeConflictBehavior nodeConflictBehavior = DEFAULT_CONFLICT_BEHAVIOR;
044
045 /**
046 * Create a federated node given the path and UUID.
047 *
048 * @param path the path of the federated node; may not be null
049 * @param uuid the UUID of the federated node; may not be null
050 */
051 public FederatedNode( Path path,
052 UUID uuid ) {
053 super(path);
054 assert uuid != null;
055 this.uuid = uuid;
056 }
057
058 /**
059 * Get the UUID for this federated node.
060 *
061 * @return the UUID; never null
062 */
063 public UUID getUuid() {
064 return uuid;
065 }
066
067 /**
068 * @param uuid Sets uuid to the specified value.
069 */
070 public void setUuid( UUID uuid ) {
071 this.uuid = uuid;
072 }
073
074 /**
075 * Get the merge plan for this federated node
076 *
077 * @return the merge plan, or null if there is no merge plan
078 */
079 public MergePlan getMergePlan() {
080 return mergePlan;
081 }
082
083 /**
084 * Set the merge plan for this federated node
085 *
086 * @param mergePlan the new merge plan for this federated node; may be null
087 */
088 public void setMergePlan( MergePlan mergePlan ) {
089 this.mergePlan = mergePlan;
090 }
091
092 /**
093 * {@inheritDoc}
094 *
095 * @see java.lang.Comparable#compareTo(java.lang.Object)
096 */
097 public int compareTo( CreateNodeCommand that ) {
098 if (this == that) return 0;
099 return this.getPath().compareTo(that.getPath());
100 }
101
102 /**
103 * {@inheritDoc}
104 *
105 * @see java.lang.Object#hashCode()
106 */
107 @Override
108 public int hashCode() {
109 return this.uuid.hashCode();
110 }
111
112 /**
113 * {@inheritDoc}
114 *
115 * @see java.lang.Object#equals(java.lang.Object)
116 */
117 @Override
118 public boolean equals( Object obj ) {
119 if (obj == this) return true;
120 if (obj instanceof FederatedNode) {
121 FederatedNode that = (FederatedNode)obj;
122 if (this.getPath().equals(that.getPath())) return true;
123 if (this.getUuid().equals(that.getUuid())) return true;
124 }
125 return false;
126 }
127
128 /**
129 * {@inheritDoc}
130 *
131 * @see java.lang.Object#toString()
132 */
133 @Override
134 public String toString() {
135 return getPath().toString() + " (" + this.getUuid() + ")";
136 }
137
138 /**
139 * {@inheritDoc}
140 *
141 * @see org.jboss.dna.graph.commands.CreateNodeCommand#getConflictBehavior()
142 */
143 public NodeConflictBehavior getConflictBehavior() {
144 return this.nodeConflictBehavior;
145 }
146
147 /**
148 * Set the behavior when node conflicts arise.
149 *
150 * @param nodeConflictBehavior the conflict behavior, or null if the default should be used
151 */
152 public void setConflictBehavior( NodeConflictBehavior nodeConflictBehavior ) {
153 this.nodeConflictBehavior = nodeConflictBehavior != null ? nodeConflictBehavior : DEFAULT_CONFLICT_BEHAVIOR;
154 }
155
156 }