All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.tiles.extras.complete.CompleteAutoloadTilesContainerFactory Maven / Gradle / Ivy

Go to download

Extras for Tiles, including non-standard, non-generic, non-identifiable components that may be useful for Tiles users.

There is a newer version: 3.0.8
Show newest version
/*
 * $Id: CompleteAutoloadTilesContainerFactory.java 1332136 2012-04-30 09:34:09Z mck $
 *
 * 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.tiles.extras.complete;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.regex.Pattern;

import javax.el.ArrayELResolver;
import javax.el.BeanELResolver;
import javax.el.CompositeELResolver;
import javax.el.ELResolver;
import javax.el.ListELResolver;
import javax.el.MapELResolver;
import javax.el.ResourceBundleELResolver;

import ognl.OgnlException;
import ognl.OgnlRuntime;
import ognl.PropertyAccessor;

import org.apache.tiles.TilesContainer;
import org.apache.tiles.compat.definition.digester.CompatibilityDigesterDefinitionsReader;
import org.apache.tiles.context.TilesRequestContextHolder;
import org.apache.tiles.definition.DefinitionsReader;
import org.apache.tiles.definition.pattern.DefinitionPatternMatcherFactory;
import org.apache.tiles.definition.pattern.PatternDefinitionResolver;
import org.apache.tiles.definition.pattern.PrefixedPatternDefinitionResolver;
import org.apache.tiles.definition.pattern.regexp.RegexpDefinitionPatternMatcherFactory;
import org.apache.tiles.definition.pattern.wildcard.WildcardDefinitionPatternMatcherFactory;
import org.apache.tiles.el.ELAttributeEvaluator;
import org.apache.tiles.el.JspExpressionFactoryFactory;
import org.apache.tiles.el.ScopeELResolver;
import org.apache.tiles.el.TilesContextBeanELResolver;
import org.apache.tiles.el.TilesContextELResolver;
import org.apache.tiles.evaluator.AttributeEvaluatorFactory;
import org.apache.tiles.evaluator.BasicAttributeEvaluatorFactory;
import org.apache.tiles.factory.BasicTilesContainerFactory;
import org.apache.tiles.factory.TilesContainerFactoryException;
import org.apache.tiles.freemarker.TilesSharedVariableFactory;
import org.apache.tiles.impl.mgmt.CachingTilesContainer;
import org.apache.tiles.locale.LocaleResolver;
import org.apache.tiles.mvel.MVELAttributeEvaluator;
import org.apache.tiles.mvel.ScopeVariableResolverFactory;
import org.apache.tiles.mvel.TilesContextBeanVariableResolverFactory;
import org.apache.tiles.mvel.TilesContextVariableResolverFactory;
import org.apache.tiles.ognl.AnyScopePropertyAccessor;
import org.apache.tiles.ognl.DelegatePropertyAccessor;
import org.apache.tiles.ognl.NestedObjectDelegatePropertyAccessor;
import org.apache.tiles.ognl.OGNLAttributeEvaluator;
import org.apache.tiles.ognl.PropertyAccessorDelegateFactory;
import org.apache.tiles.ognl.ScopePropertyAccessor;
import org.apache.tiles.ognl.TilesApplicationContextNestedObjectExtractor;
import org.apache.tiles.ognl.TilesContextPropertyAccessorDelegateFactory;
import org.apache.tiles.request.ApplicationContext;
import org.apache.tiles.request.ApplicationResource;
import org.apache.tiles.request.Request;
import org.apache.tiles.request.freemarker.render.FreemarkerRenderer;
import org.apache.tiles.request.freemarker.render.FreemarkerRendererBuilder;
import org.apache.tiles.request.freemarker.servlet.SharedVariableLoaderFreemarkerServlet;
import org.apache.tiles.request.mustache.MustacheRenderer;
import org.apache.tiles.request.render.BasicRendererFactory;
import org.apache.tiles.request.render.ChainedDelegateRenderer;
import org.apache.tiles.request.render.Renderer;
import org.apache.tiles.request.servlet.ServletUtil;
import org.apache.tiles.request.velocity.render.VelocityRenderer;
import org.apache.tiles.request.velocity.render.VelocityRendererBuilder;
import org.mvel2.integration.VariableResolverFactory;

/**
 * Tiles container factory that:
 * 
    *
  • create supporting objects for Velocity and FreeMarker;
  • *
  • create renderers for Velocity, FreeMarker, and Mustache templates;
  • *
  • allows using EL, MVEL and OGNL as attribute expressions;
  • *
  • allows using Wildcards and Regular Expressions in definition names;
  • *
  • loads Tiles 1.x definition files;
  • *
  • loads all the definition files that have the "tiles*.xml" pattern under * /WEB-INF directory (and subdirectories) and under * META-INF directories (and subdirectories) in every jar.
  • *
* * @version $Rev: 1332136 $ $Date: 2012-04-30 19:34:09 +1000 (Mon, 30 Apr 2012) $ * @since 2.2.0 */ public class CompleteAutoloadTilesContainerFactory extends BasicTilesContainerFactory { /** * The freemarker renderer name. */ private static final String FREEMARKER_RENDERER_NAME = "freemarker"; /** * The velocity renderer name. */ private static final String VELOCITY_RENDERER_NAME = "velocity"; /** * The mustache renderer name. */ private static final String MUSTACHE_RENDERER_NAME = "mustache"; /** {@inheritDoc} */ @Override public TilesContainer createDecoratedContainer(TilesContainer originalContainer, ApplicationContext applicationContext) { return new CachingTilesContainer(originalContainer); } /** {@inheritDoc} */ @Override protected void registerAttributeRenderers( final BasicRendererFactory rendererFactory, final ApplicationContext applicationContext, final TilesContainer container, final AttributeEvaluatorFactory attributeEvaluatorFactory) { super.registerAttributeRenderers(rendererFactory, applicationContext, container, attributeEvaluatorFactory); FreemarkerRenderer freemarkerRenderer = FreemarkerRendererBuilder .createInstance() .setApplicationContext(applicationContext) .setParameter("TemplatePath", "/") .setParameter("NoCache", "true") .setParameter("ContentType", "text/html") .setParameter("template_update_delay", "0") .setParameter("default_encoding", "ISO-8859-1") .setParameter("number_format", "0.##########") .setParameter(SharedVariableLoaderFreemarkerServlet.CUSTOM_SHARED_VARIABLE_FACTORIES_INIT_PARAM, "tiles," + TilesSharedVariableFactory.class.getName()).build(); rendererFactory.registerRenderer(FREEMARKER_RENDERER_NAME, freemarkerRenderer); VelocityRenderer velocityRenderer = VelocityRendererBuilder.createInstance() .setApplicationContext(applicationContext).build(); rendererFactory.registerRenderer(VELOCITY_RENDERER_NAME, velocityRenderer); MustacheRenderer mustacheRenderer = new MustacheRenderer(); mustacheRenderer.setAcceptPattern(Pattern.compile(".+\\.mustache")); rendererFactory.registerRenderer(MUSTACHE_RENDERER_NAME, mustacheRenderer); } /** {@inheritDoc} */ @Override protected Renderer createDefaultAttributeRenderer(BasicRendererFactory rendererFactory, ApplicationContext applicationContext, TilesContainer container, AttributeEvaluatorFactory attributeEvaluatorFactory) { ChainedDelegateRenderer retValue = new ChainedDelegateRenderer(); retValue.addAttributeRenderer(rendererFactory.getRenderer(DEFINITION_RENDERER_NAME)); retValue.addAttributeRenderer(rendererFactory.getRenderer(VELOCITY_RENDERER_NAME)); retValue.addAttributeRenderer(rendererFactory.getRenderer(FREEMARKER_RENDERER_NAME)); retValue.addAttributeRenderer(rendererFactory.getRenderer(MUSTACHE_RENDERER_NAME)); retValue.addAttributeRenderer(rendererFactory.getRenderer(TEMPLATE_RENDERER_NAME)); retValue.addAttributeRenderer(rendererFactory.getRenderer(STRING_RENDERER_NAME)); return retValue; } /** {@inheritDoc} */ @Override protected AttributeEvaluatorFactory createAttributeEvaluatorFactory(ApplicationContext applicationContext, LocaleResolver resolver) { BasicAttributeEvaluatorFactory attributeEvaluatorFactory = new BasicAttributeEvaluatorFactory( createELEvaluator(applicationContext)); attributeEvaluatorFactory.registerAttributeEvaluator("MVEL", createMVELEvaluator()); attributeEvaluatorFactory.registerAttributeEvaluator("OGNL", createOGNLEvaluator()); return attributeEvaluatorFactory; } /** {@inheritDoc} */ @Override protected PatternDefinitionResolver createPatternDefinitionResolver(Class customizationKeyClass) { DefinitionPatternMatcherFactory wildcardFactory = new WildcardDefinitionPatternMatcherFactory(); DefinitionPatternMatcherFactory regexpFactory = new RegexpDefinitionPatternMatcherFactory(); PrefixedPatternDefinitionResolver resolver = new PrefixedPatternDefinitionResolver(); resolver.registerDefinitionPatternMatcherFactory("WILDCARD", wildcardFactory); resolver.registerDefinitionPatternMatcherFactory("REGEXP", regexpFactory); return resolver; } /** {@inheritDoc} */ @Override protected List getSources(ApplicationContext applicationContext) { Collection webINFSet = applicationContext.getResources("/WEB-INF/**/tiles*.xml"); Collection metaINFSet = applicationContext .getResources("classpath*:META-INF/**/tiles*.xml"); List filteredResources = new ArrayList(); if (webINFSet != null) { for (ApplicationResource resource : webINFSet) { if (Locale.ROOT.equals(resource.getLocale())) { filteredResources.add(resource); } } } if (metaINFSet != null) { for (ApplicationResource resource : metaINFSet) { if (Locale.ROOT.equals(resource.getLocale())) { filteredResources.add(resource); } } } return filteredResources; } /** {@inheritDoc} */ @Override protected DefinitionsReader createDefinitionsReader(ApplicationContext applicationContext) { return new CompatibilityDigesterDefinitionsReader(); } /** * Creates the EL evaluator. * * @param applicationContext The Tiles application context. * @return The EL evaluator. */ private ELAttributeEvaluator createELEvaluator(ApplicationContext applicationContext) { ELAttributeEvaluator evaluator = new ELAttributeEvaluator(); JspExpressionFactoryFactory efFactory = new JspExpressionFactoryFactory(); efFactory.setApplicationContext(applicationContext); evaluator.setExpressionFactory(efFactory.getExpressionFactory()); ELResolver elResolver = new CompositeELResolver() { { BeanELResolver beanElResolver = new BeanELResolver(false); add(new ScopeELResolver()); add(new TilesContextELResolver(beanElResolver)); add(new TilesContextBeanELResolver()); add(new ArrayELResolver(false)); add(new ListELResolver(false)); add(new MapELResolver(false)); add(new ResourceBundleELResolver()); add(beanElResolver); } }; evaluator.setResolver(elResolver); return evaluator; } /** * Creates the MVEL evaluator. * * @return The MVEL evaluator. */ private MVELAttributeEvaluator createMVELEvaluator() { TilesRequestContextHolder requestHolder = new TilesRequestContextHolder(); VariableResolverFactory variableResolverFactory = new ScopeVariableResolverFactory(requestHolder); variableResolverFactory.setNextFactory(new TilesContextVariableResolverFactory(requestHolder)); variableResolverFactory.setNextFactory(new TilesContextBeanVariableResolverFactory(requestHolder)); MVELAttributeEvaluator mvelEvaluator = new MVELAttributeEvaluator(requestHolder, variableResolverFactory); return mvelEvaluator; } /** * Creates the OGNL evaluator. * * @return The OGNL evaluator. */ private OGNLAttributeEvaluator createOGNLEvaluator() { try { PropertyAccessor objectPropertyAccessor = OgnlRuntime.getPropertyAccessor(Object.class); PropertyAccessor applicationContextPropertyAccessor = new NestedObjectDelegatePropertyAccessor( new TilesApplicationContextNestedObjectExtractor(), objectPropertyAccessor); PropertyAccessor anyScopePropertyAccessor = new AnyScopePropertyAccessor(); PropertyAccessor scopePropertyAccessor = new ScopePropertyAccessor(); PropertyAccessorDelegateFactory factory = new TilesContextPropertyAccessorDelegateFactory( objectPropertyAccessor, applicationContextPropertyAccessor, anyScopePropertyAccessor, scopePropertyAccessor); PropertyAccessor tilesRequestAccessor = new DelegatePropertyAccessor(factory); OgnlRuntime.setPropertyAccessor(Request.class, tilesRequestAccessor); return new OGNLAttributeEvaluator(); } catch (OgnlException e) { throw new TilesContainerFactoryException("Cannot initialize OGNL evaluator", e); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy