| package org.apache.velocity.context; |
| |
| /* |
| * 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. |
| */ |
| |
| import org.apache.velocity.app.event.EventCartridge; |
| import org.apache.velocity.runtime.resource.Resource; |
| import org.apache.velocity.util.introspection.IntrospectionCacheData; |
| |
| import java.util.List; |
| |
| /** |
| * This adapter class is the container for all context types for internal |
| * use. The AST now uses this class rather than the app-level Context |
| * interface to allow flexibility in the future. |
| * |
| * Currently, we have two context interfaces which must be supported : |
| * <ul> |
| * <li> Context : used for application/template data access |
| * <li> InternalHousekeepingContext : used for internal housekeeping and caching |
| * <li> InternalWrapperContext : used for getting root cache context and other |
| * such. |
| * <li> InternalEventContext : for event handling. |
| * </ul> |
| * |
| * This class implements the two interfaces to ensure that all methods are |
| * supported. When adding to the interfaces, or adding more context |
| * functionality, the interface is the primary definition, so alter that first |
| * and then all classes as necessary. As of this writing, this would be |
| * the only class affected by changes to InternalContext |
| * |
| * This class ensures that an InternalContextBase is available for internal |
| * use. If an application constructs their own Context-implementing |
| * object w/o subclassing AbstractContext, it may be that support for |
| * InternalContext is not available. Therefore, InternalContextAdapter will |
| * create an InternalContextBase if necessary for this support. Note that |
| * if this is necessary, internal information such as node-cache data will be |
| * lost from use to use of the context. This may or may not be important, |
| * depending upon application. |
| * |
| * |
| * @author <a href="mailto:geirm@optonline.net">Geir Magnusson Jr.</a> |
| * @version $Id$ |
| */ |
| public final class InternalContextAdapterImpl implements InternalContextAdapter |
| { |
| /** |
| * the user data Context that we are wrapping |
| */ |
| Context context = null; |
| |
| /** |
| * the ICB we are wrapping. We may need to make one |
| * if the user data context implementation doesn't |
| * support one. The default AbstractContext-derived |
| * VelocityContext does, and it's recommended that |
| * people derive new contexts from AbstractContext |
| * rather than piecing things together |
| */ |
| InternalHousekeepingContext icb = null; |
| |
| /** |
| * The InternalEventContext that we are wrapping. If |
| * the context passed to us doesn't support it, no |
| * biggie. We don't make it for them - since its a |
| * user context thing, nothing gained by making one |
| * for them now |
| */ |
| InternalEventContext iec = null; |
| |
| /** |
| * CTOR takes a Context and wraps it, delegating all 'data' calls |
| * to it. |
| * |
| * For support of internal contexts, it will create an InternalContextBase |
| * if need be. |
| * @param c |
| */ |
| public InternalContextAdapterImpl( Context c ) |
| { |
| context = c; |
| |
| if ( !( c instanceof InternalHousekeepingContext )) |
| { |
| icb = new InternalContextBase(); |
| } |
| else |
| { |
| icb = (InternalHousekeepingContext) context; |
| } |
| |
| if ( c instanceof InternalEventContext) |
| { |
| iec = ( InternalEventContext) context; |
| } |
| } |
| |
| /* --- InternalHousekeepingContext interface methods --- */ |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#pushCurrentTemplateName(java.lang.String) |
| */ |
| public void pushCurrentTemplateName( String s ) |
| { |
| icb.pushCurrentTemplateName( s ); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#popCurrentTemplateName() |
| */ |
| public void popCurrentTemplateName() |
| { |
| icb.popCurrentTemplateName(); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentTemplateName() |
| */ |
| public String getCurrentTemplateName() |
| { |
| return icb.getCurrentTemplateName(); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#getTemplateNameStack() |
| */ |
| public Object[] getTemplateNameStack() |
| { |
| return icb.getTemplateNameStack(); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#pushCurrentMacroName(java.lang.String) |
| * @since 1.6 |
| */ |
| public void pushCurrentMacroName( String s ) |
| { |
| icb.pushCurrentMacroName( s ); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#popCurrentMacroName() |
| * @since 1.6 |
| */ |
| public void popCurrentMacroName() |
| { |
| icb.popCurrentMacroName(); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentMacroName() |
| * @since 1.6 |
| */ |
| public String getCurrentMacroName() |
| { |
| return icb.getCurrentMacroName(); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentMacroCallDepth() |
| * @since 1.6 |
| */ |
| public int getCurrentMacroCallDepth() |
| { |
| return icb.getCurrentMacroCallDepth(); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#getMacroNameStack() |
| * @since 1.6 |
| */ |
| public Object[] getMacroNameStack() |
| { |
| return icb.getMacroNameStack(); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#icacheGet(java.lang.Object) |
| */ |
| public IntrospectionCacheData icacheGet( Object key ) |
| { |
| return icb.icacheGet( key ); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#icachePut(java.lang.Object, org.apache.velocity.util.introspection.IntrospectionCacheData) |
| */ |
| public void icachePut( Object key, IntrospectionCacheData o ) |
| { |
| icb.icachePut( key, o ); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#setCurrentResource(org.apache.velocity.runtime.resource.Resource) |
| */ |
| public void setCurrentResource( Resource r ) |
| { |
| icb.setCurrentResource(r); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentResource() |
| */ |
| public Resource getCurrentResource() |
| { |
| return icb.getCurrentResource(); |
| } |
| |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#getAllowRendering() |
| * @since 1.5 |
| */ |
| public boolean getAllowRendering() |
| { |
| return icb.getAllowRendering(); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#setAllowRendering(boolean) |
| * @since 1.5 |
| */ |
| public void setAllowRendering(boolean v) |
| { |
| icb.setAllowRendering(v); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#setMacroLibraries(List) |
| * @since 1.6 |
| */ |
| public void setMacroLibraries(List macroLibraries) |
| { |
| icb.setMacroLibraries(macroLibraries); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalHousekeepingContext#getMacroLibraries() |
| * @since 1.6 |
| */ |
| public List getMacroLibraries() |
| { |
| return icb.getMacroLibraries(); |
| } |
| |
| /* --- Context interface methods --- */ |
| |
| /** |
| * @see org.apache.velocity.context.Context#put(java.lang.String, java.lang.Object) |
| */ |
| public Object put(String key, Object value) |
| { |
| return context.put( key , value ); |
| } |
| |
| /** |
| * @see InternalWrapperContext#localPut(String, Object) |
| * @since 1.5 |
| */ |
| public Object localPut(final String key, final Object value) |
| { |
| return put(key, value); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.Context#get(java.lang.String) |
| */ |
| public Object get(String key) |
| { |
| return context.get( key ); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.Context#containsKey(java.lang.Object) |
| */ |
| public boolean containsKey(Object key) |
| { |
| return context.containsKey( key ); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.Context#getKeys() |
| */ |
| public Object[] getKeys() |
| { |
| return context.getKeys(); |
| } |
| |
| /** |
| * @see org.apache.velocity.context.Context#remove(java.lang.Object) |
| */ |
| public Object remove(Object key) |
| { |
| return context.remove( key ); |
| } |
| |
| |
| /* ---- InternalWrapperContext --- */ |
| |
| /** |
| * returns the user data context that |
| * we are wrapping |
| * @return The internal user data context. |
| */ |
| public Context getInternalUserContext() |
| { |
| return context; |
| } |
| |
| /** |
| * Returns the base context that we are |
| * wrapping. Here, its this, but for other thing |
| * like VM related context contortions, it can |
| * be something else |
| * @return The base context. |
| */ |
| public InternalContextAdapter getBaseContext() |
| { |
| return this; |
| } |
| |
| /* ----- InternalEventContext ---- */ |
| |
| /** |
| * @see org.apache.velocity.context.InternalEventContext#attachEventCartridge(org.apache.velocity.app.event.EventCartridge) |
| */ |
| public EventCartridge attachEventCartridge( EventCartridge ec ) |
| { |
| if (iec != null) |
| { |
| return iec.attachEventCartridge( ec ); |
| } |
| |
| return null; |
| } |
| |
| /** |
| * @see org.apache.velocity.context.InternalEventContext#getEventCartridge() |
| */ |
| public EventCartridge getEventCartridge() |
| { |
| if ( iec != null) |
| { |
| return iec.getEventCartridge( ); |
| } |
| |
| return null; |
| } |
| } |
| |
| |
| |