/**
*
*/
package uk.bl.wa.shine;
import java.io.UnsupportedEncodingException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.FacetField.Count;
import org.apache.solr.client.solrj.response.QueryResponse;
import play.Logger;
/**
* @author Andrew Jackson <Andrew.Jackson@bl.uk>
*
*/
public class Query {
public String query;
public Map<String,List<String>> filters;
public QueryResponse res;
public void parseParams( Map<String,List<String>> params ) {
filters = new HashMap<String, List<String>>();
for( String param : params.keySet() ) {
if( param.startsWith("facet.in.")) {
filters.put(param.replace("facet.in.", ""), params.get(param));
} else if( param.startsWith("facet.out.")) {
filters.put("-"+param.replace("facet.out.", ""), params.get(param));
}
}
}
public String getCheckedInString(String facet_name, String value ) {
for( String fc : filters.keySet() ) {
if( fc.equals(facet_name) && filters.get(fc).contains("\""+value+"\"")) return "checked=\"\"";
}
return "";
}
public String getCheckedOutString(String facet_name, String value ) {
return this.getCheckedInString("-"+facet_name, value);
}
public String getParamsPlusFilter(String facet_name, String facet_value) {
String qp = "";
// Logger.info("---- ----");
for( String key : res.getFacetQuery().keySet() ) {
// Logger.info(key+">"+res.getFacetQuery().get(key));
}
for( FacetField fc: res.getLimitingFacets() ) {
// Logger.info("LF: "+fc);
}
for( FacetField fc : this.res.getFacetFields() ) {
// Logger.info("FF: "+fc);
if( fc.getName().equals(facet_name) ) {
}
}
return qp;
}
// Formatters
// Allow for pretty formatting of facet values:
public String formatFacet( FacetField fc, Count f ) {
if( "content_first_bytes".equals(fc.getName()) )
return this.formatHexString(f.getName());
if( "content_ffb".equals(fc.getName()) )
return this.formatHexString(f.getName());
return f.getName();
}
// Format numbers with commas:
public String formatNumber( long number ) {
NumberFormat numberFormat = new DecimalFormat("#,###");
return numberFormat.format(number);
}
// Hex to string:
// TODO Moving the HTML encoding (below) into templates.
public String formatHexString( String hex ) {
hex = hex.replaceAll(" ", "");
try {
byte[] bytes = Hex.decodeHex(hex.toCharArray());
hex = this.partialHexDecode(bytes);
} catch (DecoderException e) {
Logger.error("Hex decode failed: "+e);
} catch (UnsupportedEncodingException e) {
Logger.error("Hex to UTF-8 recoding failed: "+e);
}
return hex;
}
private String partialHexDecode( byte[] bytes ) throws UnsupportedEncodingException {
String myString = new String( bytes, "ASCII");
StringBuilder newString = new StringBuilder(myString.length());
for (int offset = 0; offset < myString.length();)
{
int codePoint = myString.codePointAt(offset);
offset += Character.charCount(codePoint);
// Replace invisible control characters and unused code points
switch (Character.getType(codePoint))
{
case Character.CONTROL: // \p{Cc}
case Character.FORMAT: // \p{Cf}
case Character.PRIVATE_USE: // \p{Co}
case Character.SURROGATE: // \p{Cs}
case Character.UNASSIGNED: // \p{Cn}
newString.append("<i class=\"hex\">");
newString.append(Hex.encodeHexString(new byte[] {Byte.valueOf((byte) codePoint) } ));
newString.append("</i>");
break;
default:
newString.append("<span class=\"lit\">");
newString.append(Character.toChars(codePoint));
newString.append("</span>");
break;
}
}
return newString.toString();
}
}