/**
* Copyright (C) 2013 Romain Guefveneu.
*
* This file is part of naonedbus.
*
* Naonedbus 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.
*
* Naonedbus 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 net.naonedbus.rest.controller.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import net.naonedbus.rest.UrlBuilder;
import net.naonedbus.rest.container.FavoriContainer;
import net.naonedbus.rest.container.FavoriContainer.Favori;
import net.naonedbus.rest.container.FavoriContainer.Groupe;
import net.naonedbus.rest.controller.RestConfiguration;
import net.naonedbus.rest.controller.RestController;
import org.apache.http.HttpException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import android.util.SparseArray;
/**
* Classe d'envoi des favoris au WebService.
*
* @author romain.guefveneu
*
*/
public class FavoriController extends RestController<FavoriContainer> {
public static final String PATH = "favoris";
private static final String TAG_META = "meta";
private static final String TAG_META_VERSION = "version";
private static final String TAG_FAVORIS = "favoris";
private static final String TAG_FAVORI_CODE_LIGNE = "codeLigne";
private static final String TAG_FAVORI_CODE_SENS = "codeSens";
private static final String TAG_FAVORI_CODE_ARRET = "codeArret";
private static final String TAG_FAVORI_NOM_FAVORI = "nomFavori";
private static final String TAG_FAVORI_GROUPES = "groupes";
private static final String TAG_GROUPES = "groupes";
private static final String TAG_GROUPE_ID = "id";
private static final String TAG_GROUPE_NOM = "nom";
private static final String TAG_GROUPE_ORDRE = "ordre";
private final SparseArray<ContainerReader> mContainerReader = new SparseArray<ContainerReader>();
public FavoriController() {
mContainerReader.put(2, new AcapulcoContainerReader());
}
public String post(final String content) throws IOException, HttpException {
final UrlBuilder urlBuilder = new UrlBuilder(RestConfiguration.PATH, PATH);
urlBuilder.addQueryParameter("contenu", content);
return post(urlBuilder);
}
public FavoriContainer get(final String cle) throws IOException, JSONException {
final UrlBuilder url = new UrlBuilder(RestConfiguration.PATH, PATH);
url.addQueryParameter("identifiant", cle);
return parseJson(readJsonFromUrl(url.getUrl()));
}
public FavoriContainer parseJson(final String source) throws JSONException {
FavoriContainer result = null;
final JSONTokener tokener = new JSONTokener(source);
final Object object = tokener.nextValue();
if (object instanceof JSONArray) {
result = parseGreenDevil(new JSONArray(source));
} else if (object instanceof JSONObject) {
result = parseJsonObject(new JSONObject(source));
} else {
throw new JSONException("L'élément n'est pas flux JSON valide.");
}
return result;
}
@Override
protected FavoriContainer parseJsonObject(final JSONObject object) throws JSONException {
int version = -1;
if (object.has(TAG_META)) {
final JSONObject meta = object.getJSONObject(TAG_META);
version = meta.getInt(TAG_META_VERSION);
}
if (version != -1) {
final ContainerReader reader = mContainerReader.get(version);
return reader.parseJsonObject(object);
} else {
return null;
}
}
protected FavoriContainer parseGreenDevil(final JSONArray object) throws JSONException {
final FavoriContainer container = new FavoriContainer();
for (int i = 0; i < object.length(); i++) {
final JSONObject favori = object.getJSONObject(i);
container.addFavori(favori.getString(TAG_FAVORI_CODE_LIGNE), favori.getString(TAG_FAVORI_CODE_SENS),
favori.getString(TAG_FAVORI_CODE_ARRET), favori.getString(TAG_FAVORI_NOM_FAVORI), null);
}
return container;
}
@Override
public JSONObject toJsonObject(final FavoriContainer item) throws JSONException {
final JSONObject object = new JSONObject();
final JSONObject meta = new JSONObject();
meta.put(TAG_META_VERSION, FavoriContainer.VERSION);
object.put(TAG_META, meta);
final JSONArray groupes = new JSONArray();
for (final Groupe groupe : item.groupes) {
final JSONObject groupeJson = new JSONObject();
groupeJson.put(TAG_GROUPE_ID, groupe.id);
groupeJson.put(TAG_GROUPE_NOM, groupe.nom);
groupeJson.put(TAG_GROUPE_ORDRE, groupe.ordre);
groupes.put(groupeJson);
}
object.put(TAG_GROUPES, groupes);
final JSONArray favoris = new JSONArray();
for (final Favori favori : item.favoris) {
final JSONObject favoriJson = new JSONObject();
favoriJson.put(TAG_FAVORI_CODE_LIGNE, favori.codeLigne);
favoriJson.put(TAG_FAVORI_CODE_SENS, favori.codeSens);
favoriJson.put(TAG_FAVORI_CODE_ARRET, favori.codeArret);
favoriJson.put(TAG_FAVORI_NOM_FAVORI, favori.nomFavori);
final JSONArray idGroupes = new JSONArray();
for (final Integer id : favori.idGroupes) {
idGroupes.put(id);
}
favoriJson.put(TAG_FAVORI_GROUPES, idGroupes);
favoris.put(favoriJson);
}
object.put(TAG_FAVORIS, favoris);
return object;
}
interface ContainerReader {
FavoriContainer parseJsonObject(final JSONObject object) throws JSONException;
}
/**
* Import des favoris à partir de 3.0.
*
* @author romain
*
*/
class AcapulcoContainerReader implements ContainerReader {
@Override
public FavoriContainer parseJsonObject(final JSONObject object) throws JSONException {
final FavoriContainer container = new FavoriContainer();
final JSONArray groupes = object.getJSONArray(TAG_GROUPES);
for (int i = 0; i < groupes.length(); i++) {
final JSONObject groupe = groupes.getJSONObject(i);
container.addGroupe(groupe.getInt(TAG_GROUPE_ID), groupe.getString(TAG_GROUPE_NOM),
groupe.getInt(TAG_GROUPE_ORDRE));
}
final JSONArray favoris = object.getJSONArray(TAG_FAVORIS);
for (int i = 0; i < favoris.length(); i++) {
final JSONObject favori = favoris.getJSONObject(i);
final List<Integer> idGroupes = new ArrayList<Integer>();
final JSONArray favoriGroupeJson = favori.getJSONArray(TAG_FAVORI_GROUPES);
for (int g = 0; g < favoriGroupeJson.length(); g++) {
idGroupes.add(favoriGroupeJson.getInt(g));
}
final String nomFavori;
if (favori.has(TAG_FAVORI_NOM_FAVORI)) {
nomFavori = favori.getString(TAG_FAVORI_NOM_FAVORI);
} else {
nomFavori = null;
}
container.addFavori(favori.getString(TAG_FAVORI_CODE_LIGNE), favori.getString(TAG_FAVORI_CODE_SENS),
favori.getString(TAG_FAVORI_CODE_ARRET), nomFavori, idGroupes);
}
return container;
}
}
}