- I OpenACS For Everyone
- I.1 High level information: What is OpenACS?
- I.1.1 Overview
- I.1.2 OpenACS Release Notes
- I.2 OpenACS: robust web development framework
- I.2.1 Introduction
- I.2.2 Basic infrastructure
- I.2.3 Advanced infrastructure
- I.2.4 Domain level tools
- I.1 High level information: What is OpenACS?
- II Administrator's Guide
- II.2 Installation Overview
- II.2.1 Basic Steps
- II.2.2 Prerequisite Software
- II.3 Complete Installation
- II.3.1 Install a Unix-like system and supporting software
- II.3.2 Install Oracle 10g XE on debian
- II.3.2.1 Install Oracle 8.1.7
- II.3.3 Install PostgreSQL
- II.3.4 Install AOLserver 4
- II.3.5 Quick Install of OpenACS
- II.3.5.1 Complex Install OpenACS 5.3
- II.3.6 OpenACS Installation Guide for Windows2000
- II.3.7 OpenACS Installation Guide for Mac OS X
- II.4 Configuring a new OpenACS Site
- II.4.1 Installing OpenACS packages
- II.4.2 Mounting OpenACS packages
- II.4.3 Configuring an OpenACS package
- II.4.4 Setting Permissions on an OpenACS package
- II.4.5 How Do I?
- II.4.6 Configure OpenACS look and feel with templates
- II.5 Upgrading
- II.5.1 Overview
- II.5.2 Upgrading 4.5 or higher to 4.6.3
- II.5.3 Upgrading OpenACS 4.6.3 to 5.0
- II.5.4 Upgrading an OpenACS 5.0.0 or greater installation
- II.5.5 Upgrading the OpenACS files
- II.5.6 Upgrading Platform components
- II.6 Production Environments
- II.6.1 Starting and Stopping an OpenACS instance.
- II.6.2 AOLserver keepalive with inittab
- II.6.3 Running multiple services on one machine
- II.6.4 High Availability/High Performance Configurations
- II.6.5 Staged Deployment for Production Networks
- II.6.6 Installing SSL Support for an OpenACS service
- II.6.7 Set up Log Analysis Reports
- II.6.8 External uptime validation
- II.6.9 Diagnosing Performance Problems
- II.7 Database Management
- II.7.1 Running a PostgreSQL database on another server
- II.7.2 Deleting a tablespace
- II.7.3 Vacuum Postgres nightly
- II.8 Backup and Recovery
- II.8.1 Backup Strategy
- II.8.2 Manual backup and recovery
- II.8.3 Automated Backup
- II.8.4 Using CVS for backup-recovery
- II.A Install Red Hat 8/9
- II.B Install additional supporting software
- II.B.1 Unpack the OpenACS tarball
- II.B.2 Initialize CVS (OPTIONAL)
- II.B.3 Add PSGML commands to emacs init file (OPTIONAL)
- II.B.4 Install Daemontools (OPTIONAL)
- II.B.5 Install qmail (OPTIONAL)
- II.B.6 Install Analog web file analyzer
- II.B.7 Install nspam
- II.B.8 Install Full Text Search
- II.B.9 Install Full Text Search using Tsearch2
- II.B.10 Install Full Text Search using OpenFTS (deprecated see tsearch2)
- II.B.11 Install nsopenssl
- II.B.12 Install tclwebtest.
- II.B.13 Install PHP for use in AOLserver
- II.B.14 Install Squirrelmail for use as a webmail system for OpenACS
- II.B.15 Install PAM Radius for use as external authentication
- II.B.16 Install LDAP for use as external authentication
- II.B.17 Install AOLserver 3.3oacs1
- II.C Credits
- II.C.1 Where did this document come from?
- II.C.2 Linux Install Guides
- II.C.3 Security Information
- II.C.4 Resources
- II.2 Installation Overview
- III For OpenACS Package Developers
- III.9 Development Tutorial
- III.9.1 Creating an Application Package
- III.9.2 Setting Up Database Objects
- III.9.3 Creating Web Pages
- III.9.4 Debugging and Automated Testing
- III.10 Advanced Topics
- III.10.1 Write the Requirements and Design Specs
- III.10.2 Add the new package to CVS
- III.10.3 OpenACS Edit This Page Templates
- III.10.4 Adding Comments
- III.10.5 Admin Pages
- III.10.6 Categories
- III.10.7 Profile your code
- III.10.8 Prepare the package for distribution.
- III.10.9 Distributing upgrades of your package
- III.10.10 Notifications
- III.10.11 Hierarchical data
- III.10.12 Using .vuh files for pretty urls
- III.10.13 Laying out a page with CSS instead of tables
- III.10.14 Sending HTML email from your application
- III.10.15 Basic Caching
- III.10.16 Scheduled Procedures
- III.10.17 Enabling WYSIWYG
- III.10.18 Adding in parameters for your package
- III.10.19 Writing upgrade scripts
- III.10.20 Connect to a second database
- III.10.21 Future Topics
- III.11 Development Reference
- III.11.1 OpenACS Packages
- III.11.2 OpenACS Data Models and the Object System
- III.11.3 The Request Processor
- III.11.4 The OpenACS Database Access API
- III.11.5 Using Templates in OpenACS
- III.11.6 Groups, Context, Permissions
- III.11.7 Writing OpenACS Application Pages
- III.11.8 Parties in OpenACS
- III.11.9 OpenACS Permissions Tediously Explained
- III.11.10 Object Identity
- III.11.11 Programming with AOLserver
- III.11.12 Using Form Builder: building html forms dynamically
- III.12 Engineering Standards
- III.12.1 OpenACS Style Guide
- III.12.2 Release Version Numbering
- III.12.3 Constraint naming standard
- III.12.4 ACS File Naming and Formatting Standards
- III.12.5 PL/SQL Standards
- III.12.6 Variables
- III.12.7 Automated Testing
- III.13 CVS Guidelines
- III.13.1 Using CVS with OpenACS
- III.13.2 OpenACS CVS Concepts
- III.13.3 Contributing code back to OpenACS
- III.13.4 Additional Resources for CVS
- III.14 Documentation Standards
- III.14.1 OpenACS Documentation Guide
- III.14.2 Using PSGML mode in Emacs
- III.14.3 Using nXML mode in Emacs
- III.14.4 Detailed Design Documentation Template
- III.14.5 System/Application Requirements Template
- III.15 TCLWebtest
- III.16 Internationalization
- III.16.1 Internationalization and Localization Overview
- III.16.2 How Internationalization/Localization works in OpenACS
- III.16.4 Design Notes
- III.16.5 Translator's Guide
- III.D Using CVS with an OpenACS Site
- III.9 Development Tutorial
- IV For OpenACS Platform Developers
- IV.17 Kernel Documentation
- IV.17.1 Overview
- IV.17.2 Object Model Requirements
- IV.17.3 Object Model Design
- IV.17.4 Permissions Requirements
- IV.17.5 Permissions Design
- IV.17.6 Groups Requirements
- IV.17.7 Groups Design
- IV.17.8 Subsites Requirements
- IV.17.9 Subsites Design Document
- IV.17.10 Package Manager Requirements
- IV.17.11 Package Manager Design
- IV.17.12 Database Access API
- IV.17.13 OpenACS Internationalization Requirements
- IV.17.14 Security Requirements
- IV.17.15 Security Design
- IV.17.16 Security Notes
- IV.17.17 Request Processor Requirements
- IV.17.18 Request Processor Design
- IV.17.19 Documenting Tcl Files: Page Contracts and Libraries
- IV.17.20 Bootstrapping OpenACS
- IV.17.21 External Authentication Requirements
- IV.18 Releasing OpenACS
- IV.18.1 OpenACS Core and .LRN
- IV.18.2 How to Update the OpenACS.org repository
- IV.18.3 How to package and release an OpenACS Package
- IV.18.4 How to Update the translations
- IV.17 Kernel Documentation
- V Tcl for Web Nerds
- V.1 Tcl for Web Nerds Introduction
- V.2 Basic String Operations
- V.3 List Operations
- V.4 Pattern matching
- V.5 Array Operations
- V.6 Numbers
- V.7 Control Structure
- V.8 Scope, Upvar and Uplevel
- V.9 File Operations
- V.10 Eval
- V.11 Exec
- V.12 Tcl for Web Use
- V.13 OpenACS conventions for TCL
- V.14 Solutions
- VI SQL for Web Nerds
- VI.1 SQL Tutorial
- VI.1.1 SQL Tutorial
- VI.1.2 Answers
- VI.2 SQL for Web Nerds Introduction
- VI.3 Data modeling
- VI.3.1 The Discussion Forum -- philg's personal odyssey
- VI.3.2 Data Types (Oracle)
- VI.3.4 Tables
- VI.3.5 Constraints
- VI.4 Simple queries
- VI.5 More complex queries
- VI.6 Transactions
- VI.7 Triggers
- VI.8 Views
- VI.9 Style
- VI.10 Escaping to the procedural world
- VI.11 Trees
- VI.1 SQL Tutorial
I.2.3 Advanced infrastructure
3.1. Serving files: packages, instances, site-map, request processor
Like other Web environments OpenACS can serve familiar file types such as .html and
.gif files from a document root. The OpenACS standard document root is
$OACS_HOME/www. Put a file at $OACS_HOME/www/hello.html and it will appear
at http://yourserver.example.com/hello.html.
OpenACS can also run scripts that set up variables and display them in HTML-like
templates, and also embed templates within other templates via include and master/slave
tags. These topics are covered in the Template system section above. In the sections
below we explore OpenACS more advanced mechanisms for serving files.
3.1.1. Packages
OpenACS is modularized into a set of packages that can be found in the
$OACS_HOME/packages subdirectory. Each package may contain SQL scripts, Tcl
libraries and visible pages, as illustrated in the abbreviated directory layout below:
packages/
acs-admin/ # Core package.
acs-api-browser/ # Core package.
...
forums/ # Forums package.
catalog/ # i18n message catalogs.
forums.info # Package specification file.
lib/ # Re-usable tcl/adp templates.
sql/ # Data model scripts.
tcl/ # Tcl library.
www/ # Package document root.
forum-view.tcl
forum-view.adp
...
www/ # Default document root.
This example draws attention to the forums package, one of dozens of application
packages available for use with OpenACS. Other available packages include a Webbased
files storage system (which also is WebDAV-enabled), calendaring, blog
authoring, assessment, news aggregation, wikis, photo galleries, RSS support, XMLRPC,
SOAP support and many more. A full list of packages can be browsed at
http://cvs.openacs.org/cvs/openacs-4/packages/.
Packages are managed with the OpenACS package manager, which handles upgrades and
tracks versions, dependencies and files much like Linux package managers do.
A view of the Package Manager:
3.1.2. Site map, package instances, request processor
Each package can have its own document root that functions like the default document
root at $OACS_HOME/www. The document root for the forums package is located at
$OACS_HOME/packages/forums/www, as illustrated in the abbreviated directory layout
above.
Package document roots are mapped to visible URLs through a set of database tables,
configuration data, libraries and administration Web pages known collectively as the site
map. Using the site map we can map $OACS_HOME/packages/forums/www to, for
example, http://yourserver.example.com/tclers-forums/. But it gets more interesting,
because the site map allows for re-use of packages at multiple URLs. Hence we can host
a discussion forum for C programmers by adding a new site map entry that maps the
forums package to http://yourserver.example.com/cprogrammers-forums/.
These mappings are referred to in OpenACS-speak as “package instances”. As the
terminology hints, the mapping to /tclers-forums has distinct configuration data from the
mapping to /cprogrammers-forums. Hence the /tclers-forums instance might contain a
Tcl Forum, a Tk Forum and an AOLserver Forum, while the /cprogrammers-forums
instance contains a Small and Fast Forum and a Some Compilation Required Forum.
Because package instances are OpenACS objects, they can be have different permission
settings, so that some users may be able to read and post to the /tclers-forums but not the
/cprogrammers-forums, and vice-versa. The OpenACS object system will be covered in
more detail below.
Before doing that, let’s take a brief diversion into the mechanics of how files are served,
Requests for OpenACS Web pages pass through a Request Processor, which is a global
filter and set of Tcl procs that respond to every incoming URL reaching the server. The
following diagram summarizes the stages of the request processor assuming a URL
request like http://yourserver.example.com/notes/somepage.adp.
The stages are:
1. Search the Site Map, to map the URL to the appropriate physical directory in the
filesystem.
2. Authenticate the user.
3. Authorize the possible specific defined permissions that the site node might have.
4. Process the URL, search for the appropriate file and server it.
3.2. Object system and services
Deep in OpenACS’ design is the notion that one should be able to build common services
that are useful across the toolkit. Hence a commenting engine ought work equally well
for blog posts as it does for images in photo galleries. Furthermore, any sufficiently
interesting piece of data in the system ought to carry basic accounting information with it,
such as who created it and timestamps for creation and modification.
The OpenACS object system addresses these requirements by defining a central SQL
table called acs_objects and giving this table a column for each generic bit of
information. Most importantly, acs_objects has a primary key column, named
object_id. This primary key is the anchor on which all other information about an
object rests. If the object is a blog post, the post body might live in a separate table
blog_posts whose primary key, post_id, is a reference back to
acs_objects.object_id. If the object is an image, it might contain a binary field
containing the image bits or alternatively a text field pointing to the physical storage
location of the image file, and also an image_id primary key that is a reference back to
acs_objects.object_id. Since each blog post and each image has a row in
acs_objects, comments on either can be inserted into a table that contains an
on_what_object column that points back to the object_id.
Any data that participates in the OpenACS object system can tell us its title, what kind of
object it is, when it was created and by whom. It can also be assigned permissions,
commented on, categorized, have files attached to it, and benefit from any other objectlevel
services that we can dream up.
The OpenACS object system, site map and instances are the foundation of OpenACS.
More information about these can be found at the following URLs:
http://openacs.org/doc/openacs-5-1/request-processor.html
http://openacs.org/doc/openacs-5-1/subsites.html
http://openacs.org/doc/openacs-5-1/packages.html
3.3. Developer Support
OpenACS provides a set of developer support tools to improve the development process,
debugging, testing, and searching of the API. These tools enhance many of the day to day
activities of the developers.
The functionalities that developer support provides are:
1. Time to serve a given request. Good for performance problem detection and
improvement.
2. Tracing database calls involved in a given request, where the involved queries
are located, what was the actual query executed and how long did it take to return
the data. Useful for improving queries that might be slowing your application
performance.
3. Tracing scripts involved in serving a given request. Showing the time taken to
perform a given script, its location, code, and error that it might bring. Especially
important for tuning applications performance.
4. ADP reveal, to show in the browser which part of the rendered html belongs to a
given script.
5. User Switching, as an admin account switch easily to another account to
reproduce and test actions, and then simply go back to the administrator account.
6. OpenACS Shell, which is a Tcl shell with all the API available within OpenACS,
in order to simplify the testing of small pieces of Tcl within your browser.
An screenshot of the ADP Reveal:
The Tracing Script view, information shown at the bottom of each server page:
OpenACS also provides an implicit mechanism to document any script or procedure that
you might create, and then display and search that scripts or procedures, its documented
information, expected inputs and outputs, and its code though a Web interface at your
own OpenACS installation, like yourserver.com/api-doc, have a look here:
http://openacs.org/api-doc/
Finally, using the package manager, the Web server can be instructed to reload Tcl
library files without a restart of the webserver, and keep watching them for subsequent
changes, which is quite useful for the developers.
3.5. Testing Framework
OpenACS provides a full featured testing framework to create, maintain and run
automated test in your applications. The main characteristics of it are:
- Define tests, as smoke, config, database, web, etc. in a per package basis. And
with the API provided by the test framework you have a UI to check results, and
log events when executing a test case.
- Test your application at the proc level, using specific Test API to define and
check if your procs are behaving as expected.
- Test your end-user web scripts using a third party tool, such as tclwebtest or
perl::mechanize, to test the end-user pages automatically simulating end user
navigation (clicks) through the application and finally check the outpus using the
Test API.
- Define procedures that many tests might call, in order to automate similar
activities that need to be done before running a test case.
- Rollback the generated data after executing a test case.
- Rollback code section, to perform actions that will rollback the actions done by
running a test case, specially designed for those situations where you cannot
encapsulate the database calls to rollback, like when you are calling the scripts
with an automated tool.
- Run tests by installation, package or by choosing an specific test case.
3.6. Internationalization
OpenACS provide a facility to internationalize its user interface texts (not the data stored)
to any desired language, right now OpenACS is translated to more than 20 languages.
The end users can change the language user interface by simply selecting it. Each
OpenACS package can be internationalized separately, maintaining a message keys
catalog, which consist in a specific XML DTD where each possible user interface
message is stored as a message key, and then translated to a given language. Although all
the data is stored in the xml file, everything is also stored in the database, for
performance reasons and to facilitate the edition of the message keys OpenACS provides
a simple UI for translation of message key. And exists an official translation server for
the community at: translate.openacs.org.
3.7. Callbacks
The callbacks are a simple method to execute procedures stored in each of the possible
installed packages that a given OpenACS installation might have. The objective is to give
the core applications to invoke in non-core packages that may or may not be installed, but
without cluttering core with code that belongs to other packages, making possible to have
independence among packages.
The architecture work as
-> Core proc for removing user
-> Invoke callbacks based on what's installed
-> Package A logic for removing user
-> Package B logic for removing user
-> Package C logic for removing user
...
-> Core logic for removing user
as opposed to this architecture
-> Package A logic for removing user
-> Call core proc for removing user
-> Package B proc for removing user
-> Package B logic for removing user
-> Call core proc for removing user
Callback implementations would be declared like this:
Where ad_proc is a wrapper of the normal TCL proc, which mainly gives autodocumentation
structure for any procedure.
Core uses tcl introspection to find which callbacks exist and invokes them. eg
foreach proc [info procs ::callback::module::op::impl::*] {
$proc $args
}
To invoke a callback you do this
callback [ -catch ] [ -impl impl ] callback [ args... ]
The callbacks is a great improvement in order to keep simple yet separated, coherent and
modular a web framework that constantly evolves and grows. The larger goal is to
promote reuse of standard pages and functions by removing the need to create perpackage
versions of these.