/*
GNU GENERAL PUBLIC LICENSE
Copyright (C) 2006 The Lobo Project
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
verion 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Contact info: lobochief@users.sourceforge.net
*/
package org.lobobrowser.context;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.eclipse.jdt.annotation.NonNull;
import org.lobobrowser.clientlet.ClientletContext;
import org.lobobrowser.clientlet.ClientletRequest;
import org.lobobrowser.clientlet.ClientletResponse;
import org.lobobrowser.clientlet.ComponentContent;
import org.lobobrowser.clientlet.ContentBuffer;
import org.lobobrowser.io.ManagedStore;
import org.lobobrowser.request.DomainValidation;
import org.lobobrowser.request.UserAgentImpl;
import org.lobobrowser.store.StorageManager;
import org.lobobrowser.ua.NavigatorFrame;
import org.lobobrowser.ua.NavigatorProgressEvent;
import org.lobobrowser.ua.ProgressType;
import org.lobobrowser.ua.UserAgent;
public class ClientletContextImpl implements ClientletContext {
private final NavigatorFrame frame;
private final ClientletRequest request;
private final ClientletResponse response;
public ClientletContextImpl(final NavigatorFrame frame, final ClientletRequest request, final ClientletResponse response) {
this.frame = frame;
this.request = request;
this.response = response;
}
public ContentBuffer createContentBuffer(final String contentType, final byte[] content) {
return new VolatileContentImpl(contentType, content);
}
public ContentBuffer createContentBuffer(final String contentType, final String content, final String encoding)
throws UnsupportedEncodingException {
final byte[] bytes = content.getBytes(encoding);
return new VolatileContentImpl(contentType, bytes);
}
public NavigatorFrame getNavigatorFrame() {
return this.frame;
}
private Map<String, Object> items = null;
public Object getItem(final String name) {
synchronized (this) {
final Map<String, Object> items = this.items;
if (items == null) {
return null;
}
return items.get(name);
}
}
public ManagedStore getManagedStore() throws IOException {
final ClientletResponse response = this.response;
if (response == null) {
throw new SecurityException("There is no client response");
}
final String hostName = response.getResponseURL().getHost();
return StorageManager.getInstance().getRestrictedStore(hostName, true);
}
public ManagedStore getManagedStore(final String hostName) throws IOException {
return StorageManager.getInstance().getRestrictedStore(hostName, true);
}
public ClientletRequest getRequest() {
return this.request;
}
public ClientletResponse getResponse() {
return this.response;
}
public UserAgent getUserAgent() {
return UserAgentImpl.getInstance();
}
public void setItem(final String name, final Object value) {
synchronized (this) {
Map<String, Object> items = this.items;
if (items == null) {
items = new HashMap<>(1);
this.items = items;
}
items.put(name, value);
}
}
private volatile ComponentContent resultingContent;
public ComponentContent getResultingContent() {
return this.resultingContent;
}
public void navigate(final String url) throws java.net.MalformedURLException {
final java.net.URL responseURL = this.response.getResponseURL();
final java.net.URL newURL = DomainValidation.guessURL(responseURL, url);
this.frame.navigate(newURL);
}
/*
public final void setResultingContent(final Component content, final URL url) {
// Must call other overload, which may be overridden.
this.setResultingContent(new SimpleComponentContent(content, url.toExternalForm(), null));
}
*/
public void setResultingContent(final ComponentContent content) {
this.resultingContent = content;
}
private volatile Properties windowProperties;
public void overrideWindowProperties(final Properties properties) {
this.windowProperties = properties;
}
public Properties getOverriddingWindowProperties() {
return this.windowProperties;
}
public boolean isResultingContentSet() {
return this.resultingContent != null;
}
public void setProgressEvent(final ProgressType progressType, final int value, final int max) {
this.setProgressEvent(progressType, value, max, this.getResponse().getResponseURL());
}
public NavigatorProgressEvent getProgressEvent() {
return this.frame.getProgressEvent();
}
public void setProgressEvent(final ProgressType progressType, final int value, final int max, final @NonNull URL url) {
final ClientletResponse response = this.getResponse();
final NavigatorFrame frame = this.getNavigatorFrame();
final String method = response.getLastRequestMethod();
frame.setProgressEvent(new NavigatorProgressEvent(this, frame, progressType, url, method, value, max));
}
public void setProgressEvent(final NavigatorProgressEvent event) {
this.getNavigatorFrame().setProgressEvent(event);
}
public void alert(final String message) {
this.getNavigatorFrame().alert(message);
}
public NavigatorFrame createNavigatorFrame() {
return this.getNavigatorFrame().createFrame();
}
}