package org.ebayopensource.turmeric.runtime.spf.impl.internal.service; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * The class captures the request params for each operation defined in the * serviceconfig.xml * * @author prabhakhar kaliyamurthy * */ public final class RequestParamsDescriptor { private final Map<String, RequestParams> operation2RequestParamsMap; public RequestParamsDescriptor() { operation2RequestParamsMap = new HashMap<String, RequestParams>(); } public boolean map(String operationName, String pathIndex, String param, String alias) { RequestParams params = operation2RequestParamsMap.get(operationName); if(params == null) { params = new RequestParams(); } // check for duplicate indexes if(!params.put(pathIndex, param, alias)) { return false; } operation2RequestParamsMap.put(operationName, params); return true; } public RequestParams getRequestParams(String operationName) { return operation2RequestParamsMap.get(operationName); } public Collection<RequestParams> getRequestParams() { return operation2RequestParamsMap.values(); } public Set<String> getPathIndices() { HashSet<String> indices = new HashSet<String>(); for(RequestParams param: operation2RequestParamsMap.values()) { indices.addAll(param.getAllIndices()); } return Collections.unmodifiableSet(indices); } public static class RequestParams { // map to store the pathindex to param mapping. private final Map<String, String> params; // map to get the real name from the alias private final Map<String, String> aliases; public RequestParams() { this(10); } public RequestParams(int size) { params = new HashMap<String, String>(size); aliases = new HashMap<String, String>(size); } public String get(String pathIndex) { return params.get(pathIndex); } public boolean put(String pathIndex, String param, String pAlias) { // check for duplicate indexes if(params.get(pathIndex) != null || params.containsValue(param)){ return false; } params.put(pathIndex, param); // empty aliases are safe if("".equals(pAlias)) { return true; } if(aliases.get(pAlias) != null) { return false; } aliases.put(pAlias, param); return true; } public int count() { return params.size(); } public Set<Map.Entry<String, String>> entries() { return params.entrySet(); } public Map<String, String> aliases() { return aliases; } public String getParamName(String alias) { return aliases.get(alias); } public Set<String> getAllIndices() { return params.keySet(); } } }