001: /* *************************************************************************
002:
003: Millstone(TM)
004: Open Sourced User Interface Library for
005: Internet Development with Java
006:
007: Millstone is a registered trademark of IT Mill Ltd
008: Copyright (C) 2000-2005 IT Mill Ltd
009:
010: *************************************************************************
011:
012: This library is free software; you can redistribute it and/or
013: modify it under the terms of the GNU Lesser General Public
014: license version 2.1 as published by the Free Software Foundation.
015:
016: This library is distributed in the hope that it will be useful,
017: but WITHOUT ANY WARRANTY; without even the implied warranty of
018: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: Lesser General Public License for more details.
020:
021: You should have received a copy of the GNU Lesser General Public
022: License along with this library; if not, write to the Free Software
023: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024:
025: *************************************************************************
026:
027: For more information, contact:
028:
029: IT Mill Ltd phone: +358 2 4802 7180
030: Ruukinkatu 2-4 fax: +358 2 4802 7181
031: 20540, Turku email: info@itmill.com
032: Finland company www: www.itmill.com
033:
034: Primary source for MillStone information and releases: www.millstone.org
035:
036: ********************************************************************** */
037:
038: package org.millstone.examples.features;
039:
040: import java.net.MalformedURLException;
041: import java.net.URL;
042:
043: import org.millstone.base.terminal.ExternalResource;
044: import org.millstone.base.ui.*;
045:
046: public class FeatureServerEvents extends Feature {
047:
048: protected String getTitle() {
049: return "Server Events";
050: }
051:
052: protected Component getDemoComponent() {
053: OrderedLayout l = new OrderedLayout();
054:
055: l
056: .addComponent(new Label(
057: "<h3>Multiplayer GO-Game</h3><p>For demonstration, see GO-Game example application. The application implements a "
058: + "multi-player board game, where the moved by one player are immediately reflected to "
059: + "another player.</p>"
060: + "<p>Updating another players screen is totally automatic, and the programmed "
061: + "does not need to be avare when the refresh requests are sent to screen by the server. In "
062: + "web adapter the requests are passed through open HTTP-connection as java-script fragments "
063: + "that update the windows that need repainting.</p>",
064: Label.CONTENT_UIDL));
065:
066: URL goUrl = null;
067: try {
068: goUrl = new URL(getApplication().getURL(), "../go/");
069: } catch (MalformedURLException e) {
070: }
071:
072: if (goUrl != null) {
073: Link link = new Link("Start GO-Game", new ExternalResource(
074: goUrl));
075: link.setTargetName("gogame");
076: link.setTargetBorder(Link.TARGET_BORDER_NONE);
077: l.addComponent(link);
078: }
079:
080: l
081: .addComponent(new Label(
082: "<h3>Chat example</h3><p>For some purposes it might be better to create your own "
083: + "stream. The easiest way of creating a continuous stream for "
084: + "simple purposes is to use StreamResource-class. See chat "
085: + "example below, how this technique can be used for creation "
086: + "of simple chat program.</p>",
087: Label.CONTENT_UIDL));
088:
089: URL chatUrl = null;
090: try {
091: chatUrl = new URL(getApplication().getURL(), "../chat/");
092: } catch (MalformedURLException e) {
093: }
094:
095: if (goUrl != null) {
096: Link link = new Link("Start chat", new ExternalResource(
097: chatUrl));
098: link.setTargetName("chat");
099: link.setTargetBorder(Link.TARGET_BORDER_NONE);
100: l.addComponent(link);
101: }
102:
103: return l;
104: }
105:
106: protected String getDescriptionXHTML() {
107: return "<p>Millstone component framework supports both transactional and "
108: + "continuous terminals. This means that either the events from the "
109: + "terminal are sent together as transactions or the events are "
110: + "passed immediately when the user initiates them through the user "
111: + "interface. </p>"
112: + "<p>WebAdapter converts the Millstone applications to web-environment "
113: + "by transferring the events as HTTP-parameters and drawing the "
114: + "pages after the components have received and handled the events. "
115: + "In the web-environment the web browser is always the active party that "
116: + "starts the transaction. This is problematic when the server should "
117: + "notify the user about changes without HTTP-request initiated by the "
118: + "user.</p>"
119: + "<h3>WebAdapter Solution</h3>"
120: + "<p>Millstone solves the problem by combining component frameworks "
121: + "ability to automatically notify terminal adapter about all visual "
122: + "changes to HTTP-protocols ability to handle very long and slow "
123: + "page downloads. WebAdapter provides the web browser with "
124: + "possibility to keep special server command stream open all the time. "
125: + "All the visual updates that happen in components causes the "
126: + "WebAdapter to automatically creates JavaScript that updates the "
127: + "corresponding web browser window and to send the script immediately "
128: + "to browser for execution.</p>"
129: + "<p>The mechanism is fairly complicated, but using the mechanism in "
130: + "any Millstone application is trivial. Application just needs "
131: + "to make sure that WebBrowser opens a hidden iframe to location: "
132: + "<code>?SERVER_COMMANDS=1</code>.</p>"
133: + "<p>See the example of the usage on Demo-tab to get better understanding "
134: + "of the mechanism. If you read the example's source code, you will notice that "
135: + "the program does not contain any support for sending events to client, as "
136: + "it is completely automatic.</p>";
137: }
138:
139: protected String getImage() {
140: return "serverevents.jpg";
141: }
142:
143: }
|