/*
* Copyright (C) 2014 Language In Interaction
*
* 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 2
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package nl.ru.languageininteraction.language.client.service;
import nl.ru.languageininteraction.language.client.model.UserResults;
import com.google.gwt.storage.client.Storage;
import java.util.ArrayList;
import java.util.List;
import nl.ru.languageininteraction.language.client.model.MetadataField;
import nl.ru.languageininteraction.language.client.model.UserData;
import nl.ru.languageininteraction.language.client.model.UserId;
import nl.ru.languageininteraction.language.client.model.UserLabelData;
/**
* @since Oct 24, 2014 3:01:35 PM (creation date)
* @author Peter Withers <p.withers@psych.ru.nl>
*/
public class LocalStorage {
private Storage dataStore = null;
private static final String USER_RESULTS = "UserResults.";
private static final String LAST_USER_ID = "LastUserId.";
private static final String GAME_DATA = "GameData.";
protected static final String MAX_SCORE = "maxScore";
protected static final String MAX_POTENTIAL_SCORE = "potentialMaxScore";
protected static final String GAMES_PLAYED = "gamesPlayed";
final MetadataFieldProvider metadataFieldProvider = new MetadataFieldProvider();
private Storage loadStorage() {
if (dataStore == null) {
dataStore = Storage.getLocalStorageIfSupported();
}
return dataStore;
}
public void clearStoredGameData(UserId userId) {
loadStorage();
dataStore.setItem(GAME_DATA + userId.toString(), "");
}
public String getStoredGameData(UserId userId) {
loadStorage();
return getCleanStoredData(GAME_DATA + userId.toString());
}
public void addStoredGameData(UserId userId, String serialisedGameData) {
loadStorage();
dataStore.setItem(GAME_DATA + userId.toString(), getCleanStoredData(GAME_DATA + userId.toString()) + serialisedGameData);
}
public UserData getStoredData(UserId userId) {
UserData userData = new UserData(userId);
loadStorage();
if (dataStore != null) {
for (MetadataField metadataField : metadataFieldProvider.metadataFieldArray) {
userData.setMetadataValue(metadataField, getCleanStoredData(USER_RESULTS + userData.getUserId().toString() + "." + metadataField.getPostName()));
}
}
userData.setBestScore(getCleanStoredInt(USER_RESULTS + userData.getUserId().toString() + "." + MAX_SCORE));
userData.setPotentialMaxScore(getCleanStoredInt(USER_RESULTS + userData.getUserId().toString() + "." + MAX_POTENTIAL_SCORE));
userData.setGamesPlayed(getCleanStoredInt(USER_RESULTS + userData.getUserId().toString() + "." + GAMES_PLAYED));
return userData;
}
private int getCleanStoredInt(String keyString) {
final String cleanStoredData = getCleanStoredData(keyString);
try {
return Integer.parseInt(cleanStoredData);
} catch (NumberFormatException exception) {
return 0;
}
}
private String getCleanStoredData(String keyString) {
final String storedValue = dataStore.getItem(keyString);
return (storedValue == null || "undefined".equals(storedValue)) ? "" : storedValue;
}
public void clear() {
loadStorage();
if (dataStore != null) {
dataStore.clear();
}
}
public void storeData(UserResults userResults) {
loadStorage();
if (dataStore != null) {
for (MetadataField metadataField : metadataFieldProvider.metadataFieldArray) {
dataStore.setItem(USER_RESULTS + userResults.getUserData().getUserId().toString() + "." + metadataField.getPostName(), userResults.getUserData().getMetadataValue(metadataField));
}
}
dataStore.setItem(USER_RESULTS + userResults.getUserData().getUserId().toString() + "." + MAX_SCORE, Integer.toString(userResults.getUserData().getBestScore()));
dataStore.setItem(USER_RESULTS + userResults.getUserData().getUserId().toString() + "." + MAX_POTENTIAL_SCORE, Integer.toString(userResults.getUserData().getPotentialMaxScore()));
dataStore.setItem(USER_RESULTS + userResults.getUserData().getUserId().toString() + "." + GAMES_PLAYED, Integer.toString(userResults.getUserData().getGamesPlayed()));
dataStore.setItem(LAST_USER_ID, userResults.getUserData().getUserId().toString());
}
public UserId getLastUserId() {
loadStorage();
if (dataStore != null) {
final String storedUserId = getCleanStoredData(LAST_USER_ID);
if (!storedUserId.isEmpty()) {
return new UserId(storedUserId);
}
}
return null;
}
public List<UserLabelData> getUserIdList() {
final String postName = metadataFieldProvider.firstNameMetadataField.getPostName();
ArrayList<UserLabelData> userIdList = new ArrayList<>();
loadStorage();
if (dataStore != null) {
for (int itemIndex = 0; itemIndex < dataStore.getLength(); itemIndex++) {
final String key = dataStore.key(itemIndex);
if (key.endsWith(postName)) {
final String userIdString = key.split("\\.")[1];
final String cleanStoredData = getCleanStoredData(key);
// if (!cleanStoredData.isEmpty()) {
userIdList.add(new UserLabelData(new UserId(userIdString), cleanStoredData));
// }
}
}
}
return userIdList;
}
}