001: /* *************************************************************************
002:
003: Millstone(TM)
004: Open Sourced User Interface Library for
005: Internet Development with Java
006:
007: Millstone is a registered trademark of IT Mill Ltd
008: Copyright (C) 2000-2005 IT Mill Ltd
009:
010: *************************************************************************
011:
012: This library is free software; you can redistribute it and/or
013: modify it under the terms of the GNU Lesser General Public
014: license version 2.1 as published by the Free Software Foundation.
015:
016: This library is distributed in the hope that it will be useful,
017: but WITHOUT ANY WARRANTY; without even the implied warranty of
018: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: Lesser General Public License for more details.
020:
021: You should have received a copy of the GNU Lesser General Public
022: License along with this library; if not, write to the Free Software
023: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024:
025: *************************************************************************
026:
027: For more information, contact:
028:
029: IT Mill Ltd phone: +358 2 4802 7180
030: Ruukinkatu 2-4 fax: +358 2 4802 7181
031: 20540, Turku email: info@itmill.com
032: Finland company www: www.itmill.com
033:
034: Primary source for MillStone information and releases: www.millstone.org
035:
036: ********************************************************************** */
037:
038: package org.millstone.webadapter;
039:
040: import java.io.InputStream;
041: import java.util.Collection;
042: import java.util.Iterator;
043: import java.util.LinkedList;
044: import java.util.List;
045:
046: /** Theme source for consisting of collection of other theme sources.
047: * This class is used to implement the retrieval of themes
048: * from multiple sources. Also this class implements the inheritance
049: * of themes by first retrieving the relevant parent theme information.
050: * @author IT Mill Ltd.
051: * @version 3.1.1
052: * @since 3.0
053: */
054: public class CollectionThemeSource implements ThemeSource {
055:
056: private List sources = new LinkedList();
057:
058: /**
059: * @see org.millstone.webadapter.ThemeSource#getName()
060: */
061: public String getName() {
062: return "THEMES";
063: }
064:
065: /**
066: * @see org.millstone.webadapter.ThemeSource#getXSLStreams(Theme, WebBrowser)
067: */
068: public Collection getXSLStreams(Theme theme, WebBrowser type)
069: throws ThemeException {
070: Collection xslFiles = new LinkedList();
071:
072: // Add parent theme XSL
073: xslFiles.addAll(this .getParentXSLStreams(theme, type));
074:
075: // Add theme XSL, Handle subdirectories: return the first match
076: for (Iterator i = this .sources.iterator(); i.hasNext();) {
077: ThemeSource source = (ThemeSource) i.next();
078: if (source.getThemes().contains(theme))
079: xslFiles.addAll(source.getXSLStreams(theme, type));
080: }
081:
082: return xslFiles;
083: }
084:
085: private Collection getParentXSLStreams(Theme theme, WebBrowser type)
086: throws ThemeException {
087: Collection xslFiles = new LinkedList();
088: Collection parents = theme.getParentThemes();
089: for (Iterator i = parents.iterator(); i.hasNext();) {
090: String name = (String) i.next();
091: Theme parent = this .getThemeByName(name);
092: if (parent != null) {
093: xslFiles.addAll(this .getXSLStreams(parent, type));
094: } else {
095: throw new ThemeSource.ThemeException(
096: "Parent theme not found for name: " + name);
097: }
098: }
099: return xslFiles;
100: }
101:
102: /**
103: * @see org.millstone.webadapter.ThemeSource#getModificationTime()
104: */
105: public long getModificationTime() {
106: long modTime = 0;
107: for (Iterator i = this .sources.iterator(); i.hasNext();) {
108: long t = ((ThemeSource) i.next()).getModificationTime();
109: if (t > modTime)
110: modTime = t;
111: }
112: return modTime;
113: }
114:
115: /**
116: * @see org.millstone.webadapter.ThemeSource#getResource(String)
117: */
118: public InputStream getResource(String resourceId)
119: throws ThemeException {
120:
121: // Resolve theme name and resource name
122: int delim = resourceId.indexOf("/");
123: String subResourceId = "";
124: String themeName = "";
125: if (delim >= 0 && delim < resourceId.length() - 1) {
126: subResourceId = resourceId.substring(delim + 1);
127: themeName = resourceId.substring(0, delim);
128: }
129:
130: // Get list of themes to look for the resource
131: List themes = new LinkedList();
132: if (themeName.length() > 0) {
133: Theme t = this .getThemeByName(themeName);
134: if (t != null) {
135: themes.add(t.getName());
136: addAllParents(themes, t);
137: }
138: }
139:
140: // Iterate all themes in list
141: for (Iterator ti = themes.iterator(); ti.hasNext();) {
142: String name = (String) ti.next();
143: String resource = name + "/" + subResourceId;
144: // Search all sources
145: for (Iterator i = this .sources.iterator(); i.hasNext();) {
146: try {
147: InputStream in = ((ThemeSource) i.next())
148: .getResource(resource);
149: if (in != null)
150: return in;
151: } catch (ThemeException e) {
152: // Ignore and continue to next source
153: }
154: }
155: }
156:
157: throw new ThemeException("Theme resource not found:"
158: + subResourceId + " in themes " + themes);
159: }
160:
161: /** Recusrivelu get list of parent themes in inheritace order.
162: *
163: * @param t Theme which parents should be listed
164: * @return Collection of themes in inheritance order.
165: */
166: private void addAllParents(List list, Theme t) {
167: if (t == null)
168: return;
169:
170: List parents = t.getParentThemes();
171: list.addAll(parents);
172: for (Iterator i = parents.iterator(); i.hasNext();) {
173: addAllParents(list, this .getThemeByName((String) i.next()));
174: }
175: }
176:
177: /**
178: * @see org.millstone.webadapter.ThemeSource#getThemes()
179: */
180: public Collection getThemes() {
181: Collection themes = new LinkedList();
182: for (Iterator i = this .sources.iterator(); i.hasNext();) {
183: Collection c = ((ThemeSource) i.next()).getThemes();
184: themes.addAll(c);
185: }
186: return themes;
187: }
188:
189: /**
190: * @see org.millstone.webadapter.ThemeSource#getThemeByName(String)
191: */
192: public Theme getThemeByName(String name) {
193: for (Iterator i = this .sources.iterator(); i.hasNext();) {
194: Theme t = ((ThemeSource) i.next()).getThemeByName(name);
195: if (t != null)
196: return t;
197: }
198: return null;
199: }
200:
201: /**Add new theme source to this collection.
202: * @param source Theme source to be added.
203: */
204: public void add(ThemeSource source) {
205: this.sources.add(source);
206: }
207:
208: }
|