/* * 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; } }