package org.ovirt.engine.ui.common.system; import java.util.Date; import com.google.gwt.storage.client.Storage; import com.google.gwt.user.client.Cookies; import com.google.inject.Inject; /** * Default implementation of {@link ClientStorage} interface. * <p> * Applies an application-specific {@linkplain ClientStorageKeyPrefix prefix} to all key names. */ public class ClientStorageImpl implements ClientStorage { // Fifty years, in milliseconds private static final long PERSISTENT_COOKIE_EXPIRATION = 50L * 365L * 24L * 60L * 60L * 1000L; private static Storage localStorage; private static Storage sessionStorage; private final String keyPrefix; @Inject public ClientStorageImpl(@ClientStorageKeyPrefix String keyPrefix) { this.keyPrefix = keyPrefix; initStorage(); } void initStorage() { localStorage = Storage.getLocalStorageIfSupported(); sessionStorage = Storage.getSessionStorageIfSupported(); } String getPrefixedKey(String key) { return keyPrefix + "_" + key; //$NON-NLS-1$ } @Override public boolean isWebStorageAvailable() { return localStorage != null && sessionStorage != null; } @Override public String getLocalItem(String key) { String value = getLocalItemImpl(getPrefixedKey(key)); // If missing, use un-prefixed key for backwards compatibility return (value != null) ? value : getLocalItemImpl(key); } String getLocalItemImpl(String key) { if (localStorage != null) { return localStorage.getItem(key); } else { return Cookies.getCookie(key); } } @Override public void setLocalItem(String key, String value) { setLocalItemImpl(getPrefixedKey(key), value); } void setLocalItemImpl(String key, String value) { if (localStorage != null) { localStorage.setItem(key, value); } else { // Emulate persistent storage using cookies which have predefined expiration date Cookies.setCookie(key, value, new Date(new Date().getTime() + PERSISTENT_COOKIE_EXPIRATION)); } } @Override public String getSessionItem(String key) { String value = getSessionItemImpl(getPrefixedKey(key)); // If missing, use un-prefixed key for backwards compatibility return (value != null) ? value : getSessionItemImpl(key); } String getSessionItemImpl(String key) { if (sessionStorage != null) { return sessionStorage.getItem(key); } else { return Cookies.getCookie(key); } } @Override public void setSessionItem(String key, String value) { setSessionItemImpl(getPrefixedKey(key), value); } void setSessionItemImpl(String key, String value) { if (sessionStorage != null) { sessionStorage.setItem(key, value); } else { // Emulate transient storage using cookies which expire when the browser session ends Cookies.setCookie(key, value); } } }