/*
* Copyright (C) 2010 Stanford University
*
* 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 edu.stanford.junction.props2.sample;
import org.json.JSONObject;
import org.json.JSONArray;
import org.json.JSONException;
import java.util.*;
import edu.stanford.junction.props2.Prop;
import edu.stanford.junction.props2.IWithStateAction;
import edu.stanford.junction.props2.IPropState;
abstract public class CollectionProp extends Prop {
public CollectionProp(String propName, String propReplicaName, IPropState state, long seqNum){
super(propName, propReplicaName, state, seqNum);
}
public CollectionProp(String propName, String propReplicaName, IPropState state){
super(propName, propReplicaName, state, 0);
}
protected IPropState newStateWith(final Collection<JSONObject> items){
return withState(new IWithStateAction<IPropState>(){
public IPropState run(IPropState state){
return ((CollectionState)state).newWith(items);
}
});
}
protected IPropState newState(){
return newStateWith(new ArrayList<JSONObject>());
}
public void add(JSONObject item){
addOperation(newAddOp(item));
}
public void replace(JSONObject item1, JSONObject item2){
addOperation(newReplaceOp(item1, item2));
}
public void delete(JSONObject item){
addOperation(newDeleteOp(item));
}
public void clear(){
addOperation(newClearOp());
}
public Collection<JSONObject> items(){
return withState(new IWithStateAction<Collection<JSONObject>>(){
public Collection<JSONObject> run(IPropState state){
return ((CollectionState)state).items();
}
});
}
// Debug
public void doRandom(){
ArrayList<String> words = new ArrayList<String>();
words.add("dude");
words.add("apple");
words.add("hat");
words.add("cat");
words.add("barge");
words.add("horse");
words.add("mango");
words.add("code");
Random rng = new Random();
if(rng.nextInt(2) == 0){
JSONObject item = new JSONObject();
String word = words.get(rng.nextInt(words.size()));
try{
item.put("id", word.hashCode());
item.put("str", word);
add(item);
}
catch(JSONException e){}
}
else{
Iterator<JSONObject> it = items().iterator();
if(it.hasNext()){
delete(it.next());
}
}
}
protected IPropState reifyState(JSONObject obj){
JSONArray a = obj.optJSONArray("items");
ArrayList<JSONObject> items = new ArrayList<JSONObject>();
for(int i = 0; i < a.length(); i++){
items.add(a.optJSONObject(i));
}
return newStateWith(items);
}
protected JSONObject newAddOp(JSONObject item){
JSONObject obj = new JSONObject();
try{
obj.put("type", "addOp");
obj.put("item", item);
}catch(JSONException e){}
return obj;
}
protected JSONObject newDeleteOp(JSONObject item){
JSONObject obj = new JSONObject();
try{
obj.put("type", "deleteOp");
obj.put("item", item);
}catch(JSONException e){}
return obj;
}
protected JSONObject newReplaceOp(JSONObject item1, JSONObject item2){
JSONObject obj = new JSONObject();
try{
obj.put("type", "replaceOp");
obj.put("item1", item1);
obj.put("item2", item2);
}catch(JSONException e){}
return obj;
}
protected JSONObject newClearOp(){
JSONObject obj = new JSONObject();
try{
obj.put("type", "clearOp");
}catch(JSONException e){}
return obj;
}
}