summaryrefslogtreecommitdiff
path: root/src/Chapter5/trends/ExtractDatasetTrend.java
blob: dad7f2749f7899c652139998ad4b774bb11dd5ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* TweetTracker. Copyright (c) Arizona Board of Regents on behalf of Arizona State University
 * @author shamanth
 */
package Chapter5.trends;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class ExtractDatasetTrend
{
    static final String DEF_INFILENAME = "ows.json";
    // Date pattern used to count the volume of tweets
    final SimpleDateFormat SDM = new SimpleDateFormat("dd MMM yyyy HH:mm");

    public JSONArray GenerateDataTrend(String inFilename)
    {
        BufferedReader br = null;
        JSONArray result = new JSONArray();
        HashMap<String,Integer> datecount = new HashMap<String,Integer>();
        try{
            br= new BufferedReader(new InputStreamReader(new FileInputStream(inFilename),"UTF-8"));
            String temp = "";
            while((temp = br.readLine())!=null)
            {
                try {
                    JSONObject jobj = new JSONObject(temp);
                    long timestamp = jobj.getLong("timestamp");
                    Date d = new Date(timestamp);
                    String strdate = SDM.format(d);
                    if(datecount.containsKey(strdate))
                    {
                        datecount.put(strdate, datecount.get(strdate)+1);
                    }
                    else
                    {
                        datecount.put(strdate, 1);
                    }
                } catch (JSONException ex) {
                    Logger.getLogger(ExtractDatasetTrend.class.getName()).log(Level.SEVERE, null, ex);
                }                
            }
            /** DateInfo consists of a date string and the corresponding count.
              * It also implements a Comparator for sorting by date
              */
            ArrayList<DateInfo> dinfos = new ArrayList<DateInfo>();
            Set<String> keys = datecount.keySet();
            for(String key:keys)
            {
                DateInfo dinfo = new DateInfo();
                try {
                    dinfo.d = SDM.parse(key);
                } catch (ParseException ex) {
                    ex.printStackTrace();
                    continue;
                }
                dinfo.count = datecount.get(key);
                dinfos.add(dinfo);
            }
            Collections.sort(dinfos);
            // Format and return the date string and the corresponding count
            for(DateInfo dinfo:dinfos)
            {
                try{
                    JSONObject jobj = new JSONObject();
                    jobj.put("date", SDM.format(dinfo.d));
                    jobj.put("count", dinfo.count);
                    result.put(jobj);
                }catch(JSONException ex)
                {
                    ex.printStackTrace();
                }
            }
        }catch(IOException ex)
        {
            ex.printStackTrace();
        }finally{
            try {
                br.close();
            } catch (IOException ex) {
                Logger.getLogger(ExtractDatasetTrend.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return result;
    }

    public static void main(String[] args)
    {
        ExtractDatasetTrend edt = new ExtractDatasetTrend();
        
        String infilename = DEF_INFILENAME;
        if(args!=null)
        {
            if(args.length>=1&&!args[0].isEmpty())
            {
                File fl = new File(args[0]);
                if(fl.exists())
                {
                    infilename = args[0];
                }
            }
        }
        System.out.println(edt.GenerateDataTrend(infilename));
    }

}