package org.deri.grefine.rdf; import java.lang.reflect.Array; import java.net.URI; import java.util.Properties; import org.json.JSONException; import org.json.JSONWriter; import org.openrdf.model.BNode; import org.openrdf.model.Literal; import org.openrdf.model.Value; import org.openrdf.model.ValueFactory; import org.openrdf.repository.RepositoryConnection; import com.google.refine.expr.EvalError; import com.google.refine.model.Project; import com.google.refine.model.Row; public class CellLiteralNode implements CellNode{ final private String valueType; final private String lang; final private String columnName; final boolean isRowNumberCell; final private String expression; public String getValueType() { return valueType; } public String getLang() { return lang; } public CellLiteralNode(String columnName, String exp, String valueType,String lang,boolean isRowNumberCell){ this.columnName = columnName; this.lang = lang; this.valueType = valueType; this.isRowNumberCell = isRowNumberCell; this.expression = exp; } @Override public Value[] createNode(URI baseUri, ValueFactory factory, RepositoryConnection con, Project project, Row row, int rowIndex,BNode[] blanks) { String[] val = null; try{ Object result = Util.evaluateExpression(project, expression, columnName, row, rowIndex); if(result.getClass()==EvalError.class){ return null; } if(result.getClass().isArray()){ int lngth = Array.getLength(result); val = new String[lngth]; for(int i=0;i<lngth;i++){ val[i] = Array.get(result,i).toString(); } }else if(result.toString().length()>0){ val = new String[1]; val[0] = result.toString(); } }catch(Exception e){ //an empty cell might result in an exception out of evaluating URI expression... so it is intended to eat the exception val = null; } if(val!=null && val.length>0){ Literal[] ls = new Literal[val.length]; for(int i=0;i<val.length;i++){ Literal l; if(this.valueType!=null){ l = factory.createLiteral(val[i], factory.createURI(valueType)); }else{ if(this.lang!=null){ l = factory.createLiteral(val[i],lang); }else{ l = factory.createLiteral(val[i]); } } ls[i] = l; } return ls; }else{ return null; } } @Override public boolean isRowNumberCellNode() { return isRowNumberCell; } @Override public String getColumnName() { return columnName; } @Override public void write(JSONWriter writer, Properties options) throws JSONException { writer.object(); writer.key("nodeType"); writer.value("cell-as-literal"); writer.key("expression"); writer.value(expression); writer.key("isRowNumberCell"); writer.value(isRowNumberCell); if(valueType!=null){ writer.key("valueType"); writer.value(valueType); } if(lang!=null){ writer.key("lang"); writer.value(lang); } if(columnName!=null){ writer.key("columnName"); writer.value(columnName); } writer.endObject(); } }