package com.iambookmaster.client.beans; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import com.iambookmaster.client.common.JSONBuilder; import com.iambookmaster.client.common.JSONParser; import com.iambookmaster.client.exceptions.JSONException; public class NPC extends AbstractParameter{ private static final long serialVersionUID = 1L; private static final String JSON_ID = "A"; private static final String JSON_VALUE = "B"; private static final String JSON_VALUES = "C"; private static final String JSON_NAME_POINTER = "D"; private LinkedHashMap<Parameter,Integer> values = new LinkedHashMap<Parameter, Integer>(); private String genitiveName; public NPC() { type = AbstractParameter.TYPE_NPC; } public String getGenitiveName() { return genitiveName; } public void setGenitiveName(String genitiveName) { this.genitiveName = genitiveName; } @Override public void toJSON(JSONBuilder builder, int export) { super.toJSON(builder, export); if (values.size()>0) { ArrayList<ParameterValue> list = new ArrayList<NPC.ParameterValue>(values.size()); for (Parameter parameter : values.keySet()) { list.add(new ParameterValue(parameter,values.get(parameter))); } Collections.sort(list, new Comparator<ParameterValue>(){ public int compare(ParameterValue o1, ParameterValue o2) { return o1.parameter.getOrder() - o2.parameter.getOrder(); } }); JSONBuilder subBuilder = builder.getInstance(); for (ParameterValue parameter : list) { subBuilder.newRow(); subBuilder.field(JSON_ID, parameter.parameter.getId()); subBuilder.field(JSON_VALUE, parameter.value.intValue()); } builder.childArray(JSON_VALUES, subBuilder); } if (genitiveName != null && genitiveName.length()>0) { builder.field(JSON_NAME_POINTER,genitiveName); } } @Override protected void fromJSON(Object row, JSONParser parser,HashMap<String, AbstractParameter> parametersMap,HashMap<String,Picture> pictures) throws JSONException { Object vals = parser.propertyNoCheck(row, JSON_VALUES); if (vals != null) { int len = parser.length(vals); for (int i=0;i<len;i++) { Object rw = parser.getRow(vals, i); String id = parser.propertyString(rw, JSON_ID); int val = parser.propertyNoCheckInt(rw, JSON_VALUE); AbstractParameter parameter = parametersMap.get(id); if (parameter instanceof Parameter) { Parameter param = (Parameter) parameter; values.put(param, val); } else { throw new JSONException("Unknown Parameter with ID="+id); } } } genitiveName = parser.propertyNoCheckString(row,JSON_NAME_POINTER); } @Override public boolean dependsOn(AbstractParameter parameter) { return values.containsKey(parameter); } public HashMap<Parameter, Integer> getValues() { return values; } public class ParameterValue { private Parameter parameter; private Integer value; public Parameter getParameter() { return parameter; } public Integer getValue() { return value; } public ParameterValue(Parameter parameter, Integer value) { this.parameter = parameter; this.value = value; } public ParameterValue() { } } }