001: package net.sf.thingamablog.generator;
002:
003: import java.util.ArrayList;
004: import java.util.Calendar;
005: import java.util.Date;
006: import java.util.Hashtable;
007: import java.util.List;
008: import java.util.Vector;
009:
010: import net.sf.thingamablog.blog.ArchiveRange;
011: import net.sf.thingamablog.blog.BlogEntry;
012: import net.sf.thingamablog.blog.EntryEnumeration;
013: import net.sf.thingamablog.blog.TBWeblog;
014:
015: public class CalendarDayContainer extends ListContainer {
016: static final int TOP_PAGE = 0;
017: /** Constant for an archive page */
018: static final int ARC_PAGE = 1;
019: /** Constant for a category page */
020: static final int CAT_PAGE = 2;
021:
022: private Calendar cal;
023: private static Calendar monthCheck = Calendar.getInstance();
024:
025: private int numDays = 7;
026: private Vector days = new Vector();
027: private Date startingDay;
028: private TBWeblog blog;
029:
030: private TextTag calendarDay = new TextTag("DayOfMonth");
031: private DateTag calendarDate = new DateTag("DateOfDay");
032:
033: private List containers;
034: private DayContainer ifCurrentDay, ifDayHasEntries,
035: ifDayHasNoEntries;
036: private DayContainer ifEmptySpace;
037:
038: private int pageType;
039: private String category;
040: private ArchiveRange archive;
041: private int month = -1;
042:
043: public CalendarDayContainer(TBWeblog blog, Date start, int m) {
044: super ("CalendarDay");
045: _init(TOP_PAGE, blog, start, m);
046: }
047:
048: public CalendarDayContainer(TBWeblog blog, Date start,
049: ArchiveRange arc, int m) {
050: super ("CalendarDay");
051: archive = arc;
052: _init(ARC_PAGE, blog, start, m);
053: }
054:
055: public CalendarDayContainer(TBWeblog blog, Date start, String cat,
056: int m) {
057: super ("CalendarDay");
058: category = cat;
059: _init(CAT_PAGE, blog, start, m);
060: }
061:
062: private void _init(int type, TBWeblog wb, Date start, int m) {
063: blog = wb;
064: month = m;
065: cal = Calendar.getInstance(blog.getLocale());
066: pageType = type;
067: startingDay = start;
068:
069: ifCurrentDay = new IfCurrentDayContainer();
070: ifDayHasEntries = new IfDayHasEntriesContainer();
071: ifDayHasNoEntries = new IfDayHasNoEntriesContainer();
072: ifEmptySpace = new IfEmptySpaceContainer();
073: containers = new ArrayList(4);
074: containers.add(ifCurrentDay);
075: containers.add(ifDayHasEntries);
076: containers.add(ifDayHasNoEntries);
077: containers.add(ifEmptySpace);
078: }
079:
080: public void initListData(boolean asc, Hashtable attribs) {
081: days.removeAllElements();
082: cal.setTime(startingDay);
083: for (int d = 0; d < numDays; d++) {
084: days.add(cal.getTime());
085: cal.add(Calendar.DAY_OF_YEAR, 1);//next day
086: }
087: }
088:
089: public boolean isVisible() {
090: return true;
091: }
092:
093: public List getTags() {
094: return null;
095: }
096:
097: public List getContainers() {
098: Date d = (Date) days.elementAt(currentIndex());
099: ifDayHasEntries.setDay(d);
100: ifDayHasNoEntries.setDay(d);
101: ifCurrentDay.setDay(d);
102: ifEmptySpace.setDay(d);
103:
104: return containers;
105: }
106:
107: public Object getValueForTag(TemplateTag t, int i) {
108: return "";
109: }
110:
111: public int getListDataSize() {
112: return days.size();
113: }
114:
115: private String dayString(Date d) {
116: cal.setTime(d);
117: return cal.get(Calendar.DAY_OF_MONTH) + "";
118: }
119:
120: private BlogEntry getFirstEntryForDay(Date d) {
121: Date d2 = new Date(d.getTime());
122: ArchiveRange arc = new ArchiveRange(d, d2);
123: BlogEntry be = null;
124: try {
125: EntryEnumeration eEnum = blog.getBackend()
126: .getEntriesBetween(blog.getKey(),
127: arc.getStartDate(),
128: arc.getExpirationDate(), true);
129: while (eEnum.hasMoreEntries()) {
130: if (pageType == CAT_PAGE) {
131: BlogEntry e = eEnum.nextEntry();
132: String cats[] = e.getCategories();
133:
134: boolean found = false;
135: for (int i = 0; i < cats.length; i++) {
136: if (cats[i].equals(category)) {
137: be = e;
138: found = true;
139: break;
140: }
141: }
142:
143: if (found)
144: break;//break out of while
145: } else {
146: be = eEnum.nextEntry();
147: break;//we only want this entry
148: }
149: }
150:
151: eEnum.close();
152: } catch (Exception ex) {
153: ex.printStackTrace();
154: }
155:
156: return be;
157: }
158:
159: private boolean hasEntriesForDay(Date d) {
160: //if this cal is on an arc page, we only want the days on the page
161: //to be highlighted in the cal
162: if (pageType == ARC_PAGE) {
163: if (d.before(archive.getStartDate()))
164: return false;
165: if (d.after(archive.getExpirationDate()))
166: return false;
167: }
168:
169: Date d2 = new Date(d.getTime());
170: ArchiveRange arc = new ArchiveRange(d, d2);
171:
172: try {
173: //we have to check if the blog's archive base date is
174: //after the day, otherwise we'll get a calendar with
175: //links to non-existant entries
176: if (blog.getArchiveBaseDate().after(arc.getStartDate()))
177: return false;
178:
179: EntryEnumeration eEnum = blog.getBackend()
180: .getEntriesBetween(blog.getKey(),
181: arc.getStartDate(),
182: arc.getExpirationDate(), false);
183:
184: boolean hasEntries = false;
185: if (pageType == TOP_PAGE || pageType == ARC_PAGE) {
186: //doesn't matter which cat
187: hasEntries = eEnum.hasMoreEntries();
188: } else if (pageType == CAT_PAGE) {
189: while (eEnum.hasMoreEntries())//find first matching cat
190: {
191: BlogEntry be = eEnum.nextEntry();
192: String cats[] = be.getCategories();
193:
194: for (int i = 0; i < cats.length; i++) {
195: if (cats[i].equals(category)) {
196: hasEntries = true;
197: break;
198: }
199: }
200:
201: if (hasEntries)
202: break;
203: }
204: }
205:
206: eEnum.close();
207: return hasEntries;
208: } catch (Exception ex) {
209: }
210:
211: return false;
212: }
213:
214: private abstract class DayContainer extends BasicContainer {
215: private Date day;
216:
217: public DayContainer(String name) {
218: super (name);
219: }
220:
221: public void setDay(Date d) {
222: day = d;
223: }
224:
225: public Date getDay() {
226: return day;
227: }
228:
229: public boolean isCurrentMonth() {
230: monthCheck.setTime(day);
231: return monthCheck.get(Calendar.MONTH) == month;
232: }
233: }
234:
235: private class IfDayHasEntriesContainer extends DayContainer //BasicContainer
236: {
237: //private Date day;
238: private TemplateTag entryIDTag = new TextTag("EntryID");
239: private TemplateTag entryArcPageTag = new TextTag(
240: "EntryArchivePage");
241:
242: public IfDayHasEntriesContainer() {
243: super ("IfDayHasEntries");
244: registerTag(calendarDay);
245: registerTag(calendarDate);
246: registerTag(entryIDTag);
247: registerTag(entryArcPageTag);
248: //day = d;
249: }
250:
251: public Object getValueForTag(TemplateTag tag) {
252: if (tag == calendarDay)
253: return dayString(getDay());
254: if (tag == calendarDate)
255: return getDay();
256: if (tag == entryIDTag) {
257: BlogEntry be = getFirstEntryForDay(getDay());
258: if (be != null)
259: return be.getID() + "";
260: }
261: if (tag == entryArcPageTag) {
262: ArchiveRange ar = blog.getArchiveForDate(getDay());
263: if (ar != null)
264: return blog.getArchiveUrl()
265: + blog.getArchiveFileName(ar);
266: }
267:
268: // no entries/something went wrong
269: return dayString(getDay());
270: }
271:
272: public boolean isVisible() {
273: return hasEntriesForDay(getDay()) && isCurrentMonth();
274: }
275: }
276:
277: private class IfDayHasNoEntriesContainer extends DayContainer//BasicContainer
278: {
279: //private Date day;
280:
281: public IfDayHasNoEntriesContainer() {
282: super ("IfDayHasNoEntries");
283: registerTag(calendarDay);
284: registerTag(calendarDate);
285: //day = d;
286: }
287:
288: public Object getValueForTag(TemplateTag tag) {
289: if (tag == calendarDay)
290: return dayString(getDay());
291: if (tag == calendarDate)
292: return getDay();
293: return "";
294: }
295:
296: public boolean isVisible() {
297: return !hasEntriesForDay(getDay()) && isCurrentMonth();
298: }
299: }
300:
301: private class IfCurrentDayContainer extends DayContainer//BasicContainer
302: {
303: //private Date day;
304:
305: public IfCurrentDayContainer() {
306: super ("IfCurrentDay");
307: }
308:
309: public Object getValueForTag(TemplateTag tag) {
310: return "";
311: }
312:
313: public boolean isVisible() {
314: Calendar c = Calendar.getInstance(blog.getLocale());
315: int dOfy = c.get(Calendar.DAY_OF_YEAR);
316: c.setTime(getDay());
317: return c.get(Calendar.DAY_OF_YEAR) == dOfy
318: && isCurrentMonth();
319: }
320: }
321:
322: private class IfEmptySpaceContainer extends DayContainer {
323: public IfEmptySpaceContainer() {
324: super ("IfEmptySpace");
325: }
326:
327: public Object getValueForTag(TemplateTag tag) {
328: return "";
329: }
330:
331: public boolean isVisible() {
332: return !isCurrentMonth();
333: }
334: }
335: }
|