/**
* 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.bookkeeper.metastore;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.apache.bookkeeper.metastore.MetastoreCallback;
import org.apache.bookkeeper.metastore.MetastoreTable;
import org.apache.bookkeeper.metastore.MSException;
import org.apache.bookkeeper.metastore.MSException.Code;
import org.apache.bookkeeper.versioning.Version;
import org.apache.bookkeeper.versioning.Versioned;
// Converts async calls to sync calls for MetastoreTable. Currently not
// intended to be used other than for simple functional tests, however,
// could be developed into a sync API.
public class MetastoreTableAsyncToSyncConverter {
static class HeldValue<T> implements MetastoreCallback<T> {
private CountDownLatch countDownLatch = new CountDownLatch(1);
private int code;
private T value = null;
void waitCallback() throws MSException {
try {
countDownLatch.await(10, TimeUnit.SECONDS);
} catch (InterruptedException ie) {
throw MSException.create(Code.InterruptedException);
}
if (Code.OK.getCode() != code) {
throw MSException.create(Code.get(code));
}
}
public T getValue() {
return value;
}
@Override
public void complete(int rc, T value, Object ctx) {
this.code = rc;
this.value = value;
countDownLatch.countDown();
}
}
protected MetastoreTable table;
public MetastoreTableAsyncToSyncConverter(MetastoreTable table) {
this.table = table;
}
public Versioned<Value> get(String key) throws MSException {
HeldValue<Versioned<Value>> retValue =
new HeldValue<Versioned<Value>>();
// make the actual async call
this.table.get(key, retValue, null);
retValue.waitCallback();
return retValue.getValue();
}
public Versioned<Value> get(String key, Set<String> fields)
throws MSException {
HeldValue<Versioned<Value>> retValue =
new HeldValue<Versioned<Value>>();
// make the actual async call
this.table.get(key, fields, retValue, null);
retValue.waitCallback();
return retValue.getValue();
}
public void remove(String key, Version version) throws MSException {
HeldValue<Void> retValue = new HeldValue<Void>();
// make the actual async call
this.table.remove(key, version, retValue, null);
retValue.waitCallback();
}
public Version put(String key, Value value, Version version)
throws MSException {
HeldValue<Version> retValue = new HeldValue<Version>();
// make the actual async call
this.table.put(key, value, version, retValue, null);
retValue.waitCallback();
return retValue.getValue();
}
public MetastoreCursor openCursor() throws MSException {
HeldValue<MetastoreCursor> retValue = new HeldValue<MetastoreCursor>();
// make the actual async call
this.table.openCursor(retValue, null);
retValue.waitCallback();
return retValue.getValue();
}
public MetastoreCursor openCursor(Set<String> fields) throws MSException {
HeldValue<MetastoreCursor> retValue = new HeldValue<MetastoreCursor>();
// make the actual async call
this.table.openCursor(fields, retValue, null);
retValue.waitCallback();
return retValue.getValue();
}
}