You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2010/05/02 03:44:30 UTC
svn commit: r940149 -
/myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/custom/updateactionlistener/UpdateActionListener.java
Author: lu4242
Date: Sun May 2 01:44:30 2010
New Revision: 940149
URL: http://svn.apache.org/viewvc?rev=940149&view=rev
Log:
TOMAHAWK-1475 NullPointerException in UpdateActionListener caused by getType()
Added:
myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/custom/updateactionlistener/UpdateActionListener.java
Added: myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/custom/updateactionlistener/UpdateActionListener.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/custom/updateactionlistener/UpdateActionListener.java?rev=940149&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/custom/updateactionlistener/UpdateActionListener.java (added)
+++ myfaces/tomahawk/trunk/core12/src/main/java/org/apache/myfaces/custom/updateactionlistener/UpdateActionListener.java Sun May 2 01:44:30 2010
@@ -0,0 +1,196 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.myfaces.custom.updateactionlistener;
+
+import javax.faces.FacesException;
+import javax.faces.component.StateHolder;
+import javax.faces.component.UIComponentBase;
+import javax.faces.component.ValueHolder;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+import javax.faces.el.ValueBinding;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.ActionEvent;
+import javax.faces.event.ActionListener;
+
+/**
+ * Set an arbitrary property on a managed bean when an "action" component is
+ * selected by the user.
+ * <p>
+ * An instance of this listener type can be attached to any UIComponent which
+ * is an ActionSource (eg a link or button). When the associated component
+ * fires its action event, this listener will read the value specified by
+ * attribute "value" and assign it to the property specified by attribute
+ * "property". The value attribute may be a literal value or may be a
+ * value-binding; the property is always expected to be a value-binding.
+ * <p>
+ * An optional Converter may be associated with this listener, and if present
+ * will be invoked to convert the value to the datatype expected by the
+ * target property. When no converter is available, a default one will be
+ * retrieved from the Application object.
+ * <p>
+ * A common use for this listener is to attach it to an HtmlCommandLink
+ * component, storing some constant value into a managed bean property.
+ * After the navigation associated with that link is done, components in
+ * the new view can look at that property to determine which link was
+ * clicked.
+ * <p>
+ * Both the fetching of "value" and the updating of "property" occur in
+ * the invoke-application phase unless "immediate" is set on the ActionSource
+ * component in which case they both occur in the apply-request-values phase.
+ * The update is guaranteed to occur before the invocation of the method
+ * specified by attribute "action" on the ActionSource (because all
+ * actionListeners are executed before the action attribute).
+ * <p>
+ * JSF 1.2 introduces a "setPropertyActionListener" with the same functionality like this.
+ * <p>
+ * @author Manfred Geiler (latest modification by $Author: grantsmith $)
+ * @version $Revision: 472638 $ $Date: 2006-11-08 15:54:13 -0500 (mié, 08 nov 2006) $
+ */
+public class UpdateActionListener
+ implements ActionListener, ValueHolder, StateHolder
+{
+ //private static final Log log = LogFactory.getLog(UpdateActionListener.class);
+
+ private ValueBinding _propertyBinding;
+ private Object _value;
+ private ValueBinding _valueBinding;
+ private Converter _converter;
+
+ public void setPropertyBinding(ValueBinding propertyBinding)
+ {
+ _propertyBinding = propertyBinding;
+ }
+
+ public ValueBinding getPropertyBinding()
+ {
+ return _propertyBinding;
+ }
+
+ public void setValue(Object value)
+ {
+ _value = value;
+ }
+
+ public Object getValue()
+ {
+ if (_value != null) return _value;
+ ValueBinding vb = getValueBinding();
+ if (vb != null)
+ {
+ FacesContext context = FacesContext.getCurrentInstance();
+ return vb.getValue(context);
+ }
+ return null;
+ }
+
+ public Object getLocalValue()
+ {
+ return _value;
+ }
+
+ public ValueBinding getValueBinding()
+ {
+ return _valueBinding;
+ }
+
+ public void setValueBinding(ValueBinding valueBinding)
+ {
+ _valueBinding = valueBinding;
+ }
+
+ public Converter getConverter()
+ {
+ return _converter;
+ }
+
+ public void setConverter(Converter converter)
+ {
+ _converter = converter;
+ }
+
+ public void processAction(ActionEvent actionEvent) throws AbortProcessingException
+ {
+ FacesContext context = FacesContext.getCurrentInstance();
+ ValueBinding updateBinding = getPropertyBinding();
+ Object v = getValue();
+ if (v != null &&
+ v instanceof String)
+ {
+ Class type = updateBinding.getType(context);
+ type = (type != null) ? type : v.getClass();
+ if (!type.equals(String.class) && ! type.equals(Object.class))
+ {
+ String converterErrorMessage = "No Converter registered with UpdateActionListener and no appropriate standard converter found. Needed to convert String to " + type.getName();
+ Converter converter = getConverter();
+ if (converter == null)
+ {
+ try
+ {
+ converter = context.getApplication().createConverter(type);
+ }
+ catch (Exception e)
+ {
+ throw new FacesException(converterErrorMessage, e);
+ }
+ }
+ if (null == converter)
+ {
+ throw new FacesException(converterErrorMessage);
+ }
+ v = converter.getAsObject(context, context.getViewRoot(), (String)v);
+ }
+ }
+ updateBinding.setValue(context, v);
+ }
+
+
+
+ // StateHolder methods
+
+ public Object saveState(FacesContext context)
+ {
+ Object values[] = new Object[4];
+ values[0] = UIComponentBase.saveAttachedState(context, _propertyBinding);
+ values[1] = _value;
+ values[2] = UIComponentBase.saveAttachedState(context, _valueBinding);
+ values[3] = UIComponentBase.saveAttachedState(context, _converter);
+ return ((Object) (values));
+ }
+
+ public void restoreState(FacesContext context, Object state)
+ {
+ Object values[] = (Object[])state;
+ _propertyBinding = (ValueBinding)UIComponentBase.restoreAttachedState(context, values[0]);
+ _value = values[1];
+ _valueBinding = (ValueBinding)UIComponentBase.restoreAttachedState(context, values[2]);;
+ _converter = (Converter)UIComponentBase.restoreAttachedState(context, values[3]);;
+ }
+
+ public boolean isTransient()
+ {
+ return false;
+ }
+
+ public void setTransient(boolean newTransientValue)
+ {
+ if (newTransientValue == true) throw new IllegalArgumentException();
+ }
+
+}