blob: e568fb29740e7c1551a9fbcc4c0851c1c2098f4e [file] [log] [blame]
// Copyright May 20, 2006 The Apache Software Foundation
//
// 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 org.apache.tapestry.event;
import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.hivemind.util.Defense;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.json.JSONArray;
import java.text.ParseException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* Represents a client side generated browser event.
*/
public class BrowserEvent
{
public static final String NAME="beventname";
public static final String TYPE="beventtype";
public static final String KEYS="beventkeys";
public static final String CHAR_CODE="beventcharCode";
public static final String PAGE_X="beventpageX";
public static final String PAGE_Y="beventpageY";
public static final String LAYER_X="beventlayerX";
public static final String LAYER_Y="beventlayerY";
public static final String TARGET="beventtarget";
public static final String TARGET_ATTR_ID="id";
public static final String COMPONENT_ID = "bcomponentid";
public static final String METHOD_ARGUMENTS="methodArguments";
private String _name;
private String _type;
private String[] _keys;
private String _charCode;
private String _pageX;
private String _pageY;
private String _layerX;
private String _layerY;
private EventTarget _target;
private String _componentId;
private String _methodArguments;
private JSONArray _methodArgumentsArray;
/**
* Creates a new browser event that will extract its own
* parameters.
*
* @param cycle
* The request cycle to extract parameters from.
*/
public BrowserEvent(IRequestCycle cycle)
{
Defense.notNull(cycle, "cycle");
_name = cycle.getParameter(NAME);
_type = cycle.getParameter(TYPE);
_keys = cycle.getParameters(KEYS);
_charCode = cycle.getParameter(CHAR_CODE);
_pageX = cycle.getParameter(PAGE_X);
_pageY = cycle.getParameter(PAGE_Y);
_layerX = cycle.getParameter(LAYER_X);
_layerY = cycle.getParameter(LAYER_Y);
_componentId = cycle.getParameter(COMPONENT_ID);
Map props = new HashMap();
_target = new EventTarget(props);
String targetId = cycle.getParameter(TARGET + "." + TARGET_ATTR_ID);
if (targetId != null)
{
props.put(TARGET_ATTR_ID, targetId);
}
_methodArguments = cycle.getParameter(METHOD_ARGUMENTS);
}
/**
* Creates a new browser event with the specified
* name/target properties.
*
* @param name The name of the event, ie "onClick", "onBlur", etc..
* @param target The target of the client side event.
*/
public BrowserEvent(String name, EventTarget target)
{
this(name, null, target);
}
/**
* Creates a new browser event with the specified
* name/target properties.
*
* @param name The name of the event, ie "onClick", "onBlur", etc..
* @param componentId Component targeted.
* @param target The target of the client side event.
*/
public BrowserEvent(String name, String componentId, EventTarget target)
{
_name = name;
_target = target;
_componentId = componentId;
}
/**
* The name of the event that was generated.
*
* <p>
* Examples would be <code>onClick,onSelect,onLoad,etc...</code>.
* </p>
* @return The event name.
*/
public String getName()
{
return _name;
}
/**
* Returns the target of the client side event.
*
* @return The target representation of the client side object event originally bound for.
*/
public EventTarget getTarget()
{
return _target;
}
/**
* Only when the event targeted a {@link org.apache.tapestry.IComponent} - will return the originating
* components id as returned from {@link org.apache.tapestry.IComponent#getId()}. <em>Not</em> present
* on element events.
*
* @return The originating component id that generated the event.
*/
public String getComponentId()
{
return _componentId;
}
/**
* @return the charCode
*/
public String getCharCode()
{
return _charCode;
}
/**
* @return the keys
*/
public String[] getKeys()
{
return _keys;
}
/**
* @return the layerX
*/
public String getLayerX()
{
return _layerX;
}
/**
* @return the layerY
*/
public String getLayerY()
{
return _layerY;
}
/**
* @return the pageX
*/
public String getPageX()
{
return _pageX;
}
/**
* @return the pageY
*/
public String getPageY()
{
return _pageY;
}
/**
* @return the type
*/
public String getType()
{
return _type;
}
/**
* @return the method arguments of an intercepted method-call, if any. If none
* are available, return an empty JSONArray, never null.
*
* @throws ApplicationRuntimeException when the JSON-String could not be
* parsed.
*/
public JSONArray getMethodArguments()
{
if ( _methodArgumentsArray == null)
{
try
{
_methodArgumentsArray = _methodArguments != null
? new JSONArray( _methodArguments )
: new JSONArray();
}
catch (ParseException ex)
{
throw new ApplicationRuntimeException(ex);
}
}
return _methodArgumentsArray;
}
/**
* Utility method to check if the current request contains
* a browser event.
*
* @param cycle
* The associated request.
* @return True if the request contains browser event data.
*/
public static boolean hasBrowserEvent(IRequestCycle cycle)
{
Defense.notNull(cycle, "cycle");
return cycle.getParameter(NAME) != null;
}
public String toString()
{
return "BrowserEvent[" +
"_name='" + _name + '\'' +
'\n' +
", _type='" + _type + '\'' +
'\n' +
", _keys=" + (_keys == null ? null : Arrays.asList(_keys)) +
'\n' +
", _charCode='" + _charCode + '\'' +
'\n' +
", _pageX='" + _pageX + '\'' +
'\n' +
", _pageY='" + _pageY + '\'' +
'\n' +
", _layerX='" + _layerX + '\'' +
'\n' +
", _layerY='" + _layerY + '\'' +
'\n' +
", _target=" + _target +
'\n' +
", _methodArguments='" + _methodArguments + '\'' +
'\n' +
", _methodArgumentsArray=" + _methodArgumentsArray +
'\n' +
']';
}
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BrowserEvent event = (BrowserEvent) o;
if (_charCode != null ? !_charCode.equals(event._charCode) : event._charCode != null) return false;
if (!Arrays.equals(_keys, event._keys)) return false;
if (_layerX != null ? !_layerX.equals(event._layerX) : event._layerX != null) return false;
if (_layerY != null ? !_layerY.equals(event._layerY) : event._layerY != null) return false;
if (_methodArguments != null ? !_methodArguments.equals(event._methodArguments) : event._methodArguments != null) return false;
if (_methodArgumentsArray != null ? !_methodArgumentsArray.equals(event._methodArgumentsArray) : event._methodArgumentsArray != null) return false;
if (_name != null ? !_name.equals(event._name) : event._name != null) return false;
if (_pageX != null ? !_pageX.equals(event._pageX) : event._pageX != null) return false;
if (_pageY != null ? !_pageY.equals(event._pageY) : event._pageY != null) return false;
if (_target != null ? !_target.equals(event._target) : event._target != null) return false;
if (_type != null ? !_type.equals(event._type) : event._type != null) return false;
return true;
}
public int hashCode()
{
int result;
result = (_name != null ? _name.hashCode() : 0);
result = 31 * result + (_type != null ? _type.hashCode() : 0);
result = 31 * result + (_keys != null ? Arrays.hashCode(_keys) : 0);
result = 31 * result + (_charCode != null ? _charCode.hashCode() : 0);
result = 31 * result + (_pageX != null ? _pageX.hashCode() : 0);
result = 31 * result + (_pageY != null ? _pageY.hashCode() : 0);
result = 31 * result + (_layerX != null ? _layerX.hashCode() : 0);
result = 31 * result + (_layerY != null ? _layerY.hashCode() : 0);
result = 31 * result + (_target != null ? _target.hashCode() : 0);
result = 31 * result + (_methodArguments != null ? _methodArguments.hashCode() : 0);
result = 31 * result + (_methodArgumentsArray != null ? _methodArgumentsArray.hashCode() : 0);
return result;
}
}