blob: f3e8f7349bf9b74e2f3f1e594c50cb91aba88b0e [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* 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.google.gwt.sample.mobilewebapp.client;
import com.google.gwt.sample.mobilewebapp.shared.TaskProxy;
import com.google.gwt.sample.mobilewebapp.shared.TaskProxyImpl;
import com.google.gwt.storage.client.Storage;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Manages the storage and retrieval of local tasks.
*/
public class TaskProxyLocalStorage {
private static final String TASKLIST_SAVE_KEY = "TASKLIST";
private static final String TASKSEP = "&&";
private static final String FIELDSEP = "@@";
private static final String FIELDEMPTY = "***";
/**
* Convert a task proxy list into a string.
*/
private static String getStringFromTaskProxy(List<TaskProxy> list) {
StringBuilder sb = new StringBuilder();
for (TaskProxy proxy : list) {
sb.append(proxy.getDueDate() != null ? proxy.getDueDate().getTime() : FIELDEMPTY);
sb.append(FIELDSEP);
sb.append(proxy.getId() != null ? proxy.getId() : "");
sb.append(FIELDSEP);
String name = proxy.getName();
sb.append(name != null && name.length() > 0 ? proxy.getName() : FIELDEMPTY);
sb.append(FIELDSEP);
String notes = proxy.getNotes();
sb.append(notes != null && notes.length() > 0 ? proxy.getNotes() : FIELDEMPTY);
sb.append(TASKSEP);
}
return sb.toString();
}
/**
* Parse a task proxy list from a string.
*/
private static List<TaskProxy> getTaskProxyFromString(String taskProxyList) {
ArrayList<TaskProxy> list = new ArrayList<TaskProxy>(0);
if (taskProxyList == null) {
return list;
}
// taskproxy1&&taskproxy2&&taskproxy3&&...
String taskProxyStrings[] = taskProxyList.split(TASKSEP);
for (String taskProxyString : taskProxyStrings) {
if (taskProxyString == null) {
continue;
}
// date@@id@@name@@notes
String taskProxyStringData[] = taskProxyString.split(FIELDSEP);
if (taskProxyStringData.length >= 4) {
// collect the fields
String dateString = taskProxyStringData[0];
String idString = taskProxyStringData[1];
String nameString = taskProxyStringData[2];
if (FIELDEMPTY.equals(nameString)) {
nameString = null;
}
String notesString = taskProxyStringData[3];
if (FIELDEMPTY.equals(notesString)) {
notesString = null;
}
// parse the numerical fields
Date dueDate = null;
try {
dueDate = new Date(Long.parseLong(dateString));
} catch (NumberFormatException nfe) {
}
Long idLong = 0L;
try {
idLong = Long.parseLong(idString);
} catch (NumberFormatException nfe) {
}
// create and populate the TaskProxy
TaskProxyImpl taskProxy = new TaskProxyImpl();
taskProxy.setDueDate(dueDate);
taskProxy.setId(idLong);
taskProxy.setName(nameString);
taskProxy.setNotes(notesString);
list.add(taskProxy);
}
}
return list;
}
private final Storage storage;
private List<TaskProxy> tasks;
private Map<Long, TaskProxy> taskMap;
public TaskProxyLocalStorage(Storage storage) {
this.storage = storage;
}
/**
* Get a task by its ID.
*
* @param id the task id
* @return the task, or null if it isn't in local storage
*/
public TaskProxy getTask(Long id) {
// Create the map of tasks.
if (taskMap == null) {
taskMap = new HashMap<Long, TaskProxy>();
for (TaskProxy task : getTasks()) {
taskMap.put(task.getId(), task);
}
}
return taskMap.get(id);
}
/**
* Get a list of all tasks in local storage.
*/
public List<TaskProxy> getTasks() {
if (tasks == null) {
// Load the saved task list from storage
if (storage != null) { // if storage is supported
String taskString = storage.getItem(TASKLIST_SAVE_KEY);
tasks = getTaskProxyFromString(taskString);
} else {
tasks = new ArrayList<TaskProxy>();
}
}
return tasks;
}
/**
* Save a list of tasks to local storage.
*/
public void setTasks(List<TaskProxy> tasks) {
this.tasks = tasks;
// Save the response to storage
if (storage != null) { // if storage is supported
String responseString = getStringFromTaskProxy(tasks);
storage.setItem(TASKLIST_SAVE_KEY, responseString);
}
}
}