org.mixare.data.convert.TwitterDataProcessor.java Source code

Java tutorial

Introduction

Here is the source code for org.mixare.data.convert.TwitterDataProcessor.java

Source

/*
 * Copyright (C) 2012- Peer internet solutions & Finalist IT Group
 * 
 * This file is part of mixare.
 * 
 * This program is free software: you can redistribute it and/or modify it 
 * under the terms of the GNU General Public License as published by 
 * the Free Software Foundation, either version 3 of the License, or 
 * (at your option) any later version. 
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License 
 * for more details. 
 * 
 * You should have received a copy of the GNU General Public License along with 
 * this program. If not, see <http://www.gnu.org/licenses/>
 */
package org.mixare.data.convert;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.mixare.MixView;
import org.mixare.SocialMarker;
import org.mixare.data.DataHandler;
import org.mixare.data.DataSource;
import org.mixare.lib.marker.Marker;

import android.util.Log;

/**
 * A data processor for twitter urls or data, Responsible for converting raw data (to json and then) to marker data.
 * @author A. Egal
 */
public class TwitterDataProcessor extends DataHandler implements DataProcessor {

    public static final int MAX_JSON_OBJECTS = 1000;

    @Override
    public String[] getUrlMatch() {
        String[] str = { "twitter" };
        return str;
    }

    @Override
    public String[] getDataMatch() {
        String[] str = { "twitter" };
        return str;
    }

    @Override
    public boolean matchesRequiredType(String type) {
        if (type.equals(DataSource.TYPE.TWITTER.name())) {
            return true;
        }
        return false;
    }

    @Override
    public List<Marker> load(String rawData, int taskId, int colour) throws JSONException {
        List<Marker> markers = new ArrayList<Marker>();
        JSONObject root = convertToJSON(rawData);
        JSONArray dataArray = root.getJSONArray("results");
        int top = Math.min(MAX_JSON_OBJECTS, dataArray.length());

        for (int i = 0; i < top; i++) {
            JSONObject jo = dataArray.getJSONObject(i);

            Marker ma = null;
            if (jo.has("geo")) {
                Double lat = null, lon = null;

                if (!jo.isNull("geo")) {
                    JSONObject geo = jo.getJSONObject("geo");
                    JSONArray coordinates = geo.getJSONArray("coordinates");
                    lat = Double.parseDouble(coordinates.getString(0));
                    lon = Double.parseDouble(coordinates.getString(1));
                } else if (jo.has("location")) {

                    // Regex pattern to match location information
                    // from the location setting, like:
                    // iPhone: 12.34,56.78
                    // T: 12.34,56.78
                    // 12.34,56.78

                    Pattern pattern = Pattern.compile("\\D*([0-9.]+),\\s?([0-9.]+)");
                    Matcher matcher = pattern.matcher(jo.getString("location"));

                    if (matcher.find()) {
                        lat = Double.parseDouble(matcher.group(1));
                        lon = Double.parseDouble(matcher.group(2));
                    }
                }
                if (lat != null) {
                    Log.v(MixView.TAG, "processing Twitter JSON object");
                    String user = jo.getString("from_user");
                    String url = "http://twitter.com/" + user;

                    //no ID is needed, since identical tweet by identical user may be safely merged into one.
                    ma = new SocialMarker("", user + ": " + jo.getString("text"), lat, lon, 0, url, taskId, colour);
                    markers.add(ma);
                }
            }
        }
        return markers;
    }

    private JSONObject convertToJSON(String rawData) {
        try {
            return new JSONObject(rawData);
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }
    }

}