aboutsummaryrefslogtreecommitdiff
path: root/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextAdapterImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextAdapterImpl.java')
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextAdapterImpl.java363
1 files changed, 363 insertions, 0 deletions
diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextAdapterImpl.java b/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextAdapterImpl.java
new file mode 100644
index 00000000..9587e510
--- /dev/null
+++ b/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextAdapterImpl.java
@@ -0,0 +1,363 @@
+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.Template;
+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)
+ */
+ @Override
+ public void pushCurrentTemplateName(String s )
+ {
+ icb.pushCurrentTemplateName( s );
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#popCurrentTemplateName()
+ */
+ @Override
+ public void popCurrentTemplateName()
+ {
+ icb.popCurrentTemplateName();
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentTemplateName()
+ */
+ @Override
+ public String getCurrentTemplateName()
+ {
+ return icb.getCurrentTemplateName();
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#getTemplateNameStack()
+ */
+ @Override
+ public String[] getTemplateNameStack()
+ {
+ return icb.getTemplateNameStack();
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#pushCurrentMacroName(java.lang.String)
+ * @since 1.6
+ */
+ @Override
+ public void pushCurrentMacroName(String s )
+ {
+ icb.pushCurrentMacroName( s );
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#popCurrentMacroName()
+ * @since 1.6
+ */
+ @Override
+ public void popCurrentMacroName()
+ {
+ icb.popCurrentMacroName();
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentMacroName()
+ * @since 1.6
+ */
+ @Override
+ public String getCurrentMacroName()
+ {
+ return icb.getCurrentMacroName();
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentMacroCallDepth()
+ * @since 1.6
+ */
+ @Override
+ public int getCurrentMacroCallDepth()
+ {
+ return icb.getCurrentMacroCallDepth();
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#getMacroNameStack()
+ * @since 1.6
+ */
+ @Override
+ public String[] getMacroNameStack()
+ {
+ return icb.getMacroNameStack();
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#icacheGet(java.lang.Object)
+ */
+ @Override
+ 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)
+ */
+ @Override
+ public void icachePut(Object key, IntrospectionCacheData o )
+ {
+ icb.icachePut( key, o );
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#setCurrentResource(org.apache.velocity.runtime.resource.Resource)
+ */
+ @Override
+ public void setCurrentResource(Resource r )
+ {
+ icb.setCurrentResource(r);
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentResource()
+ */
+ @Override
+ public Resource getCurrentResource()
+ {
+ return icb.getCurrentResource();
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#setMacroLibraries(List)
+ * @since 1.6
+ */
+ @Override
+ public void setMacroLibraries(List<Template> macroLibraries)
+ {
+ icb.setMacroLibraries(macroLibraries);
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalHousekeepingContext#getMacroLibraries()
+ * @since 1.6
+ */
+ @Override
+ public List<Template> getMacroLibraries()
+ {
+ return icb.getMacroLibraries();
+ }
+
+ /* --- Context interface methods --- */
+
+ /**
+ * @see org.apache.velocity.context.Context#put(java.lang.String, java.lang.Object)
+ */
+ @Override
+ public Object put(String key, Object value)
+ {
+ return context.put( key , value );
+ }
+
+ /**
+ * @see org.apache.velocity.context.Context#get(java.lang.String)
+ */
+ @Override
+ public Object get(String key)
+ {
+ return context.get( key );
+ }
+
+ /**
+ * @see org.apache.velocity.context.Context#containsKey(java.lang.String)
+ */
+ @Override
+ public boolean containsKey(String key)
+ {
+ return context.containsKey( key );
+ }
+
+ /**
+ * @see org.apache.velocity.context.Context#getKeys()
+ */
+ @Override
+ public String[] getKeys()
+ {
+ return context.getKeys();
+ }
+
+ /**
+ * @see org.apache.velocity.context.Context#remove(java.lang.String)
+ */
+ @Override
+ public Object remove(String key)
+ {
+ return context.remove( key );
+ }
+
+
+ /* ---- InternalWrapperContext --- */
+
+ /**
+ * returns the user data context that
+ * we are wrapping
+ * @return The internal user data context.
+ */
+ @Override
+ 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.
+ */
+ @Override
+ public InternalContextAdapter getBaseContext()
+ {
+ return this;
+ }
+
+ /* ----- InternalEventContext ---- */
+
+ /**
+ * @see org.apache.velocity.context.InternalEventContext#attachEventCartridge(org.apache.velocity.app.event.EventCartridge)
+ */
+ @Override
+ public EventCartridge attachEventCartridge(EventCartridge ec )
+ {
+ if (iec != null)
+ {
+ return iec.attachEventCartridge( ec );
+ }
+
+ return null;
+ }
+
+ /**
+ * @see org.apache.velocity.context.InternalEventContext#getEventCartridge()
+ */
+ @Override
+ public EventCartridge getEventCartridge()
+ {
+ if ( iec != null)
+ {
+ return iec.getEventCartridge( );
+ }
+
+ return null;
+ }
+
+}