1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.catalina.tribes.tipis;
import java.io.IOException;
import java.io.Serializable;
/**
* For smarter replication, an object can implement this interface to replicate diffs<br>
* The replication logic will call the methods in the following order:<br>
* <code>
* 1. if ( entry.isDirty() ) <br>
* try {
* 2. entry.lock();<br>
* 3. byte[] diff = entry.getDiff();<br>
* 4. entry.reset();<br>
* } finally {<br>
* 5. entry.unlock();<br>
* }<br>
* }<br>
* </code> <br>
* <br>
* When the data is deserialized the logic is called in the following order<br>
* <code>
* 1. ReplicatedMapEntry entry = (ReplicatedMapEntry)objectIn.readObject();<br>
* 2. if ( isBackup(entry)||isPrimary(entry) ) entry.setOwner(owner); <br>
* </code>
*/
public interface ReplicatedMapEntry extends Serializable {
/**
* Has the object changed since last replication and is not in a locked state
*
* @return boolean
*/
boolean isDirty();
/**
* If this returns true, the map will extract the diff using getDiff() Otherwise it will serialize the entire
* object.
*
* @return boolean
*/
boolean isDiffable();
/**
* Returns a diff and sets the dirty map to false
*
* @return Serialized diff data
*
* @throws IOException IO error serializing
*/
byte[] getDiff() throws IOException;
/**
* Applies a diff to an existing object.
*
* @param diff Serialized diff data
* @param offset Array offset
* @param length Array length
*
* @throws IOException IO error deserializing
* @throws ClassNotFoundException Serialization error
*/
void applyDiff(byte[] diff, int offset, int length) throws IOException, ClassNotFoundException;
/**
* Resets the current diff state and resets the dirty flag
*/
void resetDiff();
/**
* Lock during serialization
*/
void lock();
/**
* Unlock after serialization
*/
void unlock();
/**
* This method is called after the object has been created on a remote map. On this method, the object can
* initialize itself for any data that wasn't
*
* @param owner Object
*/
void setOwner(Object owner);
/**
* For accuracy checking, a serialized attribute can contain a version number This number increases as modifications
* are made to the data. The replicated map can use this to ensure accuracy on a periodic basis
*
* @return long - the version number or -1 if the data is not versioned
*/
long getVersion();
/**
* Forces a certain version to a replicated map entry<br>
*
* @param version long
*/
void setVersion(long version);
/**
* @return the last replicate time.
*/
long getLastTimeReplicated();
/**
* Set the last replicate time.
*
* @param lastTimeReplicated New timestamp
*/
void setLastTimeReplicated(long lastTimeReplicated);
/**
* If this returns true, to replicate that an object has been accessed
*
* @return boolean
*/
boolean isAccessReplicate();
/**
* Access to an existing object.
*/
void accessEntry();
}
|