package de.swm.gwt.client.mobile.keystore.impl; import de.swm.gwt.client.mobile.keystore.IKeyStoreOperations; import de.swm.gwt.client.mobile.keystore.IStorage; import de.swm.gwt.client.mobile.keystore.KeyCollection; import de.swm.gwt.client.mobile.keystore.KeySet; import name.pehl.piriti.json.client.JsonReader; import name.pehl.piriti.json.client.JsonWriter; import java.util.ArrayList; import java.util.List; /** * Encapsulates bulk operations storing objects in a HTML5 key value storage. * * @author wiese.daniel <br> * copyright (C) 2012, SWM Services GmbH */ public class KeyStoreOperations implements IKeyStoreOperations { private final IStorage localStorage; private final JsonReader<KeySet> keyset_reader; private final JsonWriter<KeySet> keyset_writer; /** * Default constructor. * * @param localStorage the storage instance * @param keyset_reader the reader for a keyset * @param keyset_writer the reader for a keylist */ public KeyStoreOperations(IStorage localStorage, JsonReader<KeySet> keyset_reader, JsonWriter<KeySet> keyset_writer) { this.localStorage = localStorage; this.keyset_reader = keyset_reader; this.keyset_writer = keyset_writer; } /** * Reads a list of typed objects for a local storage. * * @param <T> th objects class type * @param userID the user id (only objects stored for this user id will be retrieved) * @param useCase the use case id (only objects stored for this use case will be retrieved) * @param forClass the java type of the object to retrieve * @param jsonReader the jeson reader for this object class type * @return list of objects or empty list */ @Override public <T> List<T> getDTOList(String userID, String useCase, Class<T> forClass, JsonReader<T> jsonReader) { final String keysetAsJson = localStorage .getItem(new KeySet(forClass, userID, useCase).createKeyCollectionKey()); if (keysetAsJson != null) { final KeySet keySet = keyset_reader.read(keysetAsJson); return getDTOList(keySet, jsonReader); } else { return new ArrayList<T>(); } } /** * Reads a list of typed objects for a local storage and deletes all objects after the retireval. * * @param <T> th objects class type * @param userID the user id (only objects stored for this user id will be retrieved) * @param useCase the use case id (only objects stored for this use case will be retrieved) * @param forClass the java type of the object to retrieve * @param jsonReader the jeson reader for this object class type * @return list of objects or empty list */ @Override public <T> List<T> getDTOListAndDeleteIt(String userID, String useCase, Class<T> forClass, JsonReader<T> jsonReader) { String collectionKey = new KeySet(forClass, userID, useCase).createKeyCollectionKey(); final String keysetAsJson = localStorage.getItem(collectionKey); localStorage.removeItem(collectionKey); if (keysetAsJson != null) { final KeySet keySet = keyset_reader.read(keysetAsJson); return getDTOListAndDeleteIt(keySet, jsonReader); } else { return new ArrayList<T>(); } } /** * Liest eine Liste von Objekten oder DTO's aus dem Local storage. * * @param <T> . * @param keyCollection . * @param jsonReader . * @return . */ @Override public <T> List<T> getDTOList(KeyCollection keyCollection, JsonReader<T> jsonReader) { final List<T> result = new ArrayList<T>(); for (String keyToRead : keyCollection.getKeys()) { result.add(jsonReader.read(localStorage.getItem(keyToRead))); } return result; } /** * Removes objects implicitly stored inside the key collection from the local storage. * * @param keyCollection incuding the objects to remove */ @Override public void removeDTOList(KeyCollection keyCollection) { for (String keyToRemove : keyCollection.getKeys()) { localStorage.removeItem(keyToRemove); } localStorage.removeItem(keyCollection.createKeyCollectionKey()); } /** * Liest eine Liste von Objekten oder DTO's aus dem Local storage. * * @param <T> . * @param keyCollection . * @param jsonReader . * @return . */ @Override public <T> List<T> getDTOListAndDeleteIt(KeyCollection keyCollection, JsonReader<T> jsonReader) { final List<T> result = new ArrayList<T>(); for (String keyToRead : keyCollection.getKeys()) { result.add(jsonReader.read(localStorage.getItem(keyToRead))); localStorage.removeItem(keyToRead); } localStorage.removeItem(keyCollection.createKeyCollectionKey()); return result; } /** * Aktualisert ein einzelnes DTO im local storage. * * @param <T> . * @param toUpdate . * @param keySet . * @param oid . * @param jsonWriter . */ @Override public <T> void updateDTO(T toUpdate, KeySet keySet, String oid, JsonWriter<T> jsonWriter) { final String key = keySet.createKey(oid); localStorage.setItem(key, jsonWriter.toJson(toUpdate)); localStorage.setItem(keySet.createKeyCollectionKey(), keyset_writer.toJson(keySet)); } /** * Loescht ein einzelnes DTO im local storage. * * @param <T> . * @param oidToDelete . * @param keySet . * @param jsonWriter . */ @Override public <T> void deleteDTO(KeySet keySet, String oidToDelete, JsonWriter<T> jsonWriter) { final String key = keySet.createKeyForRemoval(oidToDelete); localStorage.removeItem(key); localStorage.setItem(keySet.createKeyCollectionKey(), keyset_writer.toJson(keySet)); } /** * Schreibt eine liste von DTO's in den local storage oder fuehrt ein Update durch falls das objekt bereits * vorhanden ist. * * @param <T> . * @param toUpdate . * @param keySet . * @param jsonWriter . * @param oids die lister der internen id's */ @Override public <T> void updateOrCreateDTOList(List<T> toUpdate, KeySet keySet, JsonWriter<T> jsonWriter, List<Long> oids) { int i = 0; for (T type : toUpdate) { final String key = keySet.createKey(String.valueOf(oids.get(i))); localStorage.setItem(key, jsonWriter.toJson(type)); i++; } localStorage.setItem(keySet.createKeyCollectionKey(), keyset_writer.toJson(keySet)); } /** * Laedt einen keyset aus dem Local Storage oder erzeugt einen neuen leeren Keyset. * * @param forClass der typ der zu speichernden Objekte * @param uuid die uuid * @param useCase der use case * @return der keyset. */ @Override public KeySet loadKeysetFormStoreOrCreateEmptyOne(Class<?> forClass, String uuid, String useCase) { KeySet emptyKeySet = new KeySet(forClass, uuid, useCase); String keysetFormStoreAsJsonString = localStorage.getItem(emptyKeySet.createKeyCollectionKey()); if (keysetFormStoreAsJsonString != null) { return keyset_reader.read(keysetFormStoreAsJsonString); } return emptyKeySet; } /** * Schreibt eine liste von beliebigen Objekten in den local storage. Es muss sichegestellt werden, dass eine * eventuell vorhandene List geloescht worden ist. * * @param <T> . * @param toUpdate . * @param keySet . * @param jsonWriter . */ @Override public <T> void createList(List<T> toUpdate, KeySet keySet, JsonWriter<T> jsonWriter) { int id = 0; for (T type : toUpdate) { id++; final String key = keySet.createKey(String.valueOf(id)); localStorage.setItem(key, jsonWriter.toJson(type)); } localStorage.setItem(keySet.createKeyCollectionKey(), keyset_writer.toJson(keySet)); } }