Package com.linkedin.databus2.core.filter

Source Code of com.linkedin.databus2.core.filter.KeyFilterConfigJSONFactory

package com.linkedin.databus2.core.filter;
/*
*
* Copyright 2013 LinkedIn Corp. All rights reserved
*
* 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.
*
*/


import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.log4j.Logger;
import org.codehaus.jackson.map.ObjectMapper;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.linkedin.databus2.core.filter.KeyFilterConfigHolder.PartitionType;



/*
*Factory to create FilterConfigHolder objects from a JSON String
*
*The version of JSON used currently does not support automatic parsing of polymorphic classes.
*So, their instantiation has to be done by hand in the code below.
*
*/
public class KeyFilterConfigJSONFactory
{
  public static final String MODULE = KeyFilterConfigJSONFactory.class.getName();
  public static final Logger LOG = Logger.getLogger(MODULE);

  private static final String partitionTypeFieldName = "partitionType";
  private static final String filterConfigFieldName = "filters";

  /*
   * Converts a JSON String to DbusKeyFilter object
   *
   * @param String containing JSON representation of DbusKeyFilter object
   * @return DbusKeyFilter object
   *
   * @throws
   *   JSONException if JSON Parser is unable to parse the data
   *   IOException if there is any IO errors while parsing
   */
  public static DbusKeyFilter parseDbusKeyFilter(String s)
    throws JSONException, IOException
  {
    JSONObject obj = new JSONObject(s);
    ObjectMapper mapper = new ObjectMapper();

    return getDbusKeyFilter(obj, mapper);
  }

  /*
   * Converts a generic JSONObject to DbusKeyFilter object
   *
   * @param1 generic JSONObject of the DbusKeyFilter
   * @param2 JSON ObjectMapper used to parse the JSONObject
   * @return DbusKeyFilter object
   *
   * @throws
   *   JSONException if JSON Parser is unable to parse the data
   *   IOException if there is any IO errors while parsing
   */
  private static DbusKeyFilter getDbusKeyFilter(JSONObject obj, ObjectMapper mapper)
    throws JSONException, IOException
  {
      String type = obj.getString(partitionTypeFieldName);
      JSONArray array = null;

      DbusKeyFilter configHolder = new DbusKeyFilter();
      configHolder.setPartitionType(PartitionType.valueOf(type));

      if (! obj.has(filterConfigFieldName) || obj.isNull(filterConfigFieldName))
      {
        return configHolder;
      }

      array = obj.getJSONArray(filterConfigFieldName);

      ArrayList<DbusFilter> filters = new ArrayList<DbusFilter>();

      for ( int i = 0; i < array.length(); i++)
      {
        filters.add(getDbusFilter(array.getString(i), configHolder.getPartitionType(), mapper));
      }

      configHolder.setFilters(filters);
      return configHolder;
  }


  /*
   * Converts a JSON String to DbusFilter object
   *
   * @param1 String containing JSON representation of DbusKeyFilter object
   * @param2 PartitionType of the Filter
   * @param3 JSON ObjectMapper used to parse the JSONObject
   * @return DbusKeyFilter object
   *
   * @throws
   *   JSONException if JSON Parser is unable to parse the data
   *   IOException if there is any IO errors while parsing
   */
  private static DbusFilter getDbusFilter(String objStr, PartitionType type, ObjectMapper objMapper)
    throws JSONException, IOException
  {
    DbusFilter filter = null;

    if ( type == PartitionType.MOD )
    {
      filter = objMapper.readValue(objStr, KeyModFilter.class);
    } else if ( type == PartitionType.RANGE ) {
      filter = objMapper.readValue(objStr, KeyRangeFilter.class);
    }

    return filter;
  }

  /*
   * Converts a JSON String to  a map of SourceIds to DbusKeyFilter
   *
   * @param String containing JSON representation of DbusKeyFilter object
   * @return Map of SourceIds to DbusKeyFilter
   *
   * @throws
   *   JSONException if JSON Parser is unable to parse the data
   *   IOException if there is any IO errors while parsing
   */
  @SuppressWarnings("unchecked")
  public static Map<Long, DbusKeyFilter> parseSrcIdFilterConfigMap(String s)
    throws JSONException, IOException
  {
    HashMap<Long,DbusKeyFilter> filterConfigMap = new HashMap<Long,DbusKeyFilter>();

    HashMap<Long, JSONObject> genericMap = new HashMap<Long,JSONObject>();

    ObjectMapper mapper = new ObjectMapper();

      try
      {
        JSONObject obj2 = new JSONObject(s);
        Iterator<String> itr = obj2.keys();
        while (itr.hasNext())
        {
          String k = itr.next();
          Long key = Long.valueOf(k);
          genericMap.put(key, obj2.getJSONObject(key.toString()));
        }
      } catch (Exception ex) {
        LOG.error("Got exception while parsing filterConfig", ex);
        throw new JSONException(ex);
      }

      Iterator<Entry<Long, JSONObject>> itr = genericMap.entrySet().iterator();

      while ( itr.hasNext())
      {
        Entry<Long, JSONObject> obj = itr.next();

        filterConfigMap.put(obj.getKey(), getDbusKeyFilter(obj.getValue(),mapper));
      }

    return filterConfigMap;
  }

}
TOP

Related Classes of com.linkedin.databus2.core.filter.KeyFilterConfigJSONFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.