/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.jsf.cfg; import com.caucho.config.program.ConfigProgram; import java.util.*; import java.util.logging.*; import java.lang.reflect.*; import javax.el.*; import javax.faces.*; import javax.faces.application.*; import javax.faces.component.*; import javax.faces.component.html.*; import javax.faces.context.*; import javax.faces.convert.*; import javax.faces.el.*; import javax.faces.event.*; import javax.faces.validator.*; import com.caucho.config.*; import com.caucho.util.*; import com.caucho.jsf.application.ApplicationImpl; public class ApplicationConfig { private static final Logger log = Logger.getLogger(ApplicationConfig.class.getName()); private static final L10N L = new L10N(ApplicationConfig.class); private String _id; private Class _actionListener; private String _defaultRenderKitId; private String _messageBundle; private Class _navigationHandler; private Class _viewHandler; private Class _stateManager; private ArrayList<ELResolver> _elResolverList = new ArrayList<ELResolver>(); private Class _propertyResolver; private Class _variableResolver; private ArrayList<ResourceBundleConfig> _resourceBundleList = new ArrayList<ResourceBundleConfig>(); private LocaleConfig _localeConfig; public void setId(String id) { _id = id; } public void setDefaultRenderKitId(String id) { _defaultRenderKitId = id; } public void setMessageBundle(String messageBundle) { _messageBundle = messageBundle; } public void setActionListener(Class actionListener) throws ConfigException { Config.validate(actionListener, ActionListener.class, ActionListener.class); _actionListener = actionListener; } public void setNavigationHandler(Class navigationHandler) throws ConfigException { if (! NavigationHandler.class.isAssignableFrom(navigationHandler)) throw new ConfigException(L.l("navigation-handler '{0}' must extend javax.faces.application.NavigationHandler.", navigationHandler.getName())); Constructor ctor = null; try { ctor = navigationHandler.getConstructor(new Class[] { NavigationHandler.class }); } catch (Exception e) { log.log(Level.FINEST, e.toString(), e); } try { if (ctor == null) ctor = navigationHandler.getConstructor(new Class[] { }); } catch (Exception e) { log.log(Level.FINEST, e.toString(), e); } if (ctor == null) throw new ConfigException(L.l("navigation-handler '{0}' must have either a zero-arg constructor or a constructor with a single NavigationHandler argument.", navigationHandler.getName())); _navigationHandler = navigationHandler; } public void setViewHandler(Class viewHandler) throws ConfigException { if (! ViewHandler.class.isAssignableFrom(viewHandler)) throw new ConfigException(L.l("view-handler '{0}' must extend javax.faces.application.ViewHandler.", viewHandler.getName())); Constructor ctor = null; try { ctor = viewHandler.getConstructor(new Class[] { ViewHandler.class }); } catch (Exception e) { log.log(Level.FINEST, e.toString(), e); } try { if (ctor == null) ctor = viewHandler.getConstructor(new Class[] { }); } catch (Exception e) { log.log(Level.FINEST, e.toString(), e); } if (ctor == null) throw new ConfigException(L.l("view-handler '{0}' must have either a zero-arg constructor or a constructor with a single ViewHandler argument.", viewHandler.getName())); _viewHandler = viewHandler; } public void setResourceHandler(Class resourceHandler) throws ConfigException { } public void setStateManager(Class stateManager) throws ConfigException { if (! StateManager.class.isAssignableFrom(stateManager)) throw new ConfigException(L.l("state-manager '{0}' must extend javax.faces.application.StateManager.", stateManager.getName())); Constructor ctor = null; try { ctor = stateManager.getConstructor(new Class[] { StateManager.class }); } catch (Exception e) { log.log(Level.FINEST, e.toString(), e); } try { if (ctor == null) ctor = stateManager.getConstructor(new Class[] { }); } catch (Exception e) { log.log(Level.FINEST, e.toString(), e); } if (ctor == null) throw new ConfigException(L.l("state-manager '{0}' must have either a zero-arg constructor or a constructor with a single StateManager argument.", stateManager.getName())); _stateManager = stateManager; } public Class getStateManager() { return _stateManager; } public void setElResolver(Class elResolver) throws ConfigException { Config.validate(elResolver, ELResolver.class); try { _elResolverList.add((ELResolver) elResolver.newInstance()); } catch (Exception e) { throw ConfigException.create(e); } } public Class getElResolver() { return null; } public ArrayList<ELResolver> getElResolverList() { return _elResolverList; } public void setPropertyResolver(Class propertyResolver) throws ConfigException { Config.validate(propertyResolver, PropertyResolver.class, PropertyResolver.class); _propertyResolver = propertyResolver; } public Class getPropertyResolver() { return _propertyResolver; } public void setVariableResolver(Class variableResolver) throws ConfigException { Config.validate(variableResolver, VariableResolver.class, VariableResolver.class); _variableResolver = variableResolver; } public Class getVariableResolver() { return _variableResolver; } public void setResourceBundle(ResourceBundleConfig bundle) throws ConfigException { _resourceBundleList.add(bundle); } private ResourceBundleConfig getResourceBundle() throws ConfigException { return null; } public ArrayList<ResourceBundleConfig> getResourceBundleList() { return _resourceBundleList; } public void setApplicationExtension(ConfigProgram program) { } public void setLocaleConfig(LocaleConfig config) { _localeConfig = config; } public void configure(ApplicationImpl app) { if (_messageBundle != null) app.setMessageBundle(_messageBundle); if (_localeConfig != null) _localeConfig.configure(app); if (_defaultRenderKitId != null) app.setDefaultRenderKitId(_defaultRenderKitId); if (_actionListener != null) { ActionListener listener = null; try { Constructor ctor = _actionListener.getConstructor(new Class [] { ActionListener.class }); ActionListener oldListener = app.getActionListener(); listener = (ActionListener) ctor.newInstance(oldListener); } catch (NoSuchMethodException e) { } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } if (listener == null) { try { listener = (ActionListener) _actionListener.newInstance(); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } } if (listener != null) { app.setActionListener(listener); log.fine(L.l("JSF[] using '{0}' as action-listener", listener)); } } if (_viewHandler != null) { ViewHandler handler = null; try { Constructor ctor = _viewHandler.getConstructor(new Class[] { ViewHandler.class }); ViewHandler oldHandler = app.getViewHandler(); handler = (ViewHandler) ctor.newInstance(oldHandler); } catch (NoSuchMethodException e) { } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } if (handler == null) { try { handler = (ViewHandler) _viewHandler.newInstance(); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } } if (handler != null) { app.setViewHandler(handler); log.fine(L.l("JSF[] using '{0}' as view-handler", handler)); } } if (_navigationHandler != null) { NavigationHandler handler = null; try { Constructor ctor = _navigationHandler.getConstructor(new Class[] { NavigationHandler.class }); NavigationHandler oldHandler = app.getNavigationHandler(); handler = (NavigationHandler) ctor.newInstance(oldHandler); } catch (NoSuchMethodException e) { } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } if (handler == null) { try { handler = (NavigationHandler) _navigationHandler.newInstance(); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } } if (handler != null) { app.setNavigationHandler(handler); log.fine(L.l("JSF[] using '{0}' as navigation-handler", handler)); } } if (_stateManager != null) { StateManager manager = null; try { Constructor ctor = _stateManager.getConstructor(new Class[] { StateManager.class }); StateManager oldHandler = app.getStateManager(); manager = (StateManager) ctor.newInstance(oldHandler); } catch (NoSuchMethodException e) { } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } if (manager == null) { try { manager = (StateManager) _stateManager.newInstance(); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } } if (manager != null) { app.setStateManager(manager); log.fine(L.l("JSF[] using '{0}' as state-manager", manager)); } } for (int i = 0; i < _elResolverList.size(); i++) app.addELResolver(_elResolverList.get(i)); if (_propertyResolver != null) { PropertyResolver propertyResolver = null; try { Constructor ctor = _propertyResolver.getConstructor(PropertyResolver.class); PropertyResolver oldPropertyResolver = app.getLegacyPropertyResolver(); propertyResolver = (PropertyResolver) ctor.newInstance(oldPropertyResolver); } catch (NoSuchMethodException e) { } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } if (propertyResolver == null) { try { propertyResolver = (PropertyResolver) _propertyResolver.newInstance(); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } } if (propertyResolver != null) { app.setPropertyResolver(propertyResolver); log.fine(L.l("JSF[] using '{0}' as property-resolver", propertyResolver)); } } if (_variableResolver != null) { VariableResolver variableResolver = null; try { Constructor ctor = _variableResolver.getConstructor(VariableResolver.class); VariableResolver oldVariableResolver = app.getLegacyVariableResolver(); variableResolver = (VariableResolver) ctor.newInstance(oldVariableResolver); } catch (NoSuchMethodException e) { } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } if (variableResolver == null) { try { variableResolver = (VariableResolver) _variableResolver.newInstance(); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } } if (variableResolver != null) { app.setVariableResolver(variableResolver); log.fine(L.l("JSF[] using '{0}' as variable-resolver", variableResolver)); } } } public static class LocaleConfig { private Locale _defaultLocale; private ArrayList<Locale> _supportedLocales = new ArrayList<Locale>(); public void setId(String id) { } public void setDefaultLocale(String locale) { _defaultLocale = LocaleUtil.createLocale(locale); } public void addSupportedLocale(String locale) { _supportedLocales.add(LocaleUtil.createLocale(locale)); } public void configure(Application app) { if (_defaultLocale != null) { app.setDefaultLocale(_defaultLocale); } app.setSupportedLocales(_supportedLocales); } } }