All Downloads are FREE. Search and download functionalities are using the official Maven repository.

redis.clients.jedis.BuilderFactory Maven / Gradle / Ivy

There is a newer version: 1.13.0
Show newest version
package redis.clients.jedis;

import java.util.Collections;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import redis.clients.util.JedisByteHashMap;
import redis.clients.util.SafeEncoder;

public final class BuilderFactory {
  public static final Builder DOUBLE = new Builder() {
    public Double build(Object data) {
      String asString = STRING.build(data);
      return asString == null ? null : Double.valueOf(asString);
    }

    public String toString() {
      return "double";
    }
  };
  public static final Builder BOOLEAN = new Builder() {
    public Boolean build(Object data) {
      return ((Long) data) == 1;
    }

    public String toString() {
      return "boolean";
    }
  };
  public static final Builder BYTE_ARRAY = new Builder() {
    public byte[] build(Object data) {
      return ((byte[]) data); // deleted == 1
    }

    public String toString() {
      return "byte[]";
    }
  };

  public static final Builder LONG = new Builder() {
    public Long build(Object data) {
      return (Long) data;
    }

    public String toString() {
      return "long";
    }

  };
  public static final Builder STRING = new Builder() {
    public String build(Object data) {
      return data == null ? null : SafeEncoder.encode((byte[]) data);
    }

    public String toString() {
      return "string";
    }

  };
  public static final Builder> STRING_LIST = new Builder>() {
    @SuppressWarnings("unchecked")
    public List build(Object data) {
      if (null == data) {
        return Collections.emptyList();
      }
      List l = (List) data;
      final ArrayList result = new ArrayList(l.size());
      for (final byte[] barray : l) {
        if (barray == null) {
          result.add(null);
        } else {
          result.add(SafeEncoder.encode(barray));
        }
      }
      return result;
    }

    public String toString() {
      return "List";
    }

  };
  public static final Builder> STRING_MAP = new Builder>() {
    @SuppressWarnings("unchecked")
    public Map build(Object data) {
      final List flatHash = (List) data;
      final Map hash = new HashMap(flatHash.size()/2, 1);
      final Iterator iterator = flatHash.iterator();
      while (iterator.hasNext()) {
        hash.put(SafeEncoder.encode(iterator.next()), SafeEncoder.encode(iterator.next()));
      }

      return hash;
    }

    public String toString() {
      return "Map";
    }

  };

  public static final Builder> PUBSUB_NUMSUB_MAP = new Builder>() {
    @SuppressWarnings("unchecked")
    public Map build(Object data) {
      final List flatHash = (List) data;
      final Map hash = new HashMap(flatHash.size()/2, 1);
      final Iterator iterator = flatHash.iterator();
      while (iterator.hasNext()) {
        hash.put(SafeEncoder.encode((byte[]) iterator.next()),
          String.valueOf((Long) iterator.next()));
      }

      return hash;
    }

    public String toString() {
      return "PUBSUB_NUMSUB_MAP";
    }

  };

  public static final Builder> STRING_SET = new Builder>() {
    @SuppressWarnings("unchecked")
    public Set build(Object data) {
      if (null == data) {
        return Collections.emptySet();
      }
      List l = (List) data;
      final Set result = new HashSet(l.size());
      for (final byte[] barray : l) {
        if (barray == null) {
          result.add(null);
        } else {
          result.add(SafeEncoder.encode(barray));
        }
      }
      return result;
    }

    public String toString() {
      return "Set";
    }

  };

  public static final Builder> BYTE_ARRAY_LIST = new Builder>() {
    @SuppressWarnings("unchecked")
    public List build(Object data) {
      if (null == data) {
        return Collections.emptyList();
      }
      List l = (List) data;

      return l;
    }

    public String toString() {
      return "List";
    }
  };

  public static final Builder> BYTE_ARRAY_ZSET = new Builder>() {
    @SuppressWarnings("unchecked")
    public Set build(Object data) {
      if (null == data) {
        return Collections.emptySet();
      }
      List l = (List) data;
      final Set result = new LinkedHashSet(l);
      for (final byte[] barray : l) {
        if (barray == null) {
          result.add(null);
        } else {
          result.add(barray);
        }
      }
      return result;
    }

    public String toString() {
      return "ZSet";
    }
  };
  public static final Builder> BYTE_ARRAY_MAP = new Builder>() {
    @SuppressWarnings("unchecked")
    public Map build(Object data) {
      final List flatHash = (List) data;
      final Map hash = new JedisByteHashMap();
      final Iterator iterator = flatHash.iterator();
      while (iterator.hasNext()) {
        hash.put(iterator.next(), iterator.next());
      }

      return hash;
    }

    public String toString() {
      return "Map";
    }

  };

  public static final Builder> STRING_ZSET = new Builder>() {
    @SuppressWarnings("unchecked")
    public Set build(Object data) {
      if (null == data) {
        return Collections.emptySet();
      }
      List l = (List) data;
      final Set result = new LinkedHashSet(l.size());
      for (final byte[] barray : l) {
        if (barray == null) {
          result.add(null);
        } else {
          result.add(SafeEncoder.encode(barray));
        }
      }
      return result;
    }

    public String toString() {
      return "ZSet";
    }

  };

  public static final Builder> TUPLE_ZSET = new Builder>() {
    @SuppressWarnings("unchecked")
    public Set build(Object data) {
      if (null == data) {
        return Collections.emptySet();
      }
      List l = (List) data;
      final Set result = new LinkedHashSet(l.size());
      Iterator iterator = l.iterator();
      while (iterator.hasNext()) {
        result.add(new Tuple(SafeEncoder.encode(iterator.next()), Double.valueOf(SafeEncoder
            .encode(iterator.next()))));
      }
      return result;
    }

    public String toString() {
      return "ZSet";
    }

  };

  public static final Builder> TUPLE_ZSET_BINARY = new Builder>() {
    @SuppressWarnings("unchecked")
    public Set build(Object data) {
      if (null == data) {
        return Collections.emptySet();
      }
      List l = (List) data;
      final Set result = new LinkedHashSet(l.size());
      Iterator iterator = l.iterator();
      while (iterator.hasNext()) {
        result.add(new Tuple(iterator.next(), Double.valueOf(SafeEncoder.encode(iterator.next()))));
      }

      return result;

    }

    public String toString() {
      return "ZSet";
    }
  };

  public static final Builder EVAL_RESULT = new Builder() {

    @Override
    public Object build(Object data) {
      return evalResult(data);
    }

    public String toString() {
      return "Eval";
    }

    private Object evalResult(Object result) {
      if (result instanceof byte[]) return SafeEncoder.encode((byte[]) result);

      if (result instanceof List) {
        List list = (List) result;
        List listResult = new ArrayList(list.size());
        for (Object bin : list) {
          listResult.add(evalResult(bin));
        }

        return listResult;
      }

      return result;
    }

  };

  public static final Builder EVAL_BINARY_RESULT = new Builder() {

    @Override
    public Object build(Object data) {
      return evalResult(data);
    }

    public String toString() {
      return "Eval";
    }

    private Object evalResult(Object result) {
      if (result instanceof List) {
        List list = (List) result;
        List listResult = new ArrayList(list.size());
        for (Object bin : list) {
          listResult.add(evalResult(bin));
        }

        return listResult;
      }

      return result;
    }

  };

  public static final Builder> GEO_COORDINATE_LIST = new Builder>() {
    @Override
    public List build(Object data) {
      if (null == data) {
        return Collections.emptyList();
      }
      return interpretGeoposResult((List) data);
    }

    public String toString() {
      return "List";
    }

    private List interpretGeoposResult(List responses) {
      List responseCoordinate = new ArrayList(responses.size());
      for (Object response : responses) {
        if (response == null) {
          responseCoordinate.add(null);
        } else {
          List respList = (List) response;
          GeoCoordinate coord = new GeoCoordinate(Double.parseDouble(SafeEncoder
              .encode((byte[]) respList.get(0))), Double.parseDouble(SafeEncoder
              .encode((byte[]) respList.get(1))));
          responseCoordinate.add(coord);
        }
      }
      return responseCoordinate;
    }
  };

  public static final Builder> GEORADIUS_WITH_PARAMS_RESULT = new Builder>() {
    @Override
    public List build(Object data) {
      if (data == null) {
        return Collections.emptyList();
      } else {
        List objectList = (List) data;

        if (objectList.isEmpty()) {
          return new ArrayList();
        }

        List responses = new ArrayList(objectList.size());
        if (objectList.get(0) instanceof List) {
          // list of members with additional informations
          GeoRadiusResponse resp;
          for (Object obj : objectList) {
            List informations = (List) obj;

            resp = new GeoRadiusResponse((byte[]) informations.get(0));

            int size = informations.size();
            for (int idx = 1; idx < size; idx++) {
              Object info = informations.get(idx);
              if (info instanceof List) {
                // coordinate
                List coord = (List) info;

                resp.setCoordinate(new GeoCoordinate(convertByteArrayToDouble(coord.get(0)),
                    convertByteArrayToDouble(coord.get(1))));
              } else {
                // distance
                resp.setDistance(convertByteArrayToDouble(info));
              }
            }

            responses.add(resp);
          }
        } else {
          // list of members
          for (Object obj : objectList) {
            responses.add(new GeoRadiusResponse((byte[]) obj));
          }
        }

        return responses;
      }
    }

    private Double convertByteArrayToDouble(Object obj) {
      return Double.valueOf(SafeEncoder.encode((byte[]) obj));
    }

    public String toString() {
      return "GeoRadiusWithParamsResult";
    }
  };

  public static final Builder> LONG_LIST = new Builder>() {
    @Override
    @SuppressWarnings("unchecked")
    public List build(Object data) {
      if (null == data) {
        return null;
      }
      return (List) data;
    }

    public String toString() {
      return "List";
    }

  };

  private BuilderFactory() {
    throw new InstantiationError( "Must not instantiate this class" );
  }

}