001 /*
002 * Created on Jul 10, 2008
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005 * in compliance with the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License
010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011 * or implied. See the License for the specific language governing permissions and limitations under
012 * the License.
013 *
014 * Copyright @2008-2010 the original author or authors.
015 */
016 package org.fest.swing.applet;
017
018 import static java.util.Collections.enumeration;
019 import static org.fest.util.Collections.list;
020
021 import java.applet.*;
022 import java.awt.Image;
023 import java.io.InputStream;
024 import java.net.URL;
025 import java.util.*;
026
027 /**
028 * Understands a basic (and limited) implementation of <code>{@link AppletContext}</code>.
029 *
030 * @author Alex Ruiz
031 * @author Yvonne Wang
032 */
033 public class BasicAppletContext implements AppletContext {
034
035 private static final Enumeration<Applet> NO_APPLETS = new EmptyAppletEnumeration();
036
037 private static final class EmptyAppletEnumeration implements Enumeration<Applet> {
038 EmptyAppletEnumeration() {}
039
040 public boolean hasMoreElements() {
041 return false;
042 }
043
044 public Applet nextElement() {
045 return null;
046 }
047 }
048
049 private final Map<String, InputStream> streamMap = new HashMap<String, InputStream>();
050 private final StatusDisplay statusDisplay;
051
052 /**
053 * Creates a new </code>{@link BasicAppletContext}</code>.
054 * @param statusDisplay where the application can inform users of its current state.
055 * @throws NullPointerException if <code>statusDisplay</code> is <code>null</code>.
056 */
057 public BasicAppletContext(StatusDisplay statusDisplay) {
058 if (statusDisplay == null) throw new NullPointerException("Instance of StatusDisplay should not be null");
059 this.statusDisplay = statusDisplay;
060 }
061
062 /**
063 * If the <code>{@link StatusDisplay}</code> passed to this context is an instance of
064 * <code>{@link AppletViewer}</code>, this method will return the {@code Applet} of such {@code AppletViewer}.
065 * Otherwise this method returns <code>null</code>.
066 * @return the {@code Applet} in this context's {@link StatusDisplay} (if any.)
067 * @see AppletContext#getApplet(String)
068 */
069 public Applet getApplet(String name) {
070 return appletFrom(statusDisplay);
071 }
072
073 /**
074 * Returns an enumeration containing the {@code Applet} returned by <code>{@link #getApplet(String)}</code>. If
075 * <code>{@link #getApplet(String)}</code> returns <code>null</code>, this method will return an empty enumeration.
076 * @return an enumeration containing the {@code Applet} in this context's {@link StatusDisplay} (if any.)
077 * @see #getApplet(String)
078 * @see AppletContext#getApplets()
079 */
080 public Enumeration<Applet> getApplets() {
081 Applet applet = appletFrom(statusDisplay);
082 if (applet == null) return NO_APPLETS;
083 return enumeration(list(applet));
084 }
085
086 private static Applet appletFrom(StatusDisplay statusDisplay) {
087 if (!(statusDisplay instanceof AppletViewer)) return null;
088 AppletViewer viewer = (AppletViewer)statusDisplay;
089 return viewer.applet();
090 }
091
092 /**
093 * Not implemented. Returns <code>null</code>.
094 * @see AppletContext#getAudioClip(URL)
095 */
096 public AudioClip getAudioClip(URL url) { return null; }
097
098 /**
099 * Not implemented. Returns <code>null</code>.
100 * @see AppletContext#getImage(URL)
101 */
102 public Image getImage(URL url) { return null; }
103
104 /**
105 * Returns the stream to which specified key is associated within this applet context. Returns <code>null</code> if
106 * the applet context contains no stream for this key.
107 * @return the stream to which this applet context maps the key.
108 * @param key key whose associated stream is to be returned.
109 */
110 public InputStream getStream(String key) {
111 return streamMap.get(key);
112 }
113
114 /**
115 * Finds all the keys of the streams in this applet context.
116 * @return an iterator of all the names of the streams in this applet context.
117 */
118 public Iterator<String> getStreamKeys() {
119 return streamMap.keySet().iterator();
120 }
121
122 /**
123 * Associates the specified stream with the specified key in this applet context.
124 * @param key key with which the specified value is to be associated.
125 * @param stream stream to be associated with the specified key. If this parameter is <code>null</code>, the specified
126 * key is removed in this applet context.
127 */
128 public void setStream(String key, InputStream stream) {
129 if (stream == null) {
130 streamMap.remove(key);
131 return;
132 }
133 streamMap.put(key, stream);
134 }
135
136 /**
137 * Not implemented.
138 * @see AppletContext#showDocument(URL)
139 */
140 public void showDocument(URL url) {}
141
142 /**
143 * Not implemented.
144 * @see AppletContext#showDocument(URL, String)
145 */
146 public void showDocument(URL url, String target) {}
147
148 /**
149 * Requests that the given status be displayed in this context's <code>{@link StatusDisplay}</code>.
150 * @param status a message to display.
151 */
152 public void showStatus(String status) {
153 statusDisplay.showStatus(status);
154 }
155 }