package edu.isi.karma.mapreduce.driver;
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapreduce.Mapper;
import org.json.JSONArray;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JSONTypeFilterMapper extends Mapper<Writable, Text, Text, Text> {
private static Logger LOG = LoggerFactory.getLogger(JSONTypeFilterMapper.class);
@Override
public void map(Writable key, Text value, Context context) throws IOException, InterruptedException {
try {
String typeFilter = context.getConfiguration().get("type.filter");
JSONObject obj = new JSONObject(value.toString());
if(obj.has("@type"))
{
boolean match = false;
Object typeObj = obj.get("@type");
if(typeObj instanceof String)
{
match = ((String)typeObj).compareTo(typeFilter) == 0;
}
else if(typeObj instanceof JSONArray)
{
JSONArray types = (JSONArray) typeObj;
for(int i = 0; i < types.length(); i++)
{
Object typeAti = types.get(i);
match |= typeAti instanceof String && ((String) typeAti).compareTo(typeFilter) == 0;
if(match)
break;
}
}
if(match)
{
if (obj.has("uri")) {
context.write(new Text(obj.getString("uri")), value);
}
else if (obj.has("@id")) {
context.write(new Text(obj.getString("@id")), value);
}
else {
context.write(new Text(obj.toString()), value);
}
}
}
}catch(Exception e) {
LOG.error("something is wrong", e);
}
}
}