You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ba...@apache.org on 2007/05/25 02:49:04 UTC
svn commit: r541495 - in /myfaces/core/branches/jsf12:
api/src/main/java-templates/javax/faces/component/
api/src/test/java/javax/faces/component/
api/src/test/java/javax/faces/validator/
impl/src/main/java/org/apache/myfaces/config/
Author: baranda
Date: Thu May 24 17:49:02 2007
New Revision: 541495
URL: http://svn.apache.org/viewvc?view=rev&rev=541495
Log:
Fixes MYFAECS-1645 (UIViewRoot.getLocale is not implemented according to the spec)
Modified:
myfaces/core/branches/jsf12/api/src/main/java-templates/javax/faces/component/UIDataTemplate.java (props changed)
myfaces/core/branches/jsf12/api/src/main/java-templates/javax/faces/component/UIViewRootTemplate.java
myfaces/core/branches/jsf12/api/src/test/java/javax/faces/component/UIViewRootTest.java
myfaces/core/branches/jsf12/api/src/test/java/javax/faces/validator/_MessageUtilsTest.java
myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java
Propchange: myfaces/core/branches/jsf12/api/src/main/java-templates/javax/faces/component/UIDataTemplate.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: myfaces/core/branches/jsf12/api/src/main/java-templates/javax/faces/component/UIViewRootTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/jsf12/api/src/main/java-templates/javax/faces/component/UIViewRootTemplate.java?view=diff&rev=541495&r1=541494&r2=541495
==============================================================================
--- myfaces/core/branches/jsf12/api/src/main/java-templates/javax/faces/component/UIViewRootTemplate.java (original)
+++ myfaces/core/branches/jsf12/api/src/main/java-templates/javax/faces/component/UIViewRootTemplate.java Thu May 24 17:49:02 2007
@@ -15,24 +15,16 @@
*/
package javax.faces.component;
+import javax.el.MethodExpression;
+import javax.el.ValueExpression;
import javax.faces.FactoryFinder;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
-import javax.faces.event.AbortProcessingException;
-import javax.faces.event.FacesEvent;
-import javax.faces.event.PhaseEvent;
-import javax.faces.event.PhaseId;
-import javax.faces.event.PhaseListener;
+import javax.faces.event.*;
import javax.faces.lifecycle.Lifecycle;
import javax.faces.lifecycle.LifecycleFactory;
import javax.faces.webapp.FacesServlet;
-import javax.el.MethodExpression;
-import javax.el.ValueExpression;
-import java.util.ArrayList;
-import java.util.ConcurrentModificationException;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Locale;
+import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -46,19 +38,25 @@
{
private static final int ANY_PHASE_ORDINAL = PhaseId.ANY_PHASE.getOrdinal();
public static final String UNIQUE_ID_PREFIX = "j_id";
-
+
private final Logger logger = Logger.getLogger(UIViewRootTemplate.class.getName());
// todo: is it right to save the state of _events and _phaseListeners?
- /**/ // removes the generated methods so only state saving stays
- /**/// getEvents
- /**/// setEvents
- /**/// getUniqueIdCounter
- /**/// setUniqueIdCounter
- /**/// getPhaseListeners
- /**/private List<FacesEvent> _events = null;
- /**/private long _uniqueIdCounter = 0;
-
+ /**/ // removes the generated methods so only state saving stays
+ /**/// getEvents
+ /**/// setEvents
+ /**/// getUniqueIdCounter
+ /**/// setUniqueIdCounter
+ /**/// getPhaseListeners
+ /**/// getLocale
+ /**/ private List<FacesEvent> _events = null;
+ /**/ private long _uniqueIdCounter = 0;
+ /**/ private Locale _locale;
+ /**/ private Collection<PhaseListener> _phaseListeners;
+ /**/ private MethodExpression getBeforePhaseListener() { return null; }
+ /**/ private MethodExpression getAfterPhaseListener() { return null; }
+ /**/ public String getFamily() { return null; }
+
private transient Lifecycle _lifecycle = null;
public void queueEvent(FacesEvent event)
@@ -75,7 +73,7 @@
public void processDecodes(final FacesContext context)
{
checkNull(context, "context");
- process(context, PhaseId.APPLY_REQUEST_VALUES, new Processor()
+ process(context, PhaseId.APPLY_REQUEST_VALUES, new Processor()
{
public void process()
{
@@ -87,7 +85,7 @@
public void processValidators(final FacesContext context)
{
checkNull(context, "context");
- process(context, PhaseId.PROCESS_VALIDATIONS, new Processor()
+ process(context, PhaseId.PROCESS_VALIDATIONS, new Processor()
{
public void process()
{
@@ -99,7 +97,7 @@
public void processUpdates(final FacesContext context)
{
checkNull(context, "context");
- process(context, PhaseId.UPDATE_MODEL_VALUES, new Processor()
+ process(context, PhaseId.UPDATE_MODEL_VALUES, new Processor()
{
public void process()
{
@@ -118,10 +116,10 @@
throws java.io.IOException
{
checkNull(context, "context");
-
+
boolean skipPhase = false;
- try
+ try
{
skipPhase = notifyListeners(context, PhaseId.RENDER_RESPONSE, getBeforePhaseListener(), true);
}
@@ -130,21 +128,21 @@
// following the spec we have to swallow the exception
logger.log(Level.SEVERE, "Exception while processing phase listener: " + e.getMessage(), e);
}
-
+
if(!skipPhase)
{
super.encodeBegin(context);
}
}
-
+
public void encodeEnd(FacesContext context) throws java.io.IOException
{
checkNull(context, "context");
- super.encodeEnd(context);
+ super.encodeEnd(context);
try
{
notifyListeners(context, PhaseId.RENDER_RESPONSE, getAfterPhaseListener(), false);
- }
+ }
catch (Exception e)
{
// following the spec we have to swallow the exception
@@ -160,15 +158,48 @@
ExternalContext extCtx = FacesContext.getCurrentInstance().getExternalContext();
return extCtx.encodeNamespace(UNIQUE_ID_PREFIX + _uniqueIdCounter++);
}
-
- private boolean process(FacesContext context, PhaseId phaseId, Processor processor, boolean broadcast)
- {
- if(!notifyListeners(context, phaseId, getBeforePhaseListener(), true))
+
+ /**
+ * Gets The locale for this ViewRoot.
+ *
+ * @return the new locale value
+ */
+ public Locale getLocale()
+ {
+ if (_locale != null)
{
- if(processor != null)
+ return _locale;
+ }
+ ValueExpression expression = getValueExpression("locale");
+ if (expression != null)
+ {
+ return (Locale) expression.getValue(getFacesContext().getELContext());
+ }
+ else
+ {
+ Object locale = getFacesContext().getApplication().getViewHandler().calculateLocale(getFacesContext());
+
+ if (locale instanceof Locale)
+ {
+ return (Locale) locale;
+ }
+ else if (locale instanceof String)
+ {
+ return stringToLocale((String)locale);
+ }
+ }
+
+ return getFacesContext().getApplication().getViewHandler().calculateLocale(getFacesContext());
+ }
+
+ private boolean process(FacesContext context, PhaseId phaseId, Processor processor, boolean broadcast)
+ {
+ if (!notifyListeners(context, phaseId, getBeforePhaseListener(), true))
+ {
+ if (processor != null)
processor.process();
-
- if(broadcast)
+
+ if (broadcast)
{
_broadcastForPhase(phaseId);
if (context.getRenderResponse() || context.getResponseComplete())
@@ -179,29 +210,29 @@
}
return notifyListeners(context, phaseId, getAfterPhaseListener(), false);
}
-
+
private boolean notifyListeners(FacesContext context, PhaseId phaseId, MethodExpression listener, boolean beforePhase)
{
boolean skipPhase = false;
-
- if(listener != null || (_phaseListeners != null && !_phaseListeners.isEmpty()))
+
+ if (listener != null || (_phaseListeners != null && !_phaseListeners.isEmpty()))
{
PhaseEvent event = createEvent(context, phaseId);
-
- if(listener != null)
+
+ if (listener != null)
{
- listener.invoke(context.getELContext(), new Object[] { event });
+ listener.invoke(context.getELContext(), new Object[]{event});
skipPhase = context.getResponseComplete() || context.getRenderResponse();
}
-
- if(_phaseListeners != null && !_phaseListeners.isEmpty())
+
+ if (_phaseListeners != null && !_phaseListeners.isEmpty())
{
- for(PhaseListener phaseListener : _phaseListeners)
+ for (PhaseListener phaseListener : _phaseListeners)
{
PhaseId listenerPhaseId = phaseListener.getPhaseId();
- if(phaseId.equals(listenerPhaseId) || PhaseId.ANY_PHASE.equals(listenerPhaseId))
+ if (phaseId.equals(listenerPhaseId) || PhaseId.ANY_PHASE.equals(listenerPhaseId))
{
- if(beforePhase)
+ if (beforePhase)
{
phaseListener.beforePhase(event);
}
@@ -214,24 +245,25 @@
}
}
}
-
+
return skipPhase;
}
-
+
private PhaseEvent createEvent(FacesContext context, PhaseId phaseId)
{
if (_lifecycle == null)
{
- LifecycleFactory factory = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
+ LifecycleFactory factory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
String id = context.getExternalContext().getInitParameter(FacesServlet.LIFECYCLE_ID_ATTR);
- if(id == null) {
+ if (id == null)
+ {
id = LifecycleFactory.DEFAULT_LIFECYCLE;
}
_lifecycle = factory.getLifecycle(id);
}
return new PhaseEvent(context, phaseId, _lifecycle);
}
-
+
private void _broadcastForPhase(PhaseId phaseId)
{
if (_events == null)
@@ -261,7 +293,7 @@
// that no further broadcast of this event, or any further events, should take place."
abort = true;
break;
- }
+ }
finally
{
try
@@ -290,10 +322,10 @@
{
_events = null;
}
-
+
private void checkNull(Object value, String valueLabel)
{
- if(value == null)
+ if (value == null)
{
throw new NullPointerException(valueLabel + " is null");
}
@@ -302,6 +334,31 @@
private interface Processor
{
void process();
+ }
+
+ private Locale stringToLocale(String localeStr)
+ {
+ // locale expr: \[a-z]{2}((-|_)[A-Z]{2})?
+
+ if (localeStr.contains("_") || localeStr.contains("-"))
+ {
+ if (localeStr.length() == 2)
+ {
+ // localeStr is the lang
+ return new Locale(localeStr);
+ }
+ }
+ else
+ {
+ if (localeStr.length() == 5)
+ {
+ String lang = localeStr.substring(0,1);
+ String country = localeStr.substring(3,4);
+ return new Locale(lang,country);
+ }
+ }
+
+ return Locale.getDefault();
}
}
Modified: myfaces/core/branches/jsf12/api/src/test/java/javax/faces/component/UIViewRootTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/jsf12/api/src/test/java/javax/faces/component/UIViewRootTest.java?view=diff&rev=541495&r1=541494&r2=541495
==============================================================================
--- myfaces/core/branches/jsf12/api/src/test/java/javax/faces/component/UIViewRootTest.java (original)
+++ myfaces/core/branches/jsf12/api/src/test/java/javax/faces/component/UIViewRootTest.java Thu May 24 17:49:02 2007
@@ -18,39 +18,29 @@
*/
package javax.faces.component;
+import org.apache.myfaces.TestRunner;
+import org.apache.shale.test.mock.MockFacesContext12;
import static org.easymock.EasyMock.*;
+import org.easymock.IAnswer;
+import org.easymock.classextension.EasyMock;
+import org.easymock.classextension.IMocksControl;
import static org.testng.Assert.*;
-
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Map;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
import javax.el.ELContext;
import javax.el.MethodExpression;
import javax.faces.FactoryFinder;
import javax.faces.application.Application;
+import javax.faces.application.ViewHandler;
import javax.faces.context.ExternalContext;
-import javax.faces.event.AbortProcessingException;
-import javax.faces.event.FacesEvent;
-import javax.faces.event.PhaseEvent;
-import javax.faces.event.PhaseId;
-import javax.faces.event.PhaseListener;
+import javax.faces.event.*;
import javax.faces.lifecycle.Lifecycle;
import javax.faces.lifecycle.LifecycleFactory;
import javax.faces.webapp.FacesServlet;
-
-import org.apache.myfaces.TestRunner;
-import org.apache.shale.test.mock.MockFacesContext12;
-import org.easymock.IAnswer;
-import org.easymock.classextension.EasyMock;
-import org.easymock.classextension.IMocksControl;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import java.lang.reflect.Method;
+import java.util.*;
/**
* @author Mathias Broekelmann (latest modification by $Author$)
@@ -66,6 +56,7 @@
private Application _application;
private Lifecycle _lifecycle;
private LifecycleFactory _lifecycleFactory;
+ private ViewHandler _viewHandler;
private ELContext _elContext;
private static ThreadLocal<LifecycleFactory> LIFECYCLEFACTORY = new ThreadLocal<LifecycleFactory>();
@@ -88,6 +79,7 @@
_testimpl = new UIViewRoot();
_lifecycle = _mocksControl.createMock(Lifecycle.class);
_elContext = _mocksControl.createMock(ELContext.class);
+ _viewHandler = _mocksControl.createMock(ViewHandler.class);
_facesContext.setELContext(_elContext);
LIFECYCLEFACTORY.set(_lifecycleFactory);
@@ -115,7 +107,11 @@
@Test
public void testLocale() throws Exception
{
+ expect(_application.getViewHandler()).andReturn(_viewHandler).anyTimes();
+ expect(_viewHandler.calculateLocale(_facesContext)).andReturn(null).anyTimes();
_mocksControl.replay();
+
+ _facesContext.setApplication(_application);
assertNull(_testimpl.getLocale());
_testimpl.setLocale(Locale.JAPANESE);
assertEquals(Locale.JAPANESE, _testimpl.getLocale());
Modified: myfaces/core/branches/jsf12/api/src/test/java/javax/faces/validator/_MessageUtilsTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/jsf12/api/src/test/java/javax/faces/validator/_MessageUtilsTest.java?view=diff&rev=541495&r1=541494&r2=541495
==============================================================================
--- myfaces/core/branches/jsf12/api/src/test/java/javax/faces/validator/_MessageUtilsTest.java (original)
+++ myfaces/core/branches/jsf12/api/src/test/java/javax/faces/validator/_MessageUtilsTest.java Thu May 24 17:49:02 2007
@@ -18,16 +18,17 @@
*/
package javax.faces.validator;
+import org.apache.shale.test.mock.MockFacesContext12;
import static org.easymock.EasyMock.expect;
+import org.easymock.classextension.EasyMock;
+import org.easymock.classextension.IMocksControl;
import static org.testng.Assert.assertEquals;
+import org.testng.annotations.Test;
import javax.faces.application.Application;
+import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
-
-import org.apache.shale.test.mock.MockFacesContext12;
-import org.easymock.classextension.EasyMock;
-import org.easymock.classextension.IMocksControl;
-import org.testng.annotations.Test;
+import java.util.Locale;
/**
* @author Mathias Broekelmann (latest modification by $Author$)
@@ -47,9 +48,12 @@
MockFacesContext12 facesContext = new MockFacesContext12();
IMocksControl mocksControl = EasyMock.createControl();
Application application = mocksControl.createMock(Application.class);
+ ViewHandler viewHandler = mocksControl.createMock(ViewHandler.class);
facesContext.setApplication(application);
facesContext.setViewRoot(root);
+ expect(application.getViewHandler()).andReturn(viewHandler);
+ expect(viewHandler.calculateLocale(facesContext)).andReturn(Locale.ENGLISH);
expect(application.getMessageBundle()).andReturn("javax.faces.Messages");
mocksControl.replay();
Modified: myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java?view=diff&rev=541495&r1=541494&r2=541495
==============================================================================
--- myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java (original)
+++ myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java Thu May 24 17:49:02 2007
@@ -39,17 +39,12 @@
import org.apache.myfaces.shared_impl.util.StateUtils;
import org.apache.myfaces.shared_impl.util.serial.DefaultSerialFactory;
import org.apache.myfaces.shared_impl.util.serial.SerialFactory;
-
import org.xml.sax.SAXException;
import javax.el.ELResolver;
import javax.faces.FacesException;
import javax.faces.FactoryFinder;
-import javax.faces.application.Application;
-import javax.faces.application.ApplicationFactory;
-import javax.faces.application.NavigationHandler;
-import javax.faces.application.StateManager;
-import javax.faces.application.ViewHandler;
+import javax.faces.application.*;
import javax.faces.context.ExternalContext;
import javax.faces.el.PropertyResolver;
import javax.faces.el.VariableResolver;
@@ -60,23 +55,12 @@
import javax.faces.render.RenderKit;
import javax.faces.render.RenderKitFactory;
import javax.faces.webapp.FacesServlet;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
+import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.StringTokenizer;
+import java.util.*;
/**
* Configures everything for a given context. The FacesConfigurator is independent of the concrete implementations that
@@ -785,6 +769,7 @@
continue;
}
+ System.out.println("ADd renderer: "+element.getComponentFamily()+", "+element.getRendererType());
renderKit.addRenderer(element.getComponentFamily(), element.getRendererType(), renderer);
}