/*
*
* * Copyright 2014 Orient Technologies LTD (info(at)orientechnologies.com)
* *
* * Licensed 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.
* *
* * For more information: http://www.orientechnologies.com
*
*/
package com.orientechnologies.orient.core.storage;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Arrays;
/**
* This class represent CRUD operation result RET is the actual result Stores addition information about command execution process
* Flag {@code isMoved == true} indicates that operation has been executed on local OrientDB server node, {@code isMoved == false}
* indicates that operation has been executed on remote OrientDB node. This information will help to maintain local indexes and
* caches in consistent state
*
* @author edegtyarenko
* @since 28.09.12 13:47
*/
public class OStorageOperationResult<RET> implements Externalizable {
private RET result;
private byte[] modifiedRecordContent;
private boolean isMoved;
/**
* OStorageOperationResult void constructor as required for Exernalizable
*/
public OStorageOperationResult() {
}
public OStorageOperationResult(final RET result) {
this(result, null, false);
}
@SuppressFBWarnings("EI_EXPOSE_REP2")
public OStorageOperationResult(final RET result, final boolean moved) {
this.result = result;
this.isMoved = moved;
}
@SuppressFBWarnings("EI_EXPOSE_REP")
public OStorageOperationResult(final RET result, final byte[] content, final boolean moved) {
this.result = result;
this.modifiedRecordContent = content;
this.isMoved = moved;
}
@SuppressFBWarnings("EI_EXPOSE_REP")
public byte[] getModifiedRecordContent() {
return modifiedRecordContent;
}
public boolean isMoved() {
return isMoved;
}
public RET getResult() {
return result;
}
@Override
public void writeExternal(final ObjectOutput out) throws IOException {
out.writeObject(result);
out.writeBoolean(isMoved);
if (modifiedRecordContent != null) {
out.writeInt(modifiedRecordContent.length);
out.write(modifiedRecordContent);
} else
out.writeInt(-1);
}
@SuppressWarnings("unchecked")
@Override
public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
result = (RET) in.readObject();
isMoved = in.readBoolean();
final int modifiedRecordContentLength = in.readInt();
if (modifiedRecordContentLength > -1) {
modifiedRecordContent = new byte[modifiedRecordContentLength];
int bytesRead = 0;
while (bytesRead < modifiedRecordContentLength) {
int rb = in.read(modifiedRecordContent, bytesRead, modifiedRecordContentLength - bytesRead);
if (rb < 0)
break;
bytesRead += rb;
}
}
}
}