com.chalmers.feedlr.parser.FacebookJSONParser.java Source code

Java tutorial

Introduction

Here is the source code for com.chalmers.feedlr.parser.FacebookJSONParser.java

Source

/*
 * Copyright 2012 Feedlr
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.chalmers.feedlr.parser;

import java.io.IOException;
import java.util.List;

import com.chalmers.feedlr.model.FacebookItem;
import com.chalmers.feedlr.model.User;
import com.fasterxml.jackson.core.JsonParseException;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;

import android.util.Log;

/**
 * Class description
 * 
 * @author Daniel Larsson
 * 
 *         A parser for Facebook responses. The parsing is done with the Jackson
 *         JSON Processor.
 */

public class FacebookJSONParser {

    private static ObjectMapper mapper;
    private static ObjectReader itemReader;
    private static ObjectReader userReader;

    public FacebookJSONParser() {
        if (mapper == null) {
            mapper = new ObjectMapper();
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        }
    }

    /*
     * Parse a JSON response for a list of statuses from Facebook's REST API
     * with Jackson's databinding parse method.
     * 
     * @return list containing <code>FacebookItems</code>
     */
    public List<FacebookItem> parseFeed(String json) {
        long time = System.currentTimeMillis();

        if (itemReader == null) {
            itemReader = mapper.reader(new TypeReference<List<FacebookItem>>() {
            });
        }

        List<FacebookItem> list = null;

        if (json.contains("statuses")) {
            String data = json.substring(json.indexOf("statuses") + 18);
            try {
                list = itemReader.readValue(data);
                Log.i(FacebookJSONParser.class.getName(), "Parsed " + list.size() + " Facebook items in "
                        + (System.currentTimeMillis() - time) + " millis.");
            } catch (JsonParseException e) {
                Log.e(getClass().getName(), e.getMessage());
            } catch (JsonMappingException e) {
                Log.e(getClass().getName(), e.getMessage());
            } catch (IOException e) {
                Log.e(getClass().getName(), e.getMessage());
            }
        }

        return list;
    }

    /*
     * Parse a JSON response for a list of users from Facebook's REST API with
     * Jackson's databinding parse method. The list will be filled with
     * 
     * @return list containing <code>Users</code>
     */
    public List<User> parseUsers(String json) {
        long time = System.currentTimeMillis();
        String data = json.substring(8);

        if (userReader == null) {
            userReader = mapper.reader(new TypeReference<List<User>>() {
            });
        }
        List<User> list = null;

        try {
            list = userReader.readValue(data);
        } catch (JsonParseException e) {
            Log.e(getClass().getName(), e.getMessage());
        } catch (JsonMappingException e) {
            Log.e(getClass().getName(), e.getMessage());
        } catch (IOException e) {
            Log.e(getClass().getName(), e.getMessage());
        }

        Log.i(FacebookJSONParser.class.getName(),
                "Parsed " + list.size() + " Facebook users in " + (System.currentTimeMillis() - time) + " millis.");

        return list;
    }
}