001: package com.teamkonzept.lib.templates;
002:
003: import java.io.*;
004:
005: import com.teamkonzept.lib.*;
006:
007: /**
008: * Falls noch kein TKTemplateSyntax-Objekt besteht, wird dieses erzeugt
009: * @author $Author: alex $
010: * @version $Revision: 1.11 $
011: */
012: public class TKTemplateCache {
013:
014: /** die gecacheten Syntaxobjekte */
015: protected static TKHashtable syntaxes = new TKHashtable();
016:
017: /** Modifizierungsdaten der Templates */
018: protected static TKHashtable dates = new TKHashtable();
019:
020: /** die Class Objekte der Loader */
021: protected static TKClassRegistry loaderRegistry = new TKClassRegistry();
022:
023: /** die Instanzen der Loader */
024: protected static TKHashtable loaders = new TKHashtable();
025:
026: static {
027: loaderRegistry.registerClass(TKTemplateFileLoader.CLASS_ID,
028: "com.teamkonzept.lib.templates.TKTemplateFileLoader");
029: }
030:
031: protected static synchronized TKTemplateSourceLoader getLoader(
032: String classId) {
033: TKTemplateSourceLoader loader = (TKTemplateSourceLoader) loaders
034: .get(classId);
035: if (loader == null) {
036: try {
037: loader = (TKTemplateSourceLoader) loaderRegistry
038: .get(classId);
039: } catch (Exception e) {
040: throw new IncompatibleClassChangeError(e.toString());
041: }
042: loaders.put(classId, loader);
043: }
044: return loader;
045: }
046:
047: public static final String loaderClassId(String location,
048: String parentLocation) {
049: int loaderEnd = location.indexOf(':');
050: return (loaderEnd < 0 ? parentLocation.substring(0,
051: parentLocation.indexOf(':')) : location.substring(0,
052: loaderEnd));
053: }
054:
055: public static final boolean exists(String location,
056: String parentLocation) {
057: location = location.replace('/', File.separatorChar);
058: String loaderClassId = loaderClassId(location, parentLocation);
059:
060: TKTemplateSourceLoader loader = getLoader(loaderClassId);
061: return loader.exists(loader.childLocation(location,
062: parentLocation));
063: }
064:
065: /**
066: liefert Source Text zurueck
067: */
068: public static String getSource(String location) throws IOException {
069: location = location.replace('/', File.separatorChar);
070: String loaderClassId = loaderClassId(location, "");
071:
072: TKTemplateSourceLoader loader = getLoader(loaderClassId);
073:
074: String newLocation = loader.childLocation(location, "");
075: return loader.loadSource(newLocation);
076: }
077:
078: /**
079: * Falls noch kein Syntaxbaum fuer ein Template erzeugt wurde, wird dieser
080: * aufgebaut. Der Vater eines Syntaxobjektes mit seinen Kindern wird
081: * zurueckgegeben
082: *
083: * @param File templateFile, ein Template als File-Objekt
084: * @return die Syntax eines Templates
085: */
086: public static synchronized TKTemplateSyntax getSyntax(
087: String location, TKTemplateSyntax parent)
088: throws TKTemplateSyntaxException {
089: location = location.replace('/', File.separatorChar);
090: String parentLocation = (parent == null ? "" : parent
091: .getSource()); // Abfrage auf null ueberfluessig!
092: String loaderClassId = loaderClassId(location, parentLocation);
093:
094: TKTemplateSourceLoader loader = getLoader(loaderClassId);
095:
096: String newLocation = loader.childLocation(location,
097: parentLocation);
098:
099: // TKLog.println ("TKTemplateCache.getSyntax/parentsyntax, location="+
100: // location+", loaderClassId="+loaderClassId+", newLocation="+
101: // newLocation+", parentLocation="+parentLocation);
102:
103: long fileModified = loader.lastModified(newLocation);
104: Long cacheModified = (Long) dates.get(newLocation);
105:
106: //Ein TKTemplateSyntax-Objekt besteht bereits
107: if (cacheModified != null
108: && cacheModified.longValue() == fileModified) {
109: return (TKTemplateSyntax) syntaxes.get(newLocation);
110: }
111:
112: //Ein TKTemplateSyntax-Objekt wird erzeugt
113: //TKLib.slurpfile(templateFile) => das File wird in String umgewandelt
114: TKTemplateSyntax syntax = parent.newChild(loader
115: .loadSource(newLocation), newLocation);
116:
117: //Nur wenn der Vater schon im Cache war, kommt auch der Sohn rein!
118: if (syntaxes.get(parentLocation) != null) {
119: syntaxes.put(newLocation, syntax);
120: dates.put(newLocation, new Long(fileModified));
121: }
122: return syntax;
123: }
124:
125: /**
126: * Falls noch kein Syntaxbaum fuer ein Template erzeugt wurde, wird dieser
127: * aufgebaut. Der Vater eines Syntaxobjektes mit seinen Kindern wird
128: * zurueckgegeben
129: *
130: * @param File templateFile, ein Template als File-Objekt
131: * @return die Syntax eines Templates
132: */
133: public static synchronized TKTemplateSyntax getSyntax(
134: String location, TKTemplate template)
135: throws TKTemplateSyntaxException, FileNotFoundException {
136: location = location.replace('/', File.separatorChar);
137: String loaderClassId = location.substring(0, location
138: .indexOf(':'));
139:
140: TKTemplateSourceLoader loader = getLoader(loaderClassId);
141:
142: String newLocation = loader.childLocation(location, "");
143:
144: // TKLog.println ("TKTemplateCache.getSyntax/template, location="+location+", loaderClassId="+
145: // loaderClassId+", newLocation="+newLocation);
146:
147: long fileModified = loader.lastModified(newLocation);
148: Long cacheModified = (Long) dates.get(newLocation);
149:
150: //Ein TKTemplateSyntax-Objekt besteht bereits
151: if (cacheModified != null
152: && cacheModified.longValue() == fileModified) {
153: return (TKTemplateSyntax) syntaxes.get(newLocation);
154: }
155:
156: //Ein TKTemplateSyntax-Objekt wird erzeugt
157: //TKLib.slurpfile(templateFile) => das File wird in String umgewandelt
158:
159: TKTemplateSyntax syntax = template.syntax == null ? template
160: .newSyntax() : template.newSyntax(template.syntax
161: .getTKTag());
162:
163: if (!loader.exists(newLocation)) {
164: throw new java.io.FileNotFoundException(newLocation);
165: }
166:
167: syntax.init(loader.loadSource(newLocation), newLocation);
168:
169: syntaxes.put(newLocation, syntax);
170: dates.put(newLocation, new Long(fileModified));
171: return syntax;
172: }
173:
174: public static void loadSyntax(String location,
175: TKTemplateSyntax syntax) throws TKTemplateSyntaxException {
176: location = location.replace('/', File.separatorChar);
177: String loaderClassId = location.substring(0, location
178: .indexOf(':'));
179:
180: TKTemplateSourceLoader loader = getLoader(loaderClassId);
181:
182: String newLocation = loader.childLocation(location, "");
183:
184: syntax.init(loader.loadSource(newLocation), newLocation);
185: }
186:
187: }
|