/* 
 * Qlue Web Application Framework
 * Copyright 2009-2012 Ivan Ristic <ivanr@webkreator.com>
 *
 * Licensed 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 com.webkreator.canoe;

import org.apache.velocity.app.event.ReferenceInsertionEventHandler;

/**
 * This class is a bridge between Canoe and Velocity.
 */
public class CanoeReferenceInsertionHandler implements
		ReferenceInsertionEventHandler {

	public static final String SAFE_REFERENCE_NAME = "_x";

	public static final String SAFE_REFERENCE_PREFIX = "$"
			+ SAFE_REFERENCE_NAME + ".";

	protected Canoe qlueWriter;

	public CanoeReferenceInsertionHandler(Canoe qlueWriter) {
		this.qlueWriter = qlueWriter;
	}

	/**
	 * Encodes text for output.
	 */
	@Override
	public Object referenceInsert(String arg0, Object arg1) {
		// We ignore references that start with the prefix
		// we consider to be safe. This allows developers to
		// bypass the automatic encoding mechanism and prepare
		// output themselves.
		if (arg0.startsWith(SAFE_REFERENCE_PREFIX)) {
			return arg1;
		}

		// Give up if there's nothing to output
		if (arg1 == null) {
			return null;
		}

		// Now encode the text using the correct encoder
		return Canoe.encode(arg1.toString(), qlueWriter.currentContext());
	}
}

@@ -1039,16 +1039,17 @@
 E_PREFIX
+1
  = %22$%22%0D%0A
@@ -1083,16 +1083,110 @@
 %22.%22;%0D%0A%0D%0A
+%09public static final String SAFE_REFERENCE_PREFIX2 = %22$!%22%0D%0A%09%09%09+ SAFE_REFERENCE_NAME + %22.%22;%0D%0A%0D%0A
 %09protect
@@ -1658,16 +1658,58 @@
 E_PREFIX
+1)%7C%7Carg0.startsWith(SAFE_REFERENCE_PREFIX2
 )) %7B%0D%0A%09%09

Allow the use of the exclamation mark in direct output (e.g., $!_x.something).