/** * This software is licensed to you under the Apache License, Version 2.0 (the * "Apache License"). * * LinkedIn's contributions are made under the Apache License. If you contribute * to the Software, the contributions will be deemed to have been made under the * Apache License, unless you expressly indicate otherwise. Please do not make any * contributions that would be inconsistent with the Apache License. * * You may obtain a copy of the Apache License at http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, this software * distributed under the Apache License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Apache * License for the specific language governing permissions and limitations for the * software governed under the Apache License. * * © 2012 LinkedIn Corp. All Rights Reserved. */ package com.senseidb.search.client.req; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import org.json.JSONException; import org.json.JSONObject; import com.senseidb.search.client.json.JsonDeserializer; import com.senseidb.search.client.json.JsonHandler; import com.senseidb.search.client.json.JsonSerializer; public class SelectionJsonHandler implements JsonHandler<Selection> { public static Map<String, Class<? extends Selection>> selectionClasses = new HashMap<String, Class<? extends Selection>>(); static { for (Class<? extends Selection> cls : Arrays.asList(Term.class, Terms.class, Path.class, Range.class, Selection.Custom.class)) { selectionClasses.put(cls.getSimpleName().toLowerCase(), cls); } } @Override public JSONObject serialize(Selection bean) throws JSONException { if (bean == null) { return null; } if (bean instanceof Selection.Custom) { JSONObject ret = new JSONObject(); ret.put("custom", ((Selection.Custom) bean).getCustom()); return ret; } JSONObject innerObject = (JSONObject) JsonSerializer.serialize(bean, false); JSONObject paramContainer = new JSONObject(); paramContainer.put(bean.getField(), innerObject); JSONObject ret = new JSONObject(); ret.put(bean.getClass().getSimpleName().toLowerCase(), paramContainer); return ret; } @Override public Selection deserialize(JSONObject json) throws JSONException { String[] names = JSONObject.getNames(json); if (names.length == 0 || !selectionClasses.keySet().contains(names[0])) { throw new IllegalStateException( "The json object doesn't contain the value from " + Arrays.toString(names)); } String name = names[0]; JSONObject innerPart = json.getJSONObject(name); if ("custom".equals(name)) { return Selection.custom(innerPart); } String fieldName = JSONObject.getNames(innerPart)[0]; Selection selection = JsonDeserializer.deserialize( selectionClasses.get(name), innerPart.getJSONObject(fieldName), false); selection.setField(fieldName); return selection; } }