001: package org.apache.velocity.app.event;
002:
003: import org.apache.velocity.context.Context;
004: import org.apache.velocity.util.ContextAware;
005:
006: /*
007: * Licensed to the Apache Software Foundation (ASF) under one
008: * or more contributor license agreements. See the NOTICE file
009: * distributed with this work for additional information
010: * regarding copyright ownership. The ASF licenses this file
011: * to you under the Apache License, Version 2.0 (the
012: * "License"); you may not use this file except in compliance
013: * with the License. You may obtain a copy of the License at
014: *
015: * http://www.apache.org/licenses/LICENSE-2.0
016: *
017: * Unless required by applicable law or agreed to in writing,
018: * software distributed under the License is distributed on an
019: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
020: * KIND, either express or implied. See the License for the
021: * specific language governing permissions and limitations
022: * under the License.
023: */
024:
025: /**
026: * Event handler for include type directives (e.g. <code>#include()</code>, <code>#parse()</code>)
027: * Allows the developer to modify the path of the resource returned.
028: *
029: * @author <a href="mailto:wglass@forio.com">Will Glass-Husain</a>
030: * @version $Id: IncludeEventHandler.java 463298 2006-10-12 16:10:32Z henning $
031: */
032: public interface IncludeEventHandler extends EventHandler {
033: /**
034: * Called when an include-type directive is encountered (
035: * <code>#include</code> or <code>#parse</code>). May modify the path
036: * of the resource to be included or may block the include entirely. All the
037: * registered IncludeEventHandlers are called unless null is returned. If
038: * none are registered the template at the includeResourcePath is retrieved.
039: *
040: * @param includeResourcePath the path as given in the include directive.
041: * @param currentResourcePath the path of the currently rendering template that includes the
042: * include directive.
043: * @param directiveName name of the directive used to include the resource. (With the
044: * standard directives this is either "parse" or "include").
045: *
046: * @return a new resource path for the directive, or null to block the
047: * include from occurring.
048: */
049: public String includeEvent(String includeResourcePath,
050: String currentResourcePath, String directiveName);
051:
052: /**
053: * Defines the execution strategy for includeEvent
054: */
055: static class IncludeEventExecutor implements
056: EventHandlerMethodExecutor {
057: private Context context;
058: private String includeResourcePath;
059: private String currentResourcePath;
060: private String directiveName;
061:
062: private boolean executed = false;
063:
064: IncludeEventExecutor(Context context,
065: String includeResourcePath, String currentResourcePath,
066: String directiveName) {
067: this .context = context;
068: this .includeResourcePath = includeResourcePath;
069: this .currentResourcePath = currentResourcePath;
070: this .directiveName = directiveName;
071: }
072:
073: /**
074: * Call the method includeEvent()
075: *
076: * @param handler call the appropriate method on this handler
077: */
078: public void execute(EventHandler handler) {
079: IncludeEventHandler eh = (IncludeEventHandler) handler;
080:
081: if (eh instanceof ContextAware)
082: ((ContextAware) eh).setContext(context);
083:
084: executed = true;
085: includeResourcePath = ((IncludeEventHandler) handler)
086: .includeEvent(includeResourcePath,
087: currentResourcePath, directiveName);
088: }
089:
090: public Object getReturnValue() {
091: return includeResourcePath;
092: }
093:
094: public boolean isDone() {
095: return executed && (includeResourcePath == null);
096: }
097:
098: }
099:
100: }
|