001 /*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License"). You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at
010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012 * See the License for the specific language governing permissions
013 * and limitations under the License.
014 *
015 * When distributing Covered Code, include this CDDL HEADER in each
016 * file and include the License file at
017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
018 * add the following below this CDDL HEADER, with the fields enclosed
019 * by brackets "[]" replaced with your own identifying information:
020 * Portions Copyright [yyyy] [name of copyright owner]
021 *
022 * CDDL HEADER END
023 *
024 *
025 * Copyright 2006-2008 Sun Microsystems, Inc.
026 */
027 package org.opends.server.replication.plugin;
028
029 import org.opends.server.replication.common.ChangeNumber;
030 import org.opends.server.replication.common.ServerState;
031 import org.opends.server.replication.protocol.UpdateMessage;
032 import org.opends.server.types.DN;
033 import org.opends.server.types.DirectoryException;
034 import org.opends.server.types.operation.PluginOperation;
035
036 /**
037 * This class is use to store an operation currently
038 * in progress and not yet committed in the database.
039 */
040 public class PendingChange implements Comparable<PendingChange>
041 {
042 private ChangeNumber changeNumber;
043 private boolean committed;
044 private UpdateMessage msg;
045 private PluginOperation op;
046 private ServerState dependencyState = null;
047 private DN targetDN = null;
048
049 /**
050 * Construct a new PendingChange.
051 * @param changeNumber the ChangeNumber of use
052 * @param op the operation to use
053 * @param msg the message to use (can be null for local operations)
054 */
055 public PendingChange(ChangeNumber changeNumber,
056 PluginOperation op,
057 UpdateMessage msg)
058 {
059 this.changeNumber = changeNumber;
060 this.committed = false;
061 this.op = op;
062 this.msg = msg;
063 }
064
065 /**
066 * Check if a Change is already committed to the database.
067 * @return true if change is already committed to the database.
068 */
069 public boolean isCommitted()
070 {
071 return committed;
072 }
073
074 /**
075 * Set the committed status of a Pending Change.
076 * @param committed status that must be set
077 */
078 public void setCommitted(boolean committed)
079 {
080 this.committed = committed;
081 }
082
083 /**
084 * Get the ChangeNumber associated to this PendingChange.
085 * @return the ChangeNumber
086 */
087 public ChangeNumber getChangeNumber()
088 {
089 return changeNumber;
090 }
091
092 /**
093 * Get the message associated to this PendingChange.
094 * @return the message if operation was a replication operation
095 * null if the operation was a local operation
096 */
097 public UpdateMessage getMsg()
098 {
099 return msg;
100 }
101
102 /**
103 * Set the message associated to the PendingChange.
104 * @param msg the message
105 */
106 public void setMsg(UpdateMessage msg)
107 {
108 this.msg = msg;
109 }
110
111 /**
112 * Get the operation associated to the PendingChange.
113 * @return the operation
114 */
115 public PluginOperation getOp()
116 {
117 return this.op;
118 }
119
120 /**
121 * Set the operation asociated to this PendingChange.
122 * @param op The operation associated to this PendingChange.
123 */
124 public void setOp(PluginOperation op)
125 {
126 this.op = op;
127 }
128
129 /**
130 * Add the given ChangeNumber in the list of dependencies of this
131 * PendingChange.
132 *
133 * @param changeNumber The ChangeNumber to add in the list of dependencies
134 * of this PendingChange.
135 */
136 public void addDependency(ChangeNumber changeNumber)
137 {
138 if (dependencyState == null)
139 {
140 dependencyState = new ServerState();
141 }
142 dependencyState.update(changeNumber);
143 }
144
145 /**
146 * Check if the given ServerState covers the dependencies of this
147 * PendingChange.
148 *
149 * @param state The ServerState for which dependencies must be checked,
150 *
151 * @return A boolean indicating if the given ServerState covers the
152 * dependencies of this PendingChange.
153 */
154 public boolean dependenciesIsCovered(ServerState state)
155 {
156 return state.cover(dependencyState);
157 }
158
159 /**
160 * Get the Target DN of this message.
161 *
162 * @return The target DN of this message.
163 */
164 public DN getTargetDN()
165 {
166 synchronized (this)
167 {
168 if (targetDN != null)
169 return targetDN;
170 else
171 {
172 try
173 {
174 targetDN = DN.decode(msg.getDn());
175 }
176 catch (DirectoryException e)
177 {
178 }
179 }
180 return targetDN;
181 }
182 }
183
184 /**
185 * {@inheritDoc}
186 */
187 public int compareTo(PendingChange o)
188 {
189 return this.getChangeNumber().compareTo(o.getChangeNumber());
190 }
191 }