/*
* Copyright 2012 NGDATA nv
*
* 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.
*/
package org.lilyproject.tools.tester;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.set.ListOrderedSet;
import org.codehaus.jackson.JsonNode;
import org.lilyproject.util.json.JsonUtil;
public class RecordSpaces {
Map<String, RecordSpace> recordSpaces = new HashMap<String, RecordSpace>();
public RecordSpaces(List<JsonNode> recordSpacesConfig) {
for (JsonNode recordSpaceNode : recordSpacesConfig) {
addRecordSpace(recordSpaceNode);
}
}
public void addRecordSpace(JsonNode recordSpaceNode) {
String name = JsonUtil.getString(recordSpaceNode, "name");
Integer limit = JsonUtil.getInt(recordSpaceNode, "limit");
recordSpaces.put(name, new RecordSpace(limit));
}
public void addRecord(String space, TestRecord record) {
RecordSpace recordSpace = recordSpaces.get(space);
if (recordSpace != null) {
recordSpace.addRecord(record);
}
}
public void removeRecord(String space, TestRecord record) {
RecordSpace recordSpace = recordSpaces.get(space);
if (recordSpace != null) {
recordSpace.removeRecord(record);
}
}
public TestRecord getRecord(String space) {
RecordSpace recordSpace = recordSpaces.get(space);
if (recordSpace != null) {
return recordSpace.getRecord();
} else {
return null;
}
}
private class RecordSpace {
private int limit;
private ListOrderedSet records;
RecordSpace(int limit) {
this.limit = limit;
records = new ListOrderedSet();
}
public synchronized void addRecord(TestRecord record) {
if (records.size() < limit) {
records.add(record);
} else {
int index = (int) Math.floor(Math.random() * records.size());
if (records.remove(index) != null) {
records.add(record);
}
}
}
public synchronized void removeRecord(TestRecord record) {
records.remove(record);
}
public synchronized TestRecord getRecord() {
TestRecord testRecord;
int loopCnt = 0;
do {
int index = (int) Math.floor(Math.random() * records.size());
testRecord = (TestRecord)records.get(index);
loopCnt++;
if ((loopCnt % 100) == 0) {
System.out.println("Already tried " + loopCnt + " times to pick a non-deleted record.");
}
} while (testRecord.isDeleted());
return testRecord;
}
}
}