com.gargoylesoftware.htmlunit.javascript.host.StorageImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of vaadin-client-compiler-deps Show documentation
Show all versions of vaadin-client-compiler-deps Show documentation
Vaadin is a web application framework for Rich Internet Applications (RIA).
Vaadin enables easy development and maintenance of fast and
secure rich web
applications with a stunning look and feel and a wide browser support.
It features a server-side architecture with the majority of the logic
running
on the server. Ajax technology is used at the browser-side to ensure a
rich
and interactive user experience.
/*
* Copyright (c) 2002-2011 Gargoyle Software 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.gargoylesoftware.htmlunit.javascript.host;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.URL;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.gargoylesoftware.htmlunit.WebWindow;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.javascript.host.Storage.Type;
/**
* The actual implementation of different types of Storage.
*
* @version $Revision: 6204 $
* @author Ahmed Ashour
*/
final class StorageImpl implements Serializable {
private static final Log LOG = LogFactory.getLog(Storage.class);
private static StorageImpl SINGLETON_ = new StorageImpl();
static {
load();
}
private Map> globalStorage_
= new HashMap>();
private Map> localStorage_
= new HashMap>();
private transient Map> sessionStorage_
= new HashMap>();
private StorageImpl() { }
static StorageImpl getInstance() {
return SINGLETON_;
}
void set(final Type type, final HtmlPage page, final String key, final String data) {
set(getStorage(type), getKey(type, page), key, data);
}
Map getMap(final Type type, final HtmlPage page) {
final Map>storage = getStorage(type);
final String key = getKey(type, page);
Map map = storage.get(key);
if (map == null) {
map = new LinkedHashMap();
storage.put(key, map);
}
return map;
}
void clear(final Type type, final HtmlPage page) {
getStorage(type).remove(getKey(type, page));
}
private String getKey(final Type type, final HtmlPage page) {
switch (type) {
case GLOBAL_STORAGE:
return page.getUrl().getHost();
case LOCAL_STORAGE:
final URL url = page.getUrl();
return url.getProtocol() + "://" + url.getHost() + ':' + url.getProtocol();
case SESSION_STORAGE:
final WebWindow topWindow = page.getEnclosingWindow().getTopWindow();
return Integer.toHexString(topWindow.hashCode());
default:
return null;
}
}
Map> getStorage(final Type type) {
switch (type) {
case GLOBAL_STORAGE:
return globalStorage_;
case LOCAL_STORAGE:
return localStorage_;
case SESSION_STORAGE:
return sessionStorage_;
default:
return null;
}
}
private static void set(final Map> storage, final String url,
final String key, final String data) {
Map map = storage.get(url);
if (map == null) {
map = new LinkedHashMap();
storage.put(url, map);
}
map.put(key, data);
save();
}
String get(final Type type, final HtmlPage page, final String key) {
return get(getStorage(type), getKey(type, page), key);
}
private static String get(final Map> storage, final String url,
final String key) {
final Map map = storage.get(url);
if (map != null) {
return map.get(key);
}
return null;
}
private static void save() {
try {
final File file = new File(System.getProperty("user.home"), "htmlunit.storage");
final ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(SINGLETON_);
out.close();
}
catch (final IOException e) {
LOG.info("Could not save storage", e);
}
}
private static void load() {
try {
final File file = new File(System.getProperty("user.home"), "htmlunit.storage");
if (file.exists()) {
final ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
SINGLETON_ = (StorageImpl) in.readObject();
SINGLETON_.sessionStorage_ = new HashMap>();
in.close();
}
}
catch (final Exception e) {
LOG.info("Could not load storage", e);
}
}
}