| /* |
| * Copyright (c) 2010-2012 Eike Stepper (Berlin, Germany) and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Eike Stepper - initial API and implementation |
| */ |
| package org.eclipse.emf.cdo.server.internal.net4j.protocol; |
| |
| import org.eclipse.emf.cdo.common.branch.CDOBranch; |
| import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; |
| import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockArea; |
| import org.eclipse.emf.cdo.common.protocol.CDODataInput; |
| import org.eclipse.emf.cdo.common.protocol.CDODataOutput; |
| import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; |
| import org.eclipse.emf.cdo.spi.common.CDOReplicationContext; |
| |
| import org.eclipse.net4j.util.WrappedException; |
| |
| import java.io.IOException; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| /** |
| * @author Eike Stepper |
| */ |
| public class ReplicateRepositoryIndication extends CDOServerReadIndication |
| { |
| private int lastReplicatedBranchID; |
| |
| private long lastReplicatedCommitTime; |
| |
| private String[] lockAreaIDs; |
| |
| public ReplicateRepositoryIndication(CDOServerProtocol protocol) |
| { |
| super(protocol, CDOProtocolConstants.SIGNAL_REPLICATE_REPOSITORY); |
| } |
| |
| @Override |
| protected void indicating(CDODataInput in) throws IOException |
| { |
| lastReplicatedBranchID = in.readInt(); |
| lastReplicatedCommitTime = in.readLong(); |
| lockAreaIDs = new String[in.readInt()]; |
| for (int i = 0; i < lockAreaIDs.length; i++) |
| { |
| lockAreaIDs[i] = in.readString(); |
| } |
| } |
| |
| private Set<String> createLockAreaIDSet() |
| { |
| Set<String> idSet = new HashSet<String>(lockAreaIDs.length); |
| for (String id : lockAreaIDs) |
| { |
| idSet.add(id); |
| } |
| return idSet; |
| } |
| |
| @Override |
| protected void responding(final CDODataOutput out) throws IOException |
| { |
| // We will remove IDs from this set as we process lockAreas one by one; |
| // what remains in this set at the end are the lockAreas that the client |
| // has, but we don't have, which means that they were removed. |
| // |
| final Set<String> lockAreaIDSet = createLockAreaIDSet(); |
| |
| getRepository().replicate(new CDOReplicationContext() |
| { |
| public int getLastReplicatedBranchID() |
| { |
| return lastReplicatedBranchID; |
| } |
| |
| public long getLastReplicatedCommitTime() |
| { |
| return lastReplicatedCommitTime; |
| } |
| |
| public String[] getLockAreaIDs() |
| { |
| return lockAreaIDs; |
| } |
| |
| public void handleBranch(CDOBranch branch) |
| { |
| try |
| { |
| out.writeByte(CDOProtocolConstants.REPLICATE_BRANCH); |
| out.writeCDOBranch(branch); |
| } |
| catch (IOException ex) |
| { |
| throw WrappedException.wrap(ex); |
| } |
| } |
| |
| public void handleCommitInfo(CDOCommitInfo commitInfo) |
| { |
| try |
| { |
| out.writeByte(CDOProtocolConstants.REPLICATE_COMMIT); |
| out.writeCDOCommitInfo(commitInfo); |
| } |
| catch (IOException ex) |
| { |
| throw WrappedException.wrap(ex); |
| } |
| } |
| |
| public boolean handleLockArea(LockArea lockArea) |
| { |
| try |
| { |
| out.writeByte(CDOProtocolConstants.REPLICATE_LOCKAREA); |
| out.writeBoolean(true); |
| out.writeCDOLockArea(lockArea); |
| lockAreaIDSet.remove(lockArea.getDurableLockingID()); |
| return true; |
| } |
| catch (IOException ex) |
| { |
| throw WrappedException.wrap(ex); |
| } |
| } |
| }); |
| |
| // The IDs that are still in the lockAreaIDSet, must be the IDs of lockAreas that have |
| // been removed. |
| for (String deletedLockAreaID : lockAreaIDSet) |
| { |
| out.writeByte(CDOProtocolConstants.REPLICATE_LOCKAREA); |
| out.writeBoolean(false); |
| out.writeString(deletedLockAreaID); |
| } |
| |
| out.writeByte(CDOProtocolConstants.REPLICATE_FINISHED); |
| } |
| } |