fr.gotorennes.remote.RelayParkService.java Source code

Java tutorial

Introduction

Here is the source code for fr.gotorennes.remote.RelayParkService.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Michel DAVID mimah35-at-gmail.com
 * 
 * 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.
 * 
 * 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 fr.gotorennes.remote;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import fr.gotorennes.AbstractMapActivity;
import fr.gotorennes.domain.RelayPark;

public class RelayParkService extends RemoteService<RelayPark> {

    public static final String COMMAND = "getrelayparks";
    public static final String NODE = "relaypark";

    private static RelayParkService instance;

    private RelayParkService(Context context) {
        super();
    }

    protected String getVersion() {
        return "2.0";
    }

    public static synchronized RelayParkService getInstance(Context context) {
        if (instance == null) {
            instance = new RelayParkService(context);
        }
        return instance;
    }

    private long lastUpdate = 0;
    private List<RelayPark> cache = null;

    public List<RelayPark> getRelayParks() {
        if (cache == null || System.currentTimeMillis() - lastUpdate > 60000) {
            cache = loadList(COMMAND, NODE);
            if (cache != null) {
                lastUpdate = System.currentTimeMillis();
            }
        }
        return cache != null ? new ArrayList<RelayPark>(cache) : cache;
    }

    public List<RelayPark> getRelayParks(double latitudeMin, double latitudeMax, double longitudeMax,
            double longitudeMin) {
        List<RelayPark> relayParks = getRelayParks();
        if (relayParks == null) {
            return null;
        }
        List<RelayPark> result = new ArrayList<RelayPark>();
        for (RelayPark parc : relayParks) {
            if (parc.latitude >= latitudeMin && parc.latitude <= latitudeMax && parc.longitude >= longitudeMin
                    && parc.longitude <= longitudeMax) {
                result.add(parc);
            }
        }
        return result;
    }

    public List<RelayPark> getProximityRelayParks(final double latitude, final double longitude) {
        List<RelayPark> relayParks = loadList(getProximityCommand(latitude, longitude), NODE);
        if (relayParks != null) {
            Collections.sort(relayParks, new Comparator<RelayPark>() {

                @Override
                public int compare(RelayPark relayPark1, RelayPark relayPark2) {
                    double distance1 = AbstractMapActivity.getDistance(latitude, longitude, relayPark1.latitude,
                            relayPark1.longitude);
                    double distance2 = AbstractMapActivity.getDistance(latitude, longitude, relayPark2.latitude,
                            relayPark2.longitude);
                    return Double.compare(distance1, distance2);
                }
            });
        }
        return relayParks;
    }

    public RelayPark getRelayPark(String name) {
        List<RelayPark> relayParks = getRelayParks();
        if (relayParks == null) {
            return null;
        }

        for (RelayPark relayPark : relayParks) {
            if (relayPark.name.equals(name)) {
                return relayPark;
            }
        }
        return null;
    }

    protected String getProximityCommand(double latitude, double longitude) {
        StringBuilder stringBuilder = new StringBuilder(COMMAND);
        stringBuilder.append("&latitude=");
        stringBuilder.append(String.valueOf(latitude));
        stringBuilder.append("&longitude=");
        stringBuilder.append(String.valueOf(longitude));
        return stringBuilder.toString();
    }

    @Override
    protected RelayPark populate(JSONObject jsonObject) throws JSONException {
        RelayPark relayPark = new RelayPark();
        relayPark.name = jsonObject.getString("name");
        relayPark.state = Integer.parseInt(jsonObject.getString("state"));
        relayPark.capacity = Integer.parseInt(jsonObject.getString("carparkcapacity"));
        relayPark.available = Integer.parseInt(jsonObject.getString("carparkavailable"));
        relayPark.latitude = Double.parseDouble(jsonObject.getString("latitude"));
        relayPark.longitude = Double.parseDouble(jsonObject.getString("longitude"));
        return relayPark;
    }

}