blob: 1567b98cc8c65fefaca43c3a2bb05240d8ddaa90 [file] [log] [blame]
package org.apache.helix.mock;
/*
* 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.
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.helix.BaseDataAccessor;
import org.apache.helix.HelixException;
import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.apache.helix.zookeeper.zkclient.DataUpdater;
import org.apache.helix.zookeeper.zkclient.IZkChildListener;
import org.apache.helix.zookeeper.zkclient.IZkDataListener;
import org.apache.zookeeper.data.Stat;
public class MockBaseDataAccessor implements BaseDataAccessor<ZNRecord> {
class ZNode {
private ZNRecord _record;
private Stat _stat;
public ZNode (ZNRecord record) {
_record = record;
_stat = new Stat();
_stat.setCtime(System.currentTimeMillis());
}
public void set (ZNRecord record) {
_record = record;
_stat.setMtime(System.currentTimeMillis());
_stat.setVersion(_stat.getVersion() + 1);
}
public ZNRecord getRecord() {
return _record;
}
public Stat getStat() {
return _stat;
}
}
Map<String, ZNode> _recordMap = new HashMap<>();
@Override
public boolean create(String path, ZNRecord record, int options) {
return set(path, record, options);
}
@Override
public boolean create(String path, ZNRecord record, int options, long ttl) {
return set(path, record, options);
}
@Override
public boolean set(String path, ZNRecord record, int options) {
ZNode zNode = _recordMap.get(path);
if (zNode == null) {
_recordMap.put(path, new ZNode(record));
} else {
zNode.set(record);
_recordMap.put(path, zNode);
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
@Override
public boolean update(String path, DataUpdater<ZNRecord> updater, int options) {
ZNode zNode = _recordMap.get(path);
ZNRecord current = zNode != null ? zNode.getRecord() : null;
ZNRecord newRecord = updater.update(current);
if (newRecord != null) {
return set(path, newRecord, options);
}
return false;
}
@Override
public boolean remove(String path, int options) {
_recordMap.remove(path);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
@Override
public boolean[] createChildren(List<String> paths, List<ZNRecord> records,
int options) {
return setChildren(paths, records, options);
}
@Override
public boolean[] createChildren(List<String> paths, List<ZNRecord> records,
int options, long ttl) {
return setChildren(paths, records, options);
}
@Override
public boolean[] setChildren(List<String> paths, List<ZNRecord> records, int options) {
boolean [] ret = new boolean[paths.size()];
for (int i = 0; i < paths.size(); i++) {
boolean success = create(paths.get(i), records.get(i), options);
ret[i] = success;
}
return ret;
}
@Override
public boolean[] updateChildren(List<String> paths,
List<DataUpdater<ZNRecord>> updaters, int options) {
boolean [] ret = new boolean[paths.size()];
for (int i = 0; i < paths.size(); i++) {
boolean success = update(paths.get(i), updaters.get(i), options);
ret[i] = success;
}
return ret;
}
@Override
public boolean[] remove(List<String> paths, int options) {
boolean [] ret = new boolean[paths.size()];
for (int i = 0; i < paths.size(); i++) {
boolean success = remove(paths.get(i), options);
ret[i] = success;
}
return ret;
}
@Override
public ZNRecord get(String path, Stat stat, int options) {
ZNode zNode = _recordMap.get(path);
return zNode != null ? zNode.getRecord() : null;
}
@Deprecated
@Override
public List<ZNRecord> get(List<String> paths, List<Stat> stats, int options) {
return get(paths, stats, options, false);
}
@Override
public List<ZNRecord> get(List<String> paths, List<Stat> stats, int options,
boolean throwException) throws HelixException {
List<ZNRecord> records = new ArrayList<>();
for (int i = 0; i < paths.size(); i++) {
ZNRecord record = get(paths.get(i), stats.get(i), options);
records.add(record);
}
return records;
}
@Deprecated
@Override
public List<ZNRecord> getChildren(String parentPath, List<Stat> stats, int options) {
return getChildren(parentPath, stats, options, 0, 0);
}
@Override
public List<ZNRecord> getChildren(String parentPath, List<Stat> stats, int options,
int retryCount, int retryInterval) throws HelixException {
List<ZNRecord> children = new ArrayList<>();
for (String key : _recordMap.keySet()) {
if (key.startsWith(parentPath)) {
String[] keySplit = key.split("\\/");
String[] pathSplit = parentPath.split("\\/");
if (keySplit.length - pathSplit.length == 1) {
ZNode zNode = _recordMap.get(key);
ZNRecord record = zNode != null ? zNode.getRecord() : null;
if (record != null) {
children.add(record);
}
} else {
System.out.println("keySplit:" + Arrays.toString(keySplit));
System.out.println("pathSplit:" + Arrays.toString(pathSplit));
}
}
}
return children;
}
@Override
public List<String> getChildNames(String parentPath, int options) {
List<String> child = new ArrayList<>();
for (String key : _recordMap.keySet()) {
if (key.startsWith(parentPath)) {
String[] keySplit = key.split("\\/");
String[] pathSplit = parentPath.split("\\/");
if (keySplit.length > pathSplit.length) {
child.add(keySplit[pathSplit.length]);
}
}
}
return child;
}
@Override
public boolean exists(String path, int options) {
return _recordMap.containsKey(path);
}
@Override
public boolean[] exists(List<String> paths, int options) {
boolean [] ret = new boolean[paths.size()];
for (int i = 0; i < paths.size(); i++) {
ret[i] = _recordMap.containsKey(paths.get(i));
}
return ret;
}
@Override public Stat[] getStats(List<String> paths, int options) {
Stat [] stats = new Stat[paths.size()];
for (int i = 0; i < paths.size(); i++) {
stats[i] = getStat(paths.get(i), options);
}
return stats;
}
@Override public Stat getStat(String path, int options) {
ZNode zNode = _recordMap.get(path);
return zNode != null ? zNode.getStat() : null;
}
@Override public void subscribeDataChanges(String path, IZkDataListener listener) {
// TODO Auto-generated method stub
}
@Override public void unsubscribeDataChanges(String path, IZkDataListener listener) {
// TODO Auto-generated method stub
}
@Override public List<String> subscribeChildChanges(String path, IZkChildListener listener) {
// TODO Auto-generated method stub
return null;
}
@Override public void unsubscribeChildChanges(String path, IZkChildListener listener) {
// TODO Auto-generated method stub
}
@Override public void reset() {
_recordMap.clear();
}
@Override
public void close() { }
@Override public boolean set(String path, ZNRecord record, int options, int expectVersion) {
return set(path, record, options);
}
}