/*
* 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.zookeeper;
import org.apache.zookeeper.data.Stat;
/**
* Encodes the result of a single part of a multiple operation commit.
*/
public abstract class OpResult {
private int type;
private OpResult(int type) {
this.type = type;
}
/**
* Encodes the return type as from ZooDefs.OpCode. Can be used
* to dispatch to the correct cast needed for getting the desired
* additional result data.
* @see ZooDefs.OpCode
* @return an integer identifying what kind of operation this result came from.
*/
public int getType() {
return type;
}
/**
* A result from a create operation. This kind of result allows the
* path to be retrieved since the create might have been a sequential
* create.
*/
public static class CreateResult extends OpResult {
private String path;
public CreateResult(String path) {
super(ZooDefs.OpCode.create);
this.path = path;
}
public String getPath() {
return path;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof CreateResult)) return false;
CreateResult other = (CreateResult) o;
return getType() == other.getType() && path.equals(other.getPath());
}
@Override
public int hashCode() {
return getType() * 35 + path.hashCode();
}
}
/**
* A result from a delete operation. No special values are available.
*/
public static class DeleteResult extends OpResult {
public DeleteResult() {
super(ZooDefs.OpCode.delete);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof DeleteResult)) return false;
DeleteResult opResult = (DeleteResult) o;
return getType() == opResult.getType();
}
@Override
public int hashCode() {
return getType();
}
}
/**
* A result from a setData operation. This kind of result provides access
* to the Stat structure from the update.
*/
public static class SetDataResult extends OpResult {
private Stat stat;
public SetDataResult(Stat stat) {
super(ZooDefs.OpCode.setData);
this.stat = stat;
}
public Stat getStat() {
return stat;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof SetDataResult)) return false;
SetDataResult other = (SetDataResult) o;
return getType() == other.getType() && stat.getMzxid() == other.stat.getMzxid();
}
@Override
public int hashCode() {
return (int) (getType() * 35 + stat.getMzxid());
}
}
/**
* A result from a version check operation. No special values are available.
*/
public static class CheckResult extends OpResult {
public CheckResult() {
super(ZooDefs.OpCode.check);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof CheckResult)) return false;
CheckResult other = (CheckResult) o;
return getType() == other.getType();
}
@Override
public int hashCode() {
return getType();
}
}
/**
* An error result from any kind of operation. The point of error results
* is that they contain an error code which helps understand what happened.
* @see KeeperException.Code
*
*/
public static class ErrorResult extends OpResult {
private int err;
public ErrorResult(int err) {
super(ZooDefs.OpCode.error);
this.err = err;
}
public int getErr() {
return err;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof ErrorResult)) return false;
ErrorResult other = (ErrorResult) o;
return getType() == other.getType() && err == other.getErr();
}
@Override
public int hashCode() {
return getType() * 35 + err;
}
}
}