/* * Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com) * Licensed under the Apache License, Version 2.0 (the "License") * $Id: CharSequenceDeferred.java 3918 2008-04-14 17:35:35Z gbevin $ */ package com.uwyn.rife.engine; import com.uwyn.rife.template.TemplateEncoder; public abstract class CharSequenceDeferred<T extends CharSequenceDeferred> implements CharSequence { private CharSequence mContent = null; private String mResult = null; private TemplateEncoder mEncoder = null; private long mPreservedInputsModified = -1; public synchronized void setContent(CharSequence content) { mContent = content; } synchronized T encoder(TemplateEncoder encoder) { mEncoder = encoder; mResult = null; return (T)this; } public synchronized String encode(String value) { if (null == mEncoder) { return value; } return mEncoder.encode(value); } protected abstract void fillInContent(); public synchronized final String toString() { long modified = RequestState.getActiveRequestState().getElementResultStatesObtained().getModified(); if (mPreservedInputsModified != modified) { mResult = null; mPreservedInputsModified = modified; fillInContent(); } if (null == mContent) { return null; } if (null == mResult) { mResult = mContent.toString(); } return mResult; } public int length() { return 0; } public char charAt(int index) { return toString().charAt(index); } public CharSequence subSequence(int start, int end) { return toString().subSequence(start, end); } }