package gov.nist.registry.common2.registry.storedquery; import gov.nist.registry.common2.exception.MetadataException; import gov.nist.registry.common2.exception.XdsInternalException; import gov.nist.registry.common2.registry.And; import gov.nist.registry.common2.registry.SQCodedTerm; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; public class SqParams { HashMap<String, Object> params; String query_id; public SqParams(String queryid, HashMap<String, Object> params) { query_id = queryid; this.params = params; } public SqParams() { params = new HashMap<String, Object>(); } public String toString() { StringBuffer buf = new StringBuffer(); buf.append("SqParms\n"); for (Iterator<String> it = params.keySet().iterator(); it.hasNext(); ) { String name = it.next(); Object value = params.get(name); buf.append("\t"); buf.append(name); buf.append(" => "); buf.append(value); buf.append("\n"); } return buf.toString(); } public int size() { return params.size(); } public void addParm(String name, Object value) { params.put(name, value); } public boolean hasParm(String parmName) { return params.containsKey(parmName); } public Object getParm(String parmName) { return params.get(parmName); } public String getQueryId() { return query_id; } public void addStringParm(String name, String value) { addParm(name, value); } public void addIntParm(String name, Integer value) { addParm(name, value); } public void addIntParm(String name, BigInteger value) { addParm(name, value); } public void addListParm(String name, List<String> values) { addParm(name, values); } public void addListParm(String name, String onlyValue) { List<String> values = new ArrayList<String>(); values.add(onlyValue); addParm(name, values); } public String getStringParm(String name) { Object o = params.get(name); if ( o instanceof String) { return (String) o; } return null; } public String getIntParm(String name) throws MetadataException { Object o = params.get(name); if (o == null) return null; if ( o instanceof Integer) { Integer i = (Integer) o; return i.toString(); } if ( o instanceof BigInteger) { BigInteger i = (BigInteger) o; return i.toString(); } else throw new MetadataException("Parameter " + name + " - expecting a number but got " + o.getClass().getName() + " instead"); } public List<String> getListParm(String name) throws XdsInternalException, MetadataException { Object o = params.get(name); if (o == null) return null; if (o instanceof List) { List<String> a = (List<String>) o; if (a.size() == 0) throw new MetadataException("Parameter " + name + " is an empty list"); return a; } throw new XdsInternalException("get_arraylist_parm(): bad type = " + o.getClass().getName()); } public List<Object> getAndorParm(String name) throws XdsInternalException, MetadataException { Object o = params.get(name); if (o == null) return null; if (o instanceof ArrayList) { List<Object> a = (List<Object>) o; if (a.size() == 0) throw new MetadataException("Parameter " + name + " is an empty list"); return a; } throw new XdsInternalException("get_arraylist_parm(): bad type = " + o.getClass().getName()); } public SQCodedTerm getCodedParm(String name) throws MetadataException, XdsInternalException { Object o = params.get(name); if (o == null) return null; if (o instanceof SQCodedTerm) { SQCodedTerm term = (SQCodedTerm) o; if (term.isEmpty()) throw new MetadataException("Parameter " + name + " is empty"); return term; } throw new XdsInternalException("getCodedParm(): bad type = " + o.getClass().getName()); } public boolean isAnd(Object values) { return (values instanceof And); } public int andSize(Object values) { if ( !isAnd(values)) return 0; And and = (And) values; return and.size(); } // A simple OR query uses a single SQL variable to control // If AND logic is used then we need a separate SQL variable for each AND part // This method allocates the variable names public ArrayList<String> getAndorVarNames(Object andor, String varname) { ArrayList<String> names = new ArrayList<String>(); if ( !isAnd(andor)) { names.add(varname); return names; } And and = (And) andor; for (int i=0; i<and.size(); i++) { names.add(varname + i); } return names; } }