Click here to Skip to main content
Click here to Skip to main content
Go to top

OpenCollective -- The Requirements Management Wiki

, 9 Nov 2004
Rate this:
Please Sign up or sign in to vote.
An article on building a project oriented wiki for software development requirements management

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.

//
// 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:

//
// 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.

//
// 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

Share

About the Author

Tyler Jensen
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? PinmemberTyler Jensen22-Nov-11 18:00 
QuestionFile not found PinmemberSukanya Arumugam9-Oct-06 23:55 
AnswerRe: File not found PinmemberTyler Jensen10-Oct-06 5:24 
GeneralProblems with IIS 6 PinmemberDylan Lewis8-Sep-06 6:13 
GeneralCan't add projects Pinmemberjim_mcdermott22-Mar-06 17:32 
QuestionPage Not Found Pinmembermikeg@vuepoint.com19-Oct-05 3:58 
AnswerRe: Page Not Found PinmemberTyler Jensen19-Oct-05 5:25 
GeneralCan't Compile PinmemberMBonafe3-Oct-05 4:05 
GeneralRe: Can't Compile Pinmemberjar9403-Oct-05 8:59 
GeneralRe: Can't Compile PinmemberMBonafe3-Oct-05 10:59 
GeneralRe: Can't Compile PinmemberMBonafe3-Oct-05 11:36 
GeneralRe: Can't Compile PinmemberTyler Jensen3-Oct-05 16:51 
The connection string in the web.config uses SQL Server authentication. If you're going to use Windows Authentication, you'll have to impersonate a user in the ASP.NET code and setup that user to access the database. I would not recommend that approach. Having a SQL Server authentication user with limited rights to run the stored procedures would be the best means of securing access.
 
Tyler Jensen
Right tools, right methods!
GeneralRe: Can't Compile PinmemberMBonafe4-Oct-05 3:31 
GeneralRe: Can't Compile Pinmemberjar9404-Oct-05 4:41 
GeneralRe: Can't Compile PinmemberMBonafe4-Oct-05 7:46 
GeneralRe: Can't Compile PinmemberTyler Jensen3-Oct-05 16:49 
GeneralGet "Anonymous access not allowed" message on Windows Server 2003 PinmemberWill Irwin31-Aug-05 12:39 
GeneralRe: Get "Anonymous access not allowed" message PinmemberTyler Jensen31-Aug-05 13:00 
GeneralRe: Get "Anonymous access not allowed" message PinmemberWill Irwin1-Sep-05 3:10 
GeneralRe: Get "Anonymous access not allowed" message PinmemberTyler Jensen1-Sep-05 3:26 
GeneralRe: Get "Anonymous access not allowed" message PinmemberWill Irwin1-Sep-05 3:46 
GeneralRe: Get "Anonymous access not allowed" message PinmemberR00tshell29-Nov-05 17:37 
Generalbut it works on XP PinmemberWill Irwin1-Sep-05 11:53 
GeneralRe: but it works on XP Pinmemberjar9403-Oct-05 9:56 
GeneralRe: but it works on XP PinmemberWill Irwin10-Oct-05 2:57 
GeneralDemo Pinmembersheri10027-Jul-05 3:28 
GeneralRe: Demo PinmemberTyler Jensen27-Jul-05 4:45 
GeneralText Formatting PinmemberJames Alef27-Jan-05 5:55 
Generalindent functionality in freetextbox Pinmemberjinesh12324-Jan-05 15:06 
QuestionHow we can print the items in Datagrid to MicrosoftWord format Pinmemberjohn kuruvila23-Nov-04 7:10 
AnswerRe: How we can print the items in Datagrid to MicrosoftWord format PinmemberTyler Jensen23-Nov-04 7:14 
AnswerRe: How we can print the items in Datagrid to MicrosoftWord format Pinmemberjohn kuruvila23-Nov-04 7:26 
GeneralRe: How we can print the items in Datagrid to MicrosoftWord format PinmemberTyler Jensen23-Nov-04 7:36 
GeneralFixing Intra-documents links PinmemberTattva18-Nov-04 10:09 
GeneralRe: Fixing Intra-documents links PinmemberTattva18-Nov-04 10:15 
GeneralRe: Fixing Intra-documents links PinmemberTyler Jensen18-Nov-04 16:21 
QuestionPage not found : Server Setup? PinmemberRye18-Nov-04 1:54 
AnswerRe: Page not found : Server Setup? PinmemberTyler Jensen18-Nov-04 5:35 
GeneralTrace, delete Pinmembershorttrader10-Nov-04 9:35 
GeneralRe: Trace, delete PinmemberTyler Jensen10-Nov-04 14:28 
GeneralFIX YOUR README Pinmemberchavezal2-Nov-04 13:07 
GeneralRe: FIX YOUR README PinmemberTyler Jensen2-Nov-04 16:45 
GeneralAuthentication Pinmemberdshorter127-Oct-04 19:47 
GeneralRe: Authentication PinmemberTyler Jensen28-Oct-04 5:34 
QuestionNew project? Pinmemberdshorter127-Oct-04 16:42 
AnswerRe: New project? PinmemberTyler Jensen28-Oct-04 5:23 
GeneralParser Error Pinsussfaisalazhar27-Oct-04 5:52 
GeneralRe: Parser Error PinmemberTyler Jensen28-Oct-04 5:38 
GeneralHelp for Step 8 Pinmemberdcbrower14-Oct-04 4:46 
GeneralRe: Help for Step 8 PinmemberTyler Jensen14-Oct-04 15:23 

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

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

| Advertise | Privacy | Mobile
Web03 | 2.8.140921.1 | Last Updated 9 Nov 2004
Article Copyright 2004 by Tyler Jensen
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid