package org.deri.grefine.rdf; import java.lang.reflect.Array; import java.net.URI; import org.json.JSONException; import org.json.JSONWriter; import org.openrdf.model.BNode; import org.openrdf.model.Resource; import org.openrdf.model.ValueFactory; import com.google.refine.expr.EvalError; import com.google.refine.model.Project; import com.google.refine.model.Row; public class CellResourceNode extends ResourceNode implements CellNode{ final private String uriExpression; final private String columnName; final private boolean isRowNumberCell; public String getUriExpression() { return uriExpression; } public CellResourceNode(String columnName,String exp,boolean isRowNumberCell) { this.columnName = columnName; this.uriExpression = exp; this.isRowNumberCell = isRowNumberCell; } @Override public Resource[] createResource(URI baseUri,ValueFactory factory,Project project,Row row,int rowIndex,BNode[] blanks) { try{ Object result = Util.evaluateExpression(project, uriExpression, columnName, row, rowIndex); if(result.getClass()==EvalError.class){ return null; } if(result.getClass().isArray()){ int lngth = Array.getLength(result); Resource[] rs = new org.openrdf.model.URI[lngth]; for(int i=0;i<lngth;i++){ String uri = Util.resolveUri(baseUri, Array.get(result, i).toString()); rs[i] = factory.createURI(uri); } return rs; } if(result.toString().length()>0){ String uri = Util.resolveUri(baseUri, result.toString()); return new Resource[] {factory.createURI(uri)}; }else{ return null; } }catch(Exception e){ //an empty cell might result in an exception out of evaluating URI expression... so it is intended to eat the exception return null; } } @Override public boolean isRowNumberCellNode() { return isRowNumberCell; } @Override public String getColumnName() { return columnName; } @Override protected void writeNode(JSONWriter writer) throws JSONException { writer.key("nodeType"); writer.value("cell-as-resource"); writer.key("expression"); writer.value(uriExpression); writer.key("isRowNumberCell"); writer.value(isRowNumberCell); if(columnName!=null){ writer.key("columnName"); writer.value(columnName); } } }