Click here to Skip to main content
15,860,859 members
Articles / Web Development / ASP.NET
Article

OpenCollective -- The Requirements Management Wiki

Rate me:
Please Sign up or sign in to vote.
4.41/5 (16 votes)
9 Nov 20044 min read 259.9K   1.8K   111   72
An article on building a project oriented wiki for software development requirements management

Image 1

Introduction

A requirements management free source wiki for software development teams that takes advantage of the IHttpModule interface to support the .wiki file extension for each document in the wiki.

Background

I wrote this application for use in the software development teams in which I participate because I was tired of the static nature of Word documents being passed around via email with no way to review and account for revisions and no way to understand the relationships of any given document with others in the project. The first incarnation used a standard plain text wiki editor and syntax for documents but it became clear that general users would not adopt this interface rapidly, so I switched to a free DHTML editor, eliminating all wiki-like editing syntax except the double [[ ]] brackets used for defining links.

Using the code

The code was written using Visual Studio .NET 2003 in C#. It is organized into several projects within the solution. It relies on Windows authentication, so no user management is included except the management of a user's email address to which changes notices are sent. In addition to the source code, you will need to download and install the Data Access Application Block for.NET from Microsoft and the FreeTextBox control by John Dyer.

The code is written to rely on SQL Server 2000 (the SQL scripts for DB create and stored procedures and views are included), but you could certainly run it on MSDE 2000 or any other database. The OpenCollective.Data project would require modifications should you wish to use another database server.

Project Setup

  1. Download and install Microsoft's Data Access Application Block for .NET at http://msdn.microsoft.com/library/en-us/dnbda/html/daab-rm.asp
  2. Download and install FreeTextBox by John Dyer at http://www.freetextbox.com/
  3. Create a virtual directory called OpenCollective.Web and point it to the OpenCollective.Web directory in the source code you just downloaded. Make sure that you turn off anonymous access.
  4. Open the OpenCollective Solution file and correct the references to the two external controls in the OpenCollective.Web and OpenCollective.Edit projects.
  5. Copy the images folder and the two modified javascripts in the FreeTextBox_mods directory included in the source to your IIS wwwroot directory\aspnet_client\FreeTextBox\ directory.
  6. Create a SQL database (SQL Server 2000 or MSDE 2000) and run the SQL scripts in the OpenCollectiveSQL directory: db_create.sql, views.sql and then stored_procs.sql.
  7. Set your connection string in web.config in the OpenCollective.Web project.
  8. Add a mapping to .wiki in your IIS application configuration settings to be handled by c:\windows\microsoft.net\framework\v1.1.4322\aspnet_isapi.dll
  9. Compile and run.

Indexer Setup

The search feature will not work unless the index in the database is populated. There is a console application in the solution called OpenCollectiveIndexer which must be configured either via the app.config and then compile it (or via the OpenCollectiveIndexer.exe.config file directly). You must configure the connection string to your database.

On my installs, I just set a database job to run the OpenCollectiveIndexer.exe file once a day or once every few hours. The OpenCollectiveIndexer will then build your index and your search will then work properly.

Http Module and the .wiki Extension

Implementing an HttpModule is not difficult. In this case, I rewrite the path to the wiki.aspx page which handles all of the web page functionality of this wiki. The original URL is attached as a query string parameter in order to carry the project and document name in the request.

C#
//
// Primary code for the HttpModule
//
   private void context_BeginRequest(object sender, EventArgs e)
   {
      HttpApplication app = (HttpApplication)sender;
      //OpenCollective.web/wiki/Software Docs/wiki.aspx?url=
      //%2fOpenCollective.web%2fwiki%2fSoftware%20Docs
      //%2fHome%2520Page.wiki%3ffiles
      string url = app.Request.Url.PathAndQuery;     
      //?url=%2fOpenCollective.web%2fwiki%2fSoftware 
      //Docs%2fHome%2520Page.wiki%3ffiles
      string qry = app.Request.Url.Query;
      //OpenCollective.web/wiki/Software Docs/wiki.aspx
      string page = app.Request.Url.AbsolutePath.ToLower();
      //OpenCollective.web
      string appPath = app.Request.ApplicationPath.ToLower();
      if( url.ToLower().IndexOf( Config.ContentExtension ) > -1 
       && url.ToLower().IndexOf( "/wiki/" ) > -1 )
      {
         if(qry.StartsWith("?url="))
            app.Context.RewritePath(appPath + "/wiki.aspx" + qry);
         else
            app.Context.RewritePath(appPath + "/wiki.aspx?url=" + 
             app.Context.Server.UrlEncode(url));
      }
   }

Post to the Original Page

The tricky part is in keeping the non-existant .wiki page in the address bar of the browser. The page is rendered by wiki.aspx and would normally post back to the wiki.aspx page. That would ruin the illusion of having a real .wiki page living on the server. The only way that I have been able to figure that out is to have javascript rewrite the action attribute of the form element in the page.

So the body tag is set to run on the server side in which I set the onload attribute as follows:

C#
//
// Change the page to which ASP.NET form will post - code behind
//
   string origPage = appUrlPath + "/wiki/" + wikiName +
     "/" + topicName + ".wiki" + origQry;
   //remap the action tag to the original qry 
   //string to preserve navigation
   pgBody.Attributes["onload"] = "SetAction('" + reqUrl + "');";

And then a simple JavaScript called SetAction rewrites the URL to which the form will post.

JavaScript
//
// client side javascript
//
   function SetAction(url)
   {
      document.forms[0].action = url;
   }

History

While I have written other wikis, this is the first that has taken on so much. I plan to continue to upgrade the code and will post revisions here.

  • 10/08/2004 Version 0.72 released: included previous documents visited menu and index tab which provides full index to all documents in the database.
  • 10/18/2004 Indexer Setup noted: added note to article for setting up and using the OpenCollectiveIndexer.
  • 11/02/2004 Readme updated : updated download readme to reflect article steps. Thanks for the suggestion goes to chavezal, who was understandably frustrated that it was not done before he downloaded.
  • 11/08/2004 Version 0.73 released: added rollback and delete functionality and completed the Files tab with author column in WikiFile table. Download includes updated readme with database upgrade instructions and scripts.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
Since 2001 I've been writing .NET applications in C# and architecting n-tier applications in the enterprise. Before that I worked as a tech writer for nine years. Don't bother doing the math. I'm old. Ever since I laid eyes on my first Commodore PET, I've been a technologist. I've worked in the software world for fifteen years. I started as a technical writer and learned to code from the best engineers as I worked with them in creating technical documentation. It was then that I learned that writing code was more fun and frankly easier than writing about code. I've been doing both ever since. You can visit my blog at http://www.tsjensen.com/blog.

Comments and Discussions

 
QuestionAny interest in an updated version? Pin
Tyler Jensen22-Nov-11 18:00
Tyler Jensen22-Nov-11 18:00 
QuestionFile not found Pin
Sukanya Arumugam9-Oct-06 23:55
Sukanya Arumugam9-Oct-06 23:55 
AnswerRe: File not found Pin
Tyler Jensen10-Oct-06 5:24
Tyler Jensen10-Oct-06 5:24 
GeneralProblems with IIS 6 Pin
Dylan Lewis8-Sep-06 6:13
Dylan Lewis8-Sep-06 6:13 
GeneralCan't add projects Pin
jim_mcdermott22-Mar-06 17:32
jim_mcdermott22-Mar-06 17:32 
QuestionPage Not Found Pin
Member 58180519-Oct-05 3:58
Member 58180519-Oct-05 3:58 
AnswerRe: Page Not Found Pin
Tyler Jensen19-Oct-05 5:25
Tyler Jensen19-Oct-05 5:25 
GeneralCan't Compile Pin
mBonafe3-Oct-05 4:05
mBonafe3-Oct-05 4:05 
GeneralRe: Can't Compile Pin
jar9403-Oct-05 8:59
jar9403-Oct-05 8:59 
GeneralRe: Can't Compile Pin
3-Oct-05 10:59
suss3-Oct-05 10:59 
GeneralRe: Can't Compile Pin
mBonafe3-Oct-05 11:36
mBonafe3-Oct-05 11:36 
GeneralRe: Can't Compile Pin
Tyler Jensen3-Oct-05 16:51
Tyler Jensen3-Oct-05 16:51 
GeneralRe: Can't Compile Pin
mBonafe4-Oct-05 3:31
mBonafe4-Oct-05 3:31 
GeneralRe: Can't Compile Pin
jar9404-Oct-05 4:41
jar9404-Oct-05 4:41 
GeneralRe: Can't Compile Pin
mBonafe4-Oct-05 7:46
mBonafe4-Oct-05 7:46 
GeneralRe: Can't Compile Pin
Tyler Jensen3-Oct-05 16:49
Tyler Jensen3-Oct-05 16:49 
GeneralGet "Anonymous access not allowed" message on Windows Server 2003 Pin
Will Irwin31-Aug-05 12:39
Will Irwin31-Aug-05 12:39 
GeneralRe: Get "Anonymous access not allowed" message Pin
Tyler Jensen31-Aug-05 13:00
Tyler Jensen31-Aug-05 13:00 
GeneralRe: Get "Anonymous access not allowed" message Pin
Will Irwin1-Sep-05 3:10
Will Irwin1-Sep-05 3:10 
GeneralRe: Get "Anonymous access not allowed" message Pin
Tyler Jensen1-Sep-05 3:26
Tyler Jensen1-Sep-05 3:26 
GeneralRe: Get "Anonymous access not allowed" message Pin
Will Irwin1-Sep-05 3:46
Will Irwin1-Sep-05 3:46 
GeneralRe: Get "Anonymous access not allowed" message Pin
R00tshell29-Nov-05 17:37
R00tshell29-Nov-05 17:37 
Generalbut it works on XP Pin
Will Irwin1-Sep-05 11:53
Will Irwin1-Sep-05 11:53 
GeneralRe: but it works on XP Pin
jar9403-Oct-05 9:56
jar9403-Oct-05 9:56 
GeneralRe: but it works on XP Pin
Will Irwin10-Oct-05 2:57
Will Irwin10-Oct-05 2:57 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.