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.protocol;
028    
029    import org.opends.server.replication.common.ChangeNumber;
030    import org.opends.server.types.Operation;
031    import org.opends.server.types.operation.PluginOperation;
032    
033    /**
034     * This class describe the replication context that is attached
035     * to each Operation using the SYNCHROCONTEXT key.
036     */
037    public abstract class OperationContext
038    {
039      /**
040       * The identifier used to attach the context to operations.
041       */
042      public static final String SYNCHROCONTEXT = "replicationContext";
043    
044      /**
045       * The change Number of the Operation.
046       */
047      private ChangeNumber changeNumber;
048    
049      /**
050       * The unique Id of the entry that was modified in the original operation.
051       */
052      private String entryUid;
053    
054      /**
055       * Create a new OperationContext.
056       * @param changeNumber The change number of the operation.
057       * @param uid The unique Identifier of the modified entry.
058       */
059      protected OperationContext(ChangeNumber changeNumber, String uid)
060      {
061        this.changeNumber = changeNumber;
062        this.entryUid = uid;
063      }
064    
065      /**
066       * Gets The change number of the Operation.
067       *
068       * @return The change number of the Operation.
069       */
070      public ChangeNumber getChangeNumber()
071      {
072        return changeNumber;
073      }
074    
075      /**
076       * Get the unique Identifier of the modified entry.
077       *
078       * @return the unique Identifier of the modified entry.
079       */
080      public String getEntryUid()
081      {
082        return entryUid;
083      }
084    
085      /**
086       * Get the change number of an operation.
087       *
088       * @param  op The operation.
089       *
090       * @return The change number of the provided operation, or null if there is
091       *         no change number associated with the operation.
092       */
093      public static ChangeNumber getChangeNumber(Operation op)
094      {
095        OperationContext ctx = (OperationContext)op.getAttachment(SYNCHROCONTEXT);
096        if (ctx == null)
097        {
098          return null;
099        }
100        return ctx.changeNumber;
101      }
102    
103      /**
104       * Get the change number of an operation.
105       *
106       * @param  op The operation.
107       *
108       * @return The change number of the provided operation, or null if there is
109       *         no change number associated with the operation.
110       */
111      public static ChangeNumber getChangeNumber(PluginOperation op)
112      {
113        OperationContext ctx = (OperationContext)op.getAttachment(SYNCHROCONTEXT);
114        if (ctx == null)
115        {
116          return null;
117        }
118        return ctx.changeNumber;
119      }
120    
121      /**
122       * {@inheritDoc}
123       */
124      @Override
125      public boolean equals(Object obj)
126      {
127        if (obj instanceof OperationContext)
128        {
129          OperationContext ctx = (OperationContext) obj;
130          return ((this.changeNumber.equals(ctx.getChangeNumber()) &&
131              (this.entryUid.equals(ctx.getEntryUid()))));
132        }
133        else
134          return false;
135      }
136    
137      /**
138       * {@inheritDoc}
139       */
140      @Override
141      public int hashCode()
142      {
143        return changeNumber.hashCode() + entryUid.hashCode();
144      }
145    
146    
147    }