001: /* ***** BEGIN LICENSE BLOCK *****
002: * Version: MPL 1.1
003: * The contents of this file are subject to the Mozilla Public License Version
004: * 1.1 (the "License"); you may not use this file except in compliance with
005: * the License. You may obtain a copy of the License at
006: * http://www.mozilla.org/MPL/
007: *
008: * Software distributed under the License is distributed on an "AS IS" basis,
009: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
010: * for the specific language governing rights and limitations under the
011: * License.
012: *
013: * The Original Code is Riot.
014: *
015: * The Initial Developer of the Original Code is
016: * Neteye GmbH.
017: * Portions created by the Initial Developer are Copyright (C) 2007
018: * the Initial Developer. All Rights Reserved.
019: *
020: * Contributor(s):
021: * alf
022: *
023: * ***** END LICENSE BLOCK ***** */
024: package org.riotfamily.website.generic.model;
025:
026: import java.util.Date;
027: import java.util.HashMap;
028: import java.util.Map;
029:
030: import javax.servlet.http.HttpServletRequest;
031:
032: /**
033: * @author Alf Werder <alf dot werder at artundweise dot de>
034: * @since 6.5
035: */
036: public class ModelBuilderStack implements CacheableModelBuilder {
037: private ModelBuilder[] modelBuilders = new ModelBuilder[] {};
038:
039: public boolean isCacheable() {
040: for (int i = 0; i < modelBuilders.length; i++) {
041: if (!(modelBuilders[i] instanceof CacheableModelBuilder)) {
042: return false;
043: }
044: }
045:
046: return true;
047: }
048:
049: public void appendCacheKey(StringBuffer key,
050: HttpServletRequest request) {
051: if (isCacheable()) {
052: for (int i = 0; i < modelBuilders.length; i++) {
053: ((CacheableModelBuilder) modelBuilders[i])
054: .appendCacheKey(key, request);
055: }
056: }
057: }
058:
059: public long getLastModified(HttpServletRequest request) {
060: if (isCacheable()) {
061: long lastModified = 0;
062:
063: for (int i = 0; i < modelBuilders.length; i++) {
064: CacheableModelBuilder modelBuilder = (CacheableModelBuilder) modelBuilders[i];
065:
066: lastModified = Math.max(lastModified, modelBuilder
067: .getLastModified(request));
068: }
069:
070: return lastModified;
071: } else {
072: return new Date().getTime();
073: }
074: }
075:
076: public long getTimeToLive() {
077: if (isCacheable()) {
078: long timeToLive = Long.MAX_VALUE;
079:
080: for (int i = 0; i < modelBuilders.length; i++) {
081: CacheableModelBuilder modelBuilder = (CacheableModelBuilder) modelBuilders[i];
082:
083: timeToLive = Math.min(timeToLive, modelBuilder
084: .getTimeToLive());
085: }
086:
087: return timeToLive;
088: } else {
089: return 0;
090: }
091: }
092:
093: public Map buildModel(HttpServletRequest request) throws Exception {
094: Map model = new HashMap();
095:
096: for (int i = 0; i < modelBuilders.length; i++) {
097: model.putAll(modelBuilders[i].buildModel(request));
098: }
099:
100: return model;
101: }
102:
103: public void setModelBuilders(ModelBuilder[] modelBuilders) {
104: this.modelBuilders = modelBuilders;
105: }
106: }
|