Package org.deri.grefine.rdf.commands

Source Code of org.deri.grefine.rdf.commands.PreviewRdfValueExpressionCommand

package org.deri.grefine.rdf.commands;

import java.io.IOException;
import java.lang.reflect.Array;
import java.net.URI;
import java.net.URISyntaxException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.deri.grefine.rdf.Util;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONWriter;

import com.google.refine.commands.expr.PreviewExpressionCommand;
import com.google.refine.expr.EvalError;
import com.google.refine.expr.ExpressionUtils;
import com.google.refine.expr.ParsingException;
import com.google.refine.model.Project;
import com.google.refine.model.Row;
import com.google.refine.util.ParsingUtilities;

public class PreviewRdfValueExpressionCommand extends PreviewExpressionCommand{

  @Override
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    try {
            Project project = getProject(request);
           
            String columnName = request.getParameter("columnName");
            String uri = request.getParameter("isUri");
            boolean isUri = uri!=null && uri.equals("1") ? true:false;
           
            String expression = request.getParameter("expression");
            String rowIndicesString = request.getParameter("rowIndices");
            if (rowIndicesString == null) {
                respond(response, "{ \"code\" : \"error\", \"message\" : \"No row indices specified\" }");
                return;
            }
           
            String baseUri = request.getParameter("baseUri");
            URI base;
            try{
              base = new URI(baseUri);
            }catch(URISyntaxException ex){
              respond(response, "{ \"code\" : \"error\", \"message\" : \"Invalie Base URI\" }");
                return;
            }
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Type", "application/json");
           
            JSONArray rowIndices = ParsingUtilities.evaluateJsonStringToArray(rowIndicesString);
           
            JSONWriter writer = new JSONWriter(response.getWriter());
            if(isUri){
              respondUriPreview(project, writer, rowIndices, expression, columnName, base);
            }else{
              respondLiteralPreview(project, writer, rowIndices, expression, columnName);
            }
        } catch (Exception e) {
            respondException(response, e);
        }
  }
 
  private void respondUriPreview(Project project, JSONWriter writer, JSONArray rowIndices, String expression, String columnName, URI base) throws JSONException{
    int length = rowIndices.length();
       
        writer.object();
       
        try {
            writer.key("results"); writer.array();
            String[] absolutes = new String[length];
            for (int i = 0; i < length; i++) {
                Object result = null;
                absolutes[i] = null;
                int rowIndex = rowIndices.getInt(i);
                if (rowIndex >= 0 && rowIndex < project.rows.size()) {
                    Row row = project.rows.get(rowIndex);
                    result = Util.evaluateExpression(project, expression, columnName, row, rowIndex);
                }
               
                if (result == null) {
                    writer.value(null);
                } else if (ExpressionUtils.isError(result)) {
                    writer.object();
                    writer.key("message"); writer.value(((EvalError) result).message);
                    writer.endObject();
                } else {
                  StringBuffer sb = new StringBuffer();
                    writeValue(sb, result, false);
                    writer.value(sb.toString());
                    //prepare absolute value                   
                  if (result.getClass().isArray()) {
                    int lngth = Array.getLength(result);
                    StringBuilder resolvedUrisVal = new StringBuilder("[");
                    for(int k=0;k<lngth;k++){
                      resolvedUrisVal.append(Util.resolveUri(base,Array.get(result, k).toString()));
                      if(k<lngth-1){
                        resolvedUrisVal.append(",");
                      }
                    }
                    resolvedUrisVal.append("]");
                    absolutes[i] = resolvedUrisVal.toString();
                  } else {
                        absolutes[i] = Util.resolveUri(base,sb.toString());
                  }
                }
            }
            writer.endArray();
           
            //writing the absolutes
            writer.key("absolutes"); writer.array();
            for (int i = 0; i < length; i++) {
              writer.value(absolutes[i]);
            }
            writer.endArray();
            writer.key("code"); writer.value("ok");
        } catch (ParsingException e) {
          writer.endArray();
            writer.key("code"); writer.value("error");
            writer.key("type"); writer.value("parser");
            writer.key("message"); writer.value(e.getMessage());
        } catch (Exception e) {
          writer.endArray();
            writer.key("code"); writer.value("error");
            writer.key("type"); writer.value("other");
            writer.key("message"); writer.value(e.getMessage());
        }
       
        writer.endObject();

  }
 
 
  private void respondLiteralPreview(Project project, JSONWriter writer, JSONArray rowIndices, String expression, String columnName) throws JSONException{
    int length = rowIndices.length();
       
        writer.object();
       
        try {
            writer.key("results"); writer.array();
            for (int i = 0; i < length; i++) {
                Object result = null;
                int rowIndex = rowIndices.getInt(i);
                if (rowIndex >= 0 && rowIndex < project.rows.size()) {
                    Row row = project.rows.get(rowIndex);
                    result = Util.evaluateExpression(project, expression, columnName, row, rowIndex);
                }
               
                if (result == null) {
                    writer.value(null);
                } else if (ExpressionUtils.isError(result)) {
                    writer.object();
                    writer.key("message"); writer.value(((EvalError) result).message);
                    writer.endObject();
                } else {
                    StringBuffer sb = new StringBuffer();
                    writeValue(sb, result, false);
                    writer.value(sb.toString());
                }
            }
            writer.endArray();
           
            writer.key("code"); writer.value("ok");
        } catch (ParsingException e) {
            writer.key("code"); writer.value("error");
            writer.key("type"); writer.value("parser");
            writer.key("message"); writer.value(e.getMessage());
        } catch (Exception e) {
          writer.endArray();
            writer.key("code"); writer.value("error");
            writer.key("type"); writer.value("other");
            writer.key("message"); writer.value(e.getMessage());
        }
       
        writer.endObject();

  }
}
TOP

Related Classes of org.deri.grefine.rdf.commands.PreviewRdfValueExpressionCommand

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.