001: // Copyright (C) 2003,2004,2005 by Object Mentor, Inc. All rights reserved.
002: // Released under the terms of the GNU General Public License version 2 or later.
003: package fitnesse.responders;
004:
005: import fitnesse.Responder;
006: import fitnesse.wikitext.widgets.WikiWordWidget;
007: import fitnesse.responders.files.*;
008: import fitnesse.responders.refactoring.*;
009: import fitnesse.responders.editing.*;
010: import fitnesse.responders.run.*;
011: import fitnesse.responders.search.*;
012: import fitnesse.responders.versions.*;
013: import fitnesse.http.Request;
014: import fitnesse.wiki.*;
015: import java.util.*;
016: import java.lang.reflect.*;
017:
018: public class ResponderFactory {
019: private String rootPath;
020: private Map responderMap;
021:
022: public ResponderFactory(String rootPath) {
023: this .rootPath = rootPath;
024: responderMap = new HashMap();
025: addResponder("edit", EditResponder.class);
026: addResponder("saveData", SaveResponder.class);
027: addResponder("tableWizard", TableWizardResponder.class);
028: addResponder("search", SearchResponder.class);
029: addResponder("searchForm", SearchFormResponder.class);
030: addResponder("test", TestResponder.class);
031: addResponder("suite", SuiteResponder.class);
032: addResponder("proxy", SerializedPageResponder.class);
033: addResponder("versions", VersionSelectionResponder.class);
034: addResponder("viewVersion", VersionResponder.class);
035: addResponder("rollback", RollbackResponder.class);
036: addResponder("names", NameWikiPageResponder.class);
037: addResponder("properties", PropertiesResponder.class);
038: addResponder("saveProperties", SavePropertiesResponder.class);
039: addResponder("whereUsed", WhereUsedResponder.class);
040: addResponder("refactor", RefactorPageResponder.class);
041: addResponder("deletePage", DeletePageResponder.class);
042: addResponder("renamePage", RenamePageResponder.class);
043: addResponder("movePage", MovePageResponder.class);
044: addResponder("pageData", PageDataWikiPageResponder.class);
045: addResponder("createDir", CreateDirectoryResponder.class);
046: addResponder("upload", UploadResponder.class);
047: addResponder("socketCatcher", SocketCatchingResponder.class);
048: addResponder("fitClient", FitClientResponder.class);
049: addResponder("deleteFile", DeleteFileResponder.class);
050: addResponder("renameFile", RenameFileResponder.class);
051: addResponder("deleteConfirmation",
052: DeleteConfirmationResponder.class);
053: addResponder("renameConfirmation",
054: RenameFileConfirmationResponder.class);
055: addResponder("raw", RawContentResponder.class);
056: addResponder("rss", RssResponder.class);
057: addResponder("import", WikiImportingResponder.class);
058: addResponder("files", FileResponder.class);
059: addResponder("shutdown", ShutdownResponder.class);
060: addResponder("format", TestResultFormattingResponder.class);
061: addResponder("symlink", SymbolicLinkResponder.class);
062: addResponder("importAndView", ImportAndViewResponder.class);
063: }
064:
065: public void addResponder(String key, Class responderClass) {
066: responderMap.put(key, responderClass);
067: }
068:
069: public String getResponderKey(Request request) {
070: if (request.hasInput("responder"))
071: return (String) request.getInput("responder");
072: else
073: return request.getQueryString();
074: }
075:
076: public Responder makeResponder(Request request, WikiPage root)
077: throws Exception {
078: Responder responder = new DefaultResponder();
079: String resource = request.getResource();
080: if ("".equals(resource))
081: resource = "FrontPage";
082: String responderKey = getResponderKey(request);
083: if (usingResponderKey(responderKey))
084: responder = lookupResponder(responderKey, responder);
085: else {
086: if (resource.startsWith("files/")
087: || resource.equals("files"))
088: responder = FileResponder.makeResponder(request,
089: rootPath);
090: else if (WikiWordWidget.isWikiWord(resource)
091: || "root".equals(resource))
092: responder = new WikiPageResponder();
093: else
094: responder = new NotFoundResponder();
095: }
096:
097: return responder;
098: }
099:
100: private Responder lookupResponder(String responderKey,
101: Responder responder) throws NoSuchMethodException,
102: InstantiationException, IllegalAccessException,
103: InvocationTargetException {
104: Class responderClass = getResponderClass(responderKey);
105: if (responderClass != null) {
106: try {
107: Constructor constructor = responderClass
108: .getConstructor(new Class[] { String.class });
109: responder = (Responder) constructor
110: .newInstance(new Object[] { rootPath });
111: } catch (NoSuchMethodException e) {
112: Constructor constructor = responderClass
113: .getConstructor(new Class[0]);
114: responder = (Responder) constructor
115: .newInstance(new Object[0]);
116: }
117: }
118: return responder;
119: }
120:
121: public Class getResponderClass(String responderKey) {
122: return (Class) responderMap.get(responderKey);
123: }
124:
125: private boolean usingResponderKey(String responderKey) {
126: return !("".equals(responderKey) || responderKey == null);
127: }
128: }
|