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 CellBlankNode extends ResourceNode implements CellNode{
final private String columnName;
final boolean isRowNumberCell;
final private String expression;
public CellBlankNode(String columnName,String exp,boolean isRowNumberCell){
this.columnName = columnName;
this.isRowNumberCell = isRowNumberCell;
this.expression = exp;
}
@Override
public Resource[] createResource(URI baseUri, ValueFactory factory, Project project,
Row row, int rowIndex,BNode[] blanks) {
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);
Resource[] bs = new BNode[lngth];
for(int i=0;i<lngth;i++){
bs[i] = factory.createBNode();
}
return bs;
}
return new Resource[]{factory.createBNode()};
}catch(Exception e){
return null;
}
}
@Override
public void writeNode(JSONWriter writer) throws JSONException {
writer.key("nodeType"); writer.value("cell-as-blank");
writer.key("isRowNumberCell"); writer.value(isRowNumberCell);
if(columnName!=null){
writer.key("columnName");writer.value(columnName);
}
}
@Override
public boolean isRowNumberCellNode() {
return isRowNumberCell;
}
@Override
public String getColumnName() {
return columnName;
}
}