| /* |
| * 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); |
| } |
| } |
| } |