001: /*
002: * Copyright 2005 Joe Walker
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.directwebremoting.event;
017:
018: import java.util.EventObject;
019:
020: import org.directwebremoting.Hub;
021: import org.directwebremoting.extend.ConverterManager;
022: import org.directwebremoting.extend.InboundContext;
023: import org.directwebremoting.extend.InboundVariable;
024: import org.directwebremoting.extend.MarshallException;
025: import org.directwebremoting.extend.TypeHintContext;
026: import org.directwebremoting.io.RawData;
027:
028: /**
029: * An MessageEvent is fired to a set of {@link MessageListener}s by the DWR
030: * {@link Hub}.
031: * @author Joe Walker [joe at getahead dot ltd dot uk]
032: */
033: public class MessageEvent extends EventObject {
034: /**
035: * Constructor for use with server-side originated messages
036: * @param hub The hub used to send the data
037: * @param data The data to publish
038: */
039: public MessageEvent(Hub hub, Object data) {
040: super (hub);
041:
042: this .hub = hub;
043: this .data = data;
044:
045: source = Source.SERVER;
046: }
047:
048: /**
049: * Constructor for use with client-side originated messages
050: * @param hub The hub used to send the data
051: * @param converterManager
052: * @param rawData
053: */
054: public MessageEvent(Hub hub, ConverterManager converterManager,
055: RawData rawData) {
056: super (hub);
057:
058: this .hub = hub;
059: this .converterManager = converterManager;
060: this .rawData = rawData;
061:
062: source = Source.INTERNET;
063: }
064:
065: /**
066: * @see EventObject#getSource()
067: * @return the hub that processed this message
068: */
069: public Hub getHub() {
070: return hub;
071: }
072:
073: /**
074: * We convert the data (if the message is from the client) as late as
075: * possible so the message recipient can choose what type it should be.
076: * @param <T> The type that we are converting to
077: * @param asType The type that we are converting to
078: * @return The data coerced into the required type
079: * @throws MarshallException If the data can not be coerced into required type
080: */
081: @SuppressWarnings("unchecked")
082: public <T> T getData(Class<T> asType) throws MarshallException {
083: if (source == Source.SERVER) {
084: try {
085: return (T) data;
086: } catch (ClassCastException ex) {
087: throw new MarshallException(asType, ex);
088: }
089: } else {
090: InboundContext context = rawData.getInboundContext();
091: InboundVariable inboundVariable = rawData
092: .getInboundVariable();
093: TypeHintContext typeHintContext = null;//new TypeHintContext(converterManager, null, 0);
094:
095: return (T) converterManager.convertInbound(asType,
096: inboundVariable, context, typeHintContext);
097: }
098: }
099:
100: /**
101: * WARNING: This method is for internal use only. It may well disappear at
102: * some stage in the future
103: * Sometimes we just want to get at whatever the data was originally without
104: * any conversion.
105: * @return The original data probably of type RawData
106: */
107: public Object getRawData() {
108: if (source == Source.SERVER) {
109: return data;
110: } else {
111: return rawData;
112: }
113: }
114:
115: /**
116: * Did the data come from the web or from the server?
117: */
118: private enum Source {
119: SERVER, INTERNET
120: }
121:
122: private Hub hub;
123: private Object data;
124: private RawData rawData;
125: private Source source;
126: private ConverterManager converterManager;
127: }
|