001: /*
002: JSPWiki - a JSP-based WikiWiki clone.
003:
004: Copyright (C) 2001 Janne Jalkanen (Janne.Jalkanen@iki.fi)
005:
006: This program is free software; you can redistribute it and/or modify
007: it under the terms of the GNU Lesser General Public License as published by
008: the Free Software Foundation; either version 2.1 of the License, or
009: (at your option) any later version.
010:
011: This program is distributed in the hope that it will be useful,
012: but WITHOUT ANY WARRANTY; without even the implied warranty of
013: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: GNU Lesser General Public License for more details.
015:
016: You should have received a copy of the GNU Lesser General Public License
017: along with this program; if not, write to the Free Software
018: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: */
020: package com.ecyrd.jspwiki;
021:
022: import java.util.Date;
023: import java.util.HashMap;
024: import com.ecyrd.jspwiki.acl.AccessControlList;
025:
026: import com.ecyrd.jspwiki.providers.WikiPageProvider;
027:
028: /**
029: * Simple wrapper class for the Wiki page attributes. The Wiki page
030: * content is moved around in Strings, though.
031: */
032:
033: // FIXME: We need to rethink how metadata is being used - probably the
034: // author, date, etc. should also be part of the metadata. We also
035: // need to figure out the metadata lifecycle.
036: public class WikiPage implements Cloneable, Comparable {
037: private String m_name;
038: private Date m_lastModified;
039: private long m_fileSize = -1;
040: private int m_version = WikiPageProvider.LATEST_VERSION;
041: private String m_author = null;
042: private HashMap m_attributes = new HashMap();
043:
044: /**
045: * "Summary" is a short summary of the page. It is a String.
046: */
047: public static final String DESCRIPTION = "summary";
048:
049: public static final String ALIAS = "alias";
050: public static final String REDIRECT = "redirect";
051:
052: public static final String SIZE = "size";
053:
054: private AccessControlList m_accessList = null;
055:
056: public WikiPage(String name) {
057: m_name = name;
058: }
059:
060: public String getName() {
061: return m_name;
062: }
063:
064: public void setName(String name) {
065: m_name = name;
066: }
067:
068: /**
069: * A WikiPage may have a number of attributes, which might or might not be
070: * available. Typically attributes are things that do not need to be stored
071: * with the wiki page to the page repository, but are generated
072: * on-the-fly. A provider is not required to save them, but they
073: * can do that if they really want.
074: *
075: * @param key The key using which the attribute is fetched
076: * @return The attribute. If the attribute has not been set, returns null.
077: */
078: public Object getAttribute(String key) {
079: return m_attributes.get(key);
080: }
081:
082: /**
083: * Sets an metadata attribute.
084: */
085: public void setAttribute(String key, Object attribute) {
086: m_attributes.put(key, attribute);
087: }
088:
089: /**
090: * Removes an attribute from the page, if it exists.
091: * @return If the attribute existed, returns the object.
092: * @since 2.1.111
093: */
094: public Object removeAttribute(String key) {
095: return m_attributes.remove(key);
096: }
097:
098: /**
099: * Returns the date when this page was last modified.
100: */
101: public Date getLastModified() {
102: return m_lastModified;
103: }
104:
105: public void setLastModified(Date date) {
106: m_lastModified = date;
107: }
108:
109: public void setVersion(int version) {
110: m_version = version;
111: }
112:
113: /**
114: * Returns the version that this WikiPage instance represents.
115: */
116: public int getVersion() {
117: return m_version;
118: }
119:
120: /**
121: * @since 2.1.109
122: */
123: public long getSize() {
124: return (m_fileSize);
125: }
126:
127: /**
128: * @since 2.1.109
129: */
130: public void setSize(long size) {
131: m_fileSize = size;
132: }
133:
134: /**
135: * Returns the AccessControlList for this page. May return null,
136: * in case there is no ACL defined for this page, or it has not
137: * yet been received.
138: */
139: public AccessControlList getAcl() {
140: return m_accessList;
141: }
142:
143: public void setAcl(AccessControlList acl) {
144: m_accessList = acl;
145: }
146:
147: public void setAuthor(String author) {
148: m_author = author;
149: }
150:
151: /**
152: * Returns author name, or null, if no author has been defined.
153: */
154: public String getAuthor() {
155: return m_author;
156: }
157:
158: /**
159: * This method will remove all metadata from the page.
160: */
161: public void invalidateMetadata() {
162: m_hasMetadata = false;
163: setAcl(null);
164: m_attributes.clear();
165: }
166:
167: private boolean m_hasMetadata = false;
168:
169: /**
170: * Returns true, if the page has valid metadata, i.e. it has been parsed.
171: */
172: public boolean hasMetadata() {
173: return m_hasMetadata;
174: }
175:
176: public void setHasMetadata() {
177: m_hasMetadata = true;
178: }
179:
180: public String toString() {
181: return "WikiPage [" + m_name + ",ver=" + m_version + ",mod="
182: + m_lastModified + "]";
183: }
184:
185: /**
186: * Creates a deep clone of a WikiPage. Strings are not cloned, since
187: * they're immutable.
188: */
189: public Object clone() {
190: WikiPage p = new WikiPage(m_name);
191:
192: p.m_author = m_author;
193: p.m_version = m_version;
194: p.m_lastModified = (Date) m_lastModified.clone();
195:
196: return p;
197: }
198:
199: public int compareTo(Object o) {
200: int res = 0;
201: if (o instanceof WikiPage) {
202: WikiPage c = (WikiPage) o;
203:
204: res = this .getName().compareTo(c.getName());
205:
206: if (res == 0)
207: res = this.getVersion() - c.getVersion();
208: }
209:
210: return res;
211: }
212: }
|