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);
             }