001: /*
002: * Copyright 2001-2006 C:1 Financial Services GmbH
003: *
004: * This software is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License Version 2.1, as published by the Free Software Foundation.
007: *
008: * This software is distributed in the hope that it will be useful,
009: * but WITHOUT ANY WARRANTY; without even the implied warranty of
010: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
011: * Lesser General Public License for more details.
012: *
013: * You should have received a copy of the GNU Lesser General Public
014: * License along with this library; if not, write to the Free Software
015: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
016: */
017:
018: package de.finix.contelligent.content;
019:
020: import java.io.CharArrayWriter;
021: import java.io.IOException;
022: import java.util.Iterator;
023: import java.util.Map;
024:
025: import de.finix.contelligent.CallData;
026: import de.finix.contelligent.Component;
027: import de.finix.contelligent.category.CategoryCombinationNotSupportedException;
028: import de.finix.contelligent.core.TimeService;
029: import de.finix.contelligent.exception.ComponentPersistenceException;
030: import de.finix.contelligent.exception.ContelligentException;
031: import de.finix.contelligent.logging.LoggingService;
032: import de.finix.contelligent.render.Template;
033: import de.finix.contelligent.resource.Resource;
034: import de.finix.contelligent.resource.StringResource;
035:
036: public class ContelligentStringContent extends ContelligentContent
037: implements StringContent {
038:
039: final static org.apache.log4j.Logger log = LoggingService
040: .getLogger(ContelligentStringContent.class);
041:
042: public final static int LITERAL = 0;
043:
044: public final static int EVALUATE = 1;
045:
046: private int mode;
047:
048: public ContelligentStringContent(Component component, int mode)
049: throws Exception {
050: super (component);
051: this .mode = mode;
052: if (mode == EVALUATE) {
053: prepareTemplates();
054: }
055: }
056:
057: public Object getContentValue(CallData callData)
058: throws IOException, ContelligentException {
059: return getString(callData);
060: }
061:
062: public Template getTemplate(CallData callData)
063: throws CategoryCombinationNotSupportedException,
064: ComponentPersistenceException, ContelligentException {
065: String identifier = getResourceIdentifier(callData);
066: Object object = getResourceMap().get(identifier);
067: if (object != null) {
068: if (object instanceof Template) {
069: return (Template) object;
070: } else if (object instanceof StringResource) {
071: StringResource resource = (StringResource) object;
072: Template template = new Template(resource.getString());
073: return template;
074: }
075: }
076: log.debug("The requested template for category combination ["
077: + identifier + "] is not supported!");
078: throw new CategoryCombinationNotSupportedException(
079: "The requested template for category combination ["
080: + identifier + "] is not supported!");
081: }
082:
083: public long lastModified(CallData callData) throws IOException {
084: Object o = getResourceMap()
085: .get(getResourceIdentifier(callData));
086: if (o instanceof Resource) { // resource-map may contain templates as
087: // well!
088: return ((Resource) o).getLastModified();
089: } else {
090: return -1;
091: }
092: }
093:
094: public String getString(CallData callData)
095: throws ContelligentException, IOException {
096: if (mode == EVALUATE) {
097: CharArrayWriter writer = new CharArrayWriter(16384);
098: try {
099: Template template = getTemplate(callData);
100: template.write(writer, getComponent(), callData);
101: } catch (CategoryCombinationNotSupportedException e) {
102: log
103: .debug("Can not render component '"
104: + getComponent().getComponentContext()
105: .getPath()
106: + "'. Resource not defined or category not supported.]");
107: }
108: return writer.toString();
109: } else {
110: StringResource sr = (StringResource) getResourceMap().get(
111: getResourceIdentifier(callData));
112: return (sr != null ? sr.getString() : null);
113: }
114: }
115:
116: public void setString(String value, CallData callData)
117: throws ContelligentException {
118: StringResource resource = new StringResource(value, TimeService
119: .getInstance().currentTimeMillis());
120: setResource(resource, callData);
121: if (mode == EVALUATE) {
122: prepareTemplates();
123: }
124: }
125:
126: private void prepareTemplates()
127: throws ComponentPersistenceException, ContelligentException {
128: for (Iterator i = getResourceMap().entrySet().iterator(); i
129: .hasNext();) {
130: Map.Entry entry = (Map.Entry) i.next();
131: String identifier = (String) entry.getKey();
132: StringResource resource = (StringResource) entry.getValue();
133: getResourceMap().put(identifier,
134: new Template(resource.getString()));
135: }
136: }
137: }
|