| /* |
| * 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> |
| * <br> |
| * |
| * |
| * @author Filip Hanik |
| * @version 1.0 |
| */ |
| public interface ReplicatedMapEntry extends Serializable { |
| |
| /** |
| * Has the object changed since last replication |
| * and is not in a locked state |
| * @return boolean |
| */ |
| public boolean isDirty(); |
| |
| /** |
| * If this returns true, the map will extract the diff using getDiff() |
| * Otherwise it will serialize the entire object. |
| * @return boolean |
| */ |
| public boolean isDiffable(); |
| |
| /** |
| * Returns a diff and sets the dirty map to false |
| * @return byte[] |
| * @throws IOException |
| */ |
| public byte[] getDiff() throws IOException; |
| |
| |
| /** |
| * Applies a diff to an existing object. |
| * @param diff byte[] |
| * @param offset int |
| * @param length int |
| * @throws IOException |
| */ |
| public void applyDiff(byte[] diff, int offset, int length) throws IOException, ClassNotFoundException; |
| |
| /** |
| * Resets the current diff state and resets the dirty flag |
| */ |
| public void resetDiff(); |
| |
| /** |
| * Lock during serialization |
| */ |
| public void lock(); |
| |
| /** |
| * Unlock after serialization |
| */ |
| public 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 |
| */ |
| public 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 |
| */ |
| public long getVersion(); |
| |
| /** |
| * Forces a certain version to a replicated map entry<br> |
| * @param version long |
| */ |
| public void setVersion(long version); |
| |
| |
| |
| |
| } |