package com.trigonic.jedis; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import redis.clients.jedis.Response; import redis.clients.jedis.SortingParams; import redis.clients.util.SafeEncoder; import com.google.common.primitives.Bytes; public class NamespaceHandler { private String namespace; private String prefix; private byte[] binaryPrefix; public NamespaceHandler(String namespace) { this.namespace = namespace; prefix = namespace + ":"; binaryPrefix = SafeEncoder.encode(prefix); } public String get() { return namespace; } public String add(String key) { return key == null ? null : prefix + key; } public String[] add(String[] keys) { String[] result = null; if (keys != null) { result = new String[keys.length]; for (int i = 0; i < keys.length; ++i) { result[i] = add(keys[i]); } } return result; } public String[] addEveryOther(String[] keys) { String[] result = null; if (keys != null) { result = new String[keys.length]; for (int i = 0; i < keys.length; ++i) { result[i] = (i % 2 == 0 ? add(keys[i]) : keys[i]); } } return result; } public byte[][] addEveryOther(byte[][] keys) { byte[][] result = null; if (keys != null) { result = new byte[keys.length][]; for (int i = 0; i < keys.length; ++i) { result[i] = (i % 2 == 0 ? add(keys[i]) : keys[i]); } } return result; } public byte[] add(byte[] key) { return key == null ? null : Bytes.concat(binaryPrefix, key); } public byte[][] add(byte[][] keys) { byte[][] result = null; if (keys != null) { result = new byte[keys.length][]; for (int i = 0; i < keys.length; ++i) { result[i] = add(keys[i]); } } return result; } public SortingParams add(SortingParams params) { List<byte[]> rawParams = new ArrayList<byte[]>(params.getParams()); SortingParams result = new SortingParams(); for (int i = 0; i < rawParams.size(); ++i) { String paramName = SafeEncoder.encode(rawParams.get(i)); if (paramName.equals("alpha")) { result.alpha(); } else if (paramName.equals("asc")) { result.asc(); } else if (paramName.equals("by")) { result.by(add(rawParams.get(++i))); } else if (paramName.equals("desc")) { result.desc(); } else if (paramName.equals("get")) { result.get(add(rawParams.get(++i))); } else if (paramName.equals("limit")) { int start = Integer.valueOf(SafeEncoder.encode(rawParams.get(++i))); int count = Integer.valueOf(SafeEncoder.encode(rawParams.get(++i))); result.limit(start, count); } else if (paramName.equals("nosort")) { result.nosort(); } } return result; } public String remove(String key) { if (key != null && key.startsWith(prefix)) { key = key.substring(prefix.length()); } return key; } public Set<String> remove(Set<String> keys) { Set<String> result = null; if (keys != null) { result = new LinkedHashSet<String>(keys.size()); for (String key : keys) { result.add(remove(key)); } } return result; } public Response<Set<String>> remove(Response<Set<String>> response) { return new FilteredResponse<Set<String>>(response) { @Override protected Set<String> filter(Set<String> value) { return remove(value); } }; } public byte[] removeNamespace(byte[] key) { if (key != null && Bytes.indexOf(key, binaryPrefix) == 0) { key = Arrays.copyOfRange(key, binaryPrefix.length, key.length); } return key; } public List<String> removeFirst(List<String> list) { List<String> result = null; if (list != null) { result = new ArrayList<String>(list.size()); result.addAll(list); result.set(0, remove(result.get(0))); } return result; } public Response<List<String>> removeFirst(Response<List<String>> response) { return new FilteredResponse<List<String>>(response) { @Override protected List<String> filter(List<String> list) { return removeFirst(list); } }; } public List<byte[]> removeFirstBytes(List<byte[]> list) { List<byte[]> result = null; if (list != null) { result = new ArrayList<byte[]>(list.size()); result.addAll(list); result.set(0, removeNamespace(result.get(0))); } return result; } }