108 lines
3.6 KiB
Java
Executable File
108 lines
3.6 KiB
Java
Executable File
/*
|
|
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public License
|
|
* as published by the Free Software Foundation; either version 2.1 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
*/
|
|
package com.arsdigita.bebop.demo;
|
|
|
|
import com.arsdigita.bebop.page.BebopMapDispatcher;
|
|
import com.arsdigita.bebop.Link;
|
|
import com.arsdigita.bebop.Page;
|
|
import com.arsdigita.util.UncheckedWrapperException;
|
|
import java.lang.reflect.Method;
|
|
import java.util.Iterator;
|
|
import java.util.Map;
|
|
import java.util.TreeMap;
|
|
import org.apache.log4j.Logger;
|
|
|
|
|
|
/**
|
|
* A dispatcher that looks for "buildPage*" methods, invokes them,
|
|
* and constructs an index page with links automatically.
|
|
*
|
|
* @version $Id: AutoDispatcher.java 2089 2010-04-17 07:55:43Z pboy $
|
|
*/
|
|
public class AutoDispatcher extends BebopMapDispatcher {
|
|
|
|
private static final Logger s_log =
|
|
Logger.getLogger(AutoDispatcher.class);
|
|
|
|
public AutoDispatcher() {
|
|
setUp(); // set up map & index
|
|
}
|
|
|
|
/** Set up map by reflection and index page.
|
|
* For use from derived classes; 'this' indicates where builPage_* are.
|
|
*/
|
|
protected void setUp()
|
|
{
|
|
setUp(this);
|
|
}
|
|
|
|
/**
|
|
* The constructor Instantiates the subsite url->page mapping.
|
|
* Unlike a typical Dispatcher constrctor, this one invokes any
|
|
* method starting in "buildPage" in the class of the child and puts the
|
|
* returned page in the map. Also creates an index page with
|
|
* links to all pages in the map. This makes adding another page
|
|
* as easy as writing its build method; the rest is automated. */
|
|
public void setUp(Object child) {
|
|
Map m = new TreeMap();
|
|
|
|
final String prefix = "buildPage";
|
|
Method method[] = child.getClass().getDeclaredMethods();
|
|
for (int i = 0; i < method.length; i++) {
|
|
String name = method[i].getName();
|
|
if (name.startsWith(prefix)) {
|
|
try {
|
|
m.put(name.substring(prefix.length()),
|
|
method[i].invoke(null, new Object[0]));
|
|
} catch (Exception ex) {
|
|
throw new UncheckedWrapperException(name, ex);
|
|
}
|
|
}
|
|
}
|
|
|
|
// pages added above will show up in the index
|
|
Page index = buildIndexPage(m.entrySet().iterator(),
|
|
"Index for " + child.getClass().getName());
|
|
m.put("", index);
|
|
m.put("index", index);
|
|
// any pages added below won't be listed.
|
|
|
|
setMap(m);
|
|
}
|
|
|
|
/**
|
|
* @return a Bebop page for the index
|
|
*/
|
|
private static Page buildIndexPage(Iterator entries, String title) {
|
|
Page p = new Page(title);
|
|
while (entries.hasNext()) {
|
|
Map.Entry entry = (Map.Entry) entries.next();
|
|
p.add(
|
|
new Link(
|
|
((Page) entry.getValue()).getTitle(),
|
|
(String) entry.getKey()
|
|
)
|
|
);
|
|
}
|
|
|
|
p.lock();
|
|
return p;
|
|
}
|
|
}
|