The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

OpenInteract2::Manual::Changes - Significant changes to OpenInteract2

NOTE

Each package maintains its own changelog. These changes are not mentioned here except to note the package version changes with successive OI2 releases.

Also: items marked with 'OIN-\d+' are references to the JIRA issue tracking system at:

  http://jira.openinteract.org/

You can see the history for a particular issue like this:

  http://jira.openinteract.org/browse/OIN-34

THE FUTURE

OI2 is currently at 1.99_06, equivalent to 2.0 beta 6. The next release should be a release candidate (1.99_07/2.0 RC1) -- its new features should only be minor; everything else should be bugfixes or pushed off to 2.01.

1.99_06 (2.0 beta 6), 18 March 2005

Upgrade Notes

The following all apply to an existing server configuration -- if you're creating a new site you don't need to worry.

  1. Modify how two 'action_info' keys are set:

     OLD:
     
     [action_info none]
     redir = page
     
     [action_info not_found]
     redir = page
     
     NEW:
     
     [action_info]
     none      = page
     not_found = page
  2. Optional - add the following server keys:

     [login]
     ...
     initial_login_expires = 24h
  3. In your $WEBSITE_DIR/conf/startup.pl change the following:

      use OpenInteract2::Config::Base;
        to
      use OpenInteract2::Config::Bootstrap;
    
      my $BASE_CONFIG_FILE = '$WEBSITE_DIR/conf/base.conf';
        to
      my $BASE_CONFIG_FILE = '$WEBSITE_DIR/conf/bootstrap.ini';
    
      my $base_config = OpenInteract2::Config::Base->new({ 
          filename => $BASE_CONFIG_FILE }); 
        to
      my $base_config = OpenInteract2::Config::Bootstrap->new({ 
          filename => $BASE_CONFIG_FILE }); 

Major Changes

  • OIN-129 - Be able to create a simple application with Create, Remove, Update, Display and Search functionality based on a database table -- see OpenInteract2::Manage::Package::CreatePackageFromTable, or run:

      oi2_manage task_info --task=easy_app
  • OIN-121 - You can now create an OI2 website or package without an external 'source_dir' -- all our resources are held as data in class files under OpenInteract2::Brick, and the parent class has methods to write these resources to the filesystem after an optional initial evaluation.

    Core package files, previously included as .zip files, are now stored as bricks using Base64 encoding.

  • OIN-72 - OpenInteract2 packages can now be built into CPAN-distributable applications.

  • OIN-141: Create little objects and an organizer to figure out which OI2::Action object to run based on the URL (or whatever). This allows very simple customization so you can create your own URL-to-action mappings. See OpenInteract2::ActionResolver for more.

  • OIN-115 - Break OpenInteract2::Setup into individual tasks and create a framework so that new setup tasks will get discovered at runtime. We get a name from each task and its dependencies and determine the order they should be run. This also allows very simple customization so you can initialize custom services at server startup. See OpenInteract2::Setup for more information.

  • OIN-54 - Make configuration of your database easier; it's now about as simple as a DBI->connect() call...

  • OIN-136 and OIN-137: replace 'base.conf' with 'bootstrap.ini' and 'package.conf' with 'package.ini'. INI is not only OI2's preferred configuration format, it's the only configuration format. Sites using 'base.conf' have to upgrade -- a 15-second job -- as do packages using 'package.conf', but there's a script 'translate_package_to_ini' in the 'script/' directory to help with the latter.

  • OIN-135: OI2 can now parse additional URL parameters (aka, REST parameters) into action parameters. So you can use something like:

      http://www.foo.com/news/display/39

    instead of:

      http://www.foo.com/news/display/?news_id=39

    or:

      http://www.foo.com/news/archive/2005/03

    instead of:

      http://www.foo.com/news/archive/?year=2005&month=03

    Further, mapping of REST param to action param is done through configuration -- see property 'url_additional' under OpenInteract2::Action.

  • Add initial support for FastCGI -- use /cgi-bin/oi2.fcgi and see conf/httpd_cgi_solo.conf for tiny configuration change.

  • OIN-35: Severe errors are now written to the filesystem rather than the database, and the error browser (in base_error package) was totally rewritten.

  • OIN-143: Read localization messages from PO/MO files in addition to our custom format.

Minor Changes

See all the JIRA issues raised during this release just in case we missed some:

http://jira.openinteract.org/secure/ReleaseNote.jspa?projectId=10010&styleName=Html&version=10036

OpenInteract2::Action

OpenInteract2::Action::CommonSearch

  • OIN-122: Set 'total_hits', 'total_pages' and 'page_num' even if you're not using paged search results.

OpenInteract2::Action::CommonUpdate

  • Pass $object and \%old_data to _update_post_action() callback rather than forcing the user to get them from parameters.

OpenInteract2::ActionResolver

OpenInteract2::ActionResolver::NameAndTask

OpenInteract2::ActionResolver::NotFoundOrEmpty

OpenInteract2::ActionResolver::UserDir

  • OIN-141: Break down the process of matching a URL (or other identifier) with the action object that generates its content. The parent class instantiates all classes under its namespace into a chain of responsibility. Each link looks at the URL (or other data) and decides if it should create an action from it; if not the next link is invoked.

OpenInteract2::App

  • OIN-72: Added base class for package classes to do installation and report other metdata about the package. (Part of making them CPAN-installable.)

OpenInteract2::Config

  • Add author_names() and author_emails() to pull the names and emails from the 'author' key.

OpenInteract2::Context

  • OIN-26: Add language_handle() method, useful for when we don't have a request available from which to pull the language handle. (See OpenInteract2::I18N for what this means.)

  • OIN-54: Add assign_datasource_config() so you can create/modify datasource configurations after the initial configuration.

  • Add 'last_day_of_month' as option for create_date()

OpenInteract2::CreateSecurity

  • OIN-140: Move class from base_security package; modify it to create action security.

OpenInteract2::I18N::Initializer

  • OIN-143: Using Locale::Maketext::Lexicon, read localization keys from gettext (PO/MO) files in addition to our custom format. A package does not have to standardize on a format and can have messages in multiple formats.

OpenInteract2::Manage

OpenInteract2::Manage::Package::Export

    OIN-111: Ensure that every package we try to export gets a useful error message if the export fails.

OpenInteract2::Manage::Website::CleanOrphanedUsers

  • OIN-91: New management task to remove all users whose 'removal_date' has passed. This means they've registered for an account but haven't logged in.

OpenInteract2::Manage::Website::Create

    OIN-127: Allow installation of a website into an existing directory, but first check whether the directory holds any of our expected subdirectories. If it does we assume we're installing over another site and die.

OpenInteract2::Manage::Website::CreateSecurity

OpenInteract2::Manage::Website::CreateSecurityForAction

OpenInteract2::Manage::Website::CreateSecurityForSPOPS

  • OIN-140: Create a new management task to assign security to an action; consolidate common security creation code into parent task.

OpenInteract2::Manage::Website::InstallPackageStructure

OpenInteract2::Package

  • OIN-117: When installing a package to a website copy the package configuration files to $WEBSITE_DIR/conf/$PACKAGE. This becomes the permanent home for configuration and package upgrades WILL NOT overwrite these files. If the upgraded configuration files are different they're copied to an 'updates/' subdirectory and identified with the package version they came from.

  • OIN-102: Ensure that if any modules declared in the package.conf fail we don't read in any perl modules. The errors found when bringing in the module with a bad 'use' are confusing.

  • OIN-105: Add check to package validation to ensure that all message files are formatted so we can extract a language from them.

  • Add simple method name_as_class() to display the package name with a leading uppercase letter and camel-case internally.

  • Add method copy_contents_to() for copying the contents of a package to a directory, reporting what files it copied and what files were not because they were identical.

  • OIN-72: Remove method get_doc_files() since we're moving doc/$package.pod to OI2::App::$Package

OpenInteract2::ParamContainer

  • Add simple class to provide storage and manipulation of arbitrary parameters. (Previously four separate classes had implementations of a 'param' method...)

OpenInteract2::Request

  • OIN-141: Move URL parsing into action/task to OpenInteract2::ActionResolver::NameAndTask; also remove 'action_name' and 'task_name' properties.

  • Use OpenInteract2::ParamContainer for param() and related methods.

  • Add param_boolean() to return a 'TRUE' if a parameter value is defined, 'FALSE' if not. (Similar to param_toggled(), but it seems like 'TRUE' and 'FALSE' are boolean literals in many databases.)

  • Remove _find_custom_languages() and the ability to specify a class to do so. Overdesign, and you can do it other ways.

  • Renamed internal and previously undocumented method from find_language() to assign_languages() and allow optional override values to be passed in. This lets the language be assigned later in the process.

OpenInteract2::Setup

(Also see the notes under Major Changes for 1.99_06 above.)

OpenInteract2::SPOPS

  • OIN-154: override object_description() from SPOPS and add our own URL-handling features; also add 'date' so that objects can expose a created-on/updated-on date and make generic object listings more useful.

  • OIN-38: get rid of object keys

OpenInteract2::SQLInstall

  • OIN-134: Allow install_structure() to optionally take one or more files as arguments. If specified the installer will only process files by that name. This allows for incremental upgrades where you add tables/sequences.

OpenInteract2::TT2::Plugin

  • Added as_boolean() for evaluating a boolean value in any of its case-insensitive forms - 't', 'true', 'y', 'yes', '1'.

  • Added as_boolean_label() for evaluating a boolean value in any of its case-insensitive forms - 't', 'true', 'y', 'yes', '1' -- and returning a localized human label as a result.

OpenInteract2::Util

  • Added digest_content( $content ) to calculate the MD5 digest of arbitrary data.

  • Added is_same_file( $path_a, $path_b ).

  • Move find_factry_subclasses() here from OpenInteract2::Manage and modify it to assume @INC in unless other directories given.

  • Move code from OpenInteract2::Action (where we determined cache expiration) to time_duration_in_seconds().

Package Updates

The following packages have been updated since the last version. See the 'Changes' file for each to view the modifications:

   OpenInteract     1.99_05 -> 1.99_06
   -----------------------------------
   base:            2.11    -> 2.15
   base_box:        2.17    -> 2.20
   base_error:      2.10    -> 3.02
   base_group:      2.16    -> 2.19
   base_page:       2.28    -> 2.31
   base_security:   2.18    -> 2.21
   base_template:   3.15    -> 3.17
   base_theme:      2.10    -> 2.13
   base_user:       2.35    -> 2.40
   comments:        1.18    -> 1.23
   full_text:       2.58    -> 2.61
   lookup:          2.07    -> 2.09
   news:            2.20    -> 2.24
   object_activity: 2.11    -> 2.13
   system_doc:      2.08    -> 2.10
   whats_new:       2.10    -> 2.12

1.99_05 (2.0 beta 5), 5 Dec 2004

Upgrade Notes

The following keys were added to the server configuration with these default values. These are mandatory.

 [Global]
 timezone              = America/New_York
  
 [fulltext]
 default = DBI
 
 [fulltext DBI]
 class           = OpenInteract2::FullTextIndexer::DBI
 datasource      = main
 column_group    = listing
 min_word_length = 3
 max_word_length = 30
 index_table     = full_text_index
 class_map_table = full_text_index_class
 stem_locale     = en
  
 [system_class]
 setup            = OpenInteract2::Setup
 ini_reader       = OpenInteract2::Config::Ini

 [request]
 apache     = OpenInteract2::Request::Apache
 apache2    = OpenInteract2::Request::Apache2
 cgi        = OpenInteract2::Request::CGI
 lwp        = OpenInteract2::Request::LWP
 standalone = OpenInteract2::Request::Standalone

 [response]
 apache     = OpenInteract2::Response::Apache
 apache2    = OpenInteract2::Response::Apache2
 cgi        = OpenInteract2::Response::CGI
 lwp        = OpenInteract2::Response::LWP
 standalone = OpenInteract2::Response::Standalone

We've also moved the configuration for where Template Toolkit should store its compiled templates; remove:

 [dir]
 ...
 cache_tt      = $WEBSITE/cache/tt

and add:

 [content_generator TT]
 ...
 compile_dir           = cache/tt

(If you don't do this everything will still work as a default is provided for you and the old value is ignored.)

Also: you no longer declare observer-to-action (previously filter-to-action) mappings in 'server.ini'. Both the observer declarations and mapping observers to actions go into a new 'observer.ini' file. This replaces 'filter.ini' as filters are just a particular type of observer. See OpenInteract2::Observer for more information.

Major Changes

  • Searching framework overhauled. Some of the classes are now in the main distribution (OpenInteract2::FullTextIndexer, OpenInteract2::FullTextIterator and OpenInteract2::FullTextRules) and the 'full_text' package now contains one implementation of the search engine. This opens the door for someone -- maybe you! -- to write a 'full_text_plucene' or something similar.

  • New management task OpenInteract2::Manage::Website::ExportData will export data into SQL statements, XML or different types of Perl data structures, including one that's used in the OI2 data import process. So you can move data between databases really easily.

  • New management task OpenInteract2::Manage::Website::UpdatePackageFromWebsite allows you to work in short iterations on a 'live' package -- one deployed to a website -- then port those changes back to your development package in one fell swoop.

  • More extension capabilities: you can now define a setup class (in place of OI2::Setup) and an INI reader (in place of OI2::Config::Ini) to be set in the server configuration under 'system_class'.

  • All common actions that modify persistent data (OpenInteract2::Action::CommonAdd, OpenInteract2::Action::CommonUpdate, OpenInteract2::Action::CommonRemove) now throw pre and post storage observations ('pre add', 'post add', etc.). So you can attach external observers to an action to, for instance, post a new use.perl journal entry with the contents of the object just created, tag the just-modified object with metadata, etc.

  • Default session manager now uses the filesystem rather than the database.

  • Request and Response implementations are now listed in the server configuration rather than just in code.

  • Since filters are just specific instances of observers we changed all references from 'filter' to 'observer' -- OpenInteract2::Filter is now OpenInteract2::Observer, and the package configuration key 'filter' is now 'observer'.

  • Lots of trying to make the system easier to understand, mostly at a developer-level. This includes cleaning up interfaces, making common usages easier, etc.

  • Lots of changes to the packages included in the distribution.

Minor Changes

OpenInteract2::Action

  • Be able to use shorthand to specify minutes, hours or days in 'cache_expire' key.

  • If you use a single value for 'cache_expire' it will be applied to all tasks within the action.

  • OIN-47: Expose the action's package via the 'package_name' method and its associated OpenInteract2::Package object via the 'package' method.

  • Add 'message_from_key_or_param()' shortcut method.

  • If a 'template_source' is specified in an action configuration and it's not keyed by task, just assume the author knows what they're doing and use that template for all tasks in the action. This allows you to more easily tie a template to a task in configuration:

     [myaction]
     class = Foo::Bar
     task  = baz
     template_source = mypkg::mytemplate

    It also means you can use the same template for all tasks, which can be useful. (For instance, if you have a 'mysearch' action and each task allows you to specify different parameters ['by_name', 'by_date', 'by_city', etc.], you may want all the task results to go to the same template.)

  • Ensure 'cache_expire' is treated as a property in clone() and copied over.

  • If an action is caching content and we get a cache hit, issue a 'cache hit' observation so observers can react to it.

  • Add shortcut methods add_error(), add_error_key(), add_status(), and add_status_key() -- so you can replace:

      $self->param_add( error_msg => $self->_msg( 'some.key', $msg_param ) );
      $self->param_add( status_msg => $self->_msg( 'some.key', $msg_param ) );

    with either:

      $self->add_error( "You messed up!" );
      $self->add_status( "Things are great!" );
     

    or (if you're using localized messages):

      $self->add_error_key( 'some.l10n.key', $msg_param );
      $self->add_status_key( 'some.l10n.key', $msg_param );

    Also added clear_error() and clear_status(), which delete all error/status messages.

OpenInteract2::Action::Common

  • OIN-43: When retrieving the ID field for the object we're working on also check to see whether any mapped field is also available. (Mostly used for LDAP.)

OpenInteract2::Action::CommonAdd

  • Add 'pre add' and 'post add' observations fired from the action in the add() method.

  • Define 'c_task' action parameter to the task originally invoked.

OpenInteract2::Action::CommonDisplay

  • Define 'c_task' action parameter to the task originally invoked.

OpenInteract2::Action::CommonRemove

  • Add 'pre remove' and 'post remove' observations fired from the action in the remove() method.

  • Define 'c_task' action parameter to the task originally invoked.

OpenInteract2::Action::CommonSearch

  • OIN-63: Pass the right parameters to OpenInteract2::ResultsManage...

  • Small bit of refactoring to make the search() easier to follow.

  • Define 'c_task' action parameter to the task originally invoked.

OpenInteract2::Action::CommonUpdate

  • Add 'pre update' and 'post update' observations fired from the action in the update() method.

  • Define 'c_task' action parameter to the task originally invoked.

OpenInteract2::Config::Ini

  • Introduce a small but very useful syntax change: you can now declare multiple values in a single line by prepending your key with a '@' and a separation character. So instead of:

     [me]
     child = Bart
     child = Lisa
     child = Maggie

    You can say:

     [me]
     @,child = Bart, Lisa, Maggie

    or:

     [me]
     @|child = Bart | Lisa | Maggie

OpenInteract2::Config::IniFile

  • If the context is available check it for a custom INI reader class and use it if available. This affects 'read_config()', 'write_config()' and the newly created 'ini_factory()' which just generates a new instance of the class.

  • Another small but useful change: you can now have '@INCLUDE' directives to bring in configuration from a separate file. This can make for more manageable configuration files.

OpenInteract2::Config::Initializer

  • Add new observer '_spops_set_hasa' to munge the 'has_a' section within an SPOPS object and allow for more complex configuration. Thanks to Antti for the spot.

OpenInteract2::Config::Package

  • Change all 'filter' references to 'observer'.

OpenInteract2::Config::PackageChanges

  • Add 'write_config()' so we can write a changelog as well as read one.

OpenInteract2::Config::Readonly

  • Modify to be used as object rather than series of class methods. Old methods are still supported but are deprected, and any usage will issue a 'warn' telling you what to change and where.

OpenInteract2::Config::TransferSample

  • Track copied, skipped (due to read-only status) and same files, which we now check by comparing the MD5 checksum for the source and destination. These are all available as properties or, in the right context, as return values from run() or transfer().

OpenInteract2::Context

  • Add 'lookup_fulltext_config()' to return the 'fulltext' configuration data.

  • Add 'fulltext_indexer()' to find and instantiate the relevant fulltext indexing object. (Should have as parent OpenInteract2::FullTextSearch, found in the 'full_text' package.

  • In create() move observer initialization until after the actions are read in.

  • OIN-39: Add initialization of setup custom class and calls to 'run_pre_process()' and 'run_post_process()' as setup hooks.

  • OIN-40: Add properties 'timezone' and 'timezone_object', and add 'create_date()' as a factory for DateTime objects with the given timezone. (Allow 'from_epoch' as well param as standard DateTime constructor params.)

  • Add 'lookup_box_config()' to return the global box configuration.

OpenInteract2::Filter::AllCaps

  • Added sample filter to change content to all caps.

OpenInteract2::FullTextRules

  • Extract rules from 'full_text' and move to distribution.

OpenInteract2::Manage

  • Move internal method from OI2::Manage::CreateSourceDirectory for pulling information out of a File::DirSync object and putting it into a status message.

  • Add internal methods '_fail()' and '_ok()' for adding status messages more easily. (All of the internal management tasks were adapted to use these where possible.)

OpenInteract2::Manage::Website

OpenInteract2::Manage::Website::Create

OpenInteract2::Manage::Website::ExportData

OpenInteract2::Manage::Website::TestLDAP

  • OIN-13: Fix typo to allow task to run properly.

OpenInteract2::Manage::Website::ThemeInstall

  • OIN-104: Assign the default theme as the parent.

OpenInteract2::Manage::Website::UpdatePackageFromWebsite

  • OIN-4: Add new task to aid development by allowing developers to modify package in-place on website until everything is working, then sync those changes back to the development directory for source control commit (or whatever).

OpenInteract2::Manage::Website::Upgrade

  • Display the copied/skipped/same status for all files copied from the 'sample/' directory.

OpenInteract2::Manual::LDAP

  • OIN-13: Update to reflect 2.x configuration keys and other changes.

OpenInteract::Response and OpenInteract::Request

  • OIN-82: Parent class no longer has a notion of the 'current' request/response. Just get them from the CTX object.

  • OIN-68: Move all type-to-class mappings from code into server configuration. This makes it easy to use your custom implementations where necessary -- you can remap 'apache' to 'OI2::Request::Apache::MyCustom.

OpenInteract::Response

  • OIN-56: Add 'charset' property and a 'content_type_header' method which adds the charset (if specified) to the content type.

OpenInteract2::Response::*

  • OIN-48: ensure we store the session before doing a redirect

  • OIN-56: use the 'content_type_header' for the 'Content-Type' as it includes the charset if specified.

OpenInteract2::Response::CGI

  • OIN-8: Fix CGI response to generate redirects properly, thanks to Salve Nilsen for the patch.

OpenInteract2::SessionManager

  • Explicitly ->delete() empty sessions, otherwise you get a whole bunch of entirely unnecessary zero-length files/entries in your session store.

OpenInteract2::SessionManager::File

  • Allow relative directory paths in the 'Directory' and 'LockDirectory' parameters. If there is no leading directory indicator we prepend the website directory.

OpenInteract2::SPOPS

  • OIN-104: In get_security_scopes(): if the request is not defined return empty scopes.

OpenInteract2::SQLInstall

  • OIN-21: Add 'dbupdate' and 'dbdelete' functions to data installation. (You must have SPOPS 0.87+ to use this, so the dependency in Makefile.PL/Build.PL was also changed.)

OpenInteract2::TT2::Plugin

  • OIN-79: Pass value of parameter 'do_not_escape' from template invocation to OpenInteract2::URL methods

  • Add add_params_to_url() which just delegates to the new method in OpenInteract2::URL.

OpenInteract2::URL

  • In create(), don't escape or add contextualization to URLs that begin with an 'http:'.

  • Add add_params_to_url( $url, \%params ) which appends the escaped key/value pairs from \%params to $url. Note that $url is not modified in any way -- it's assumed to be contextualized and escaped.

  • OIN-79: in addition to escaping query argument values, also escape the query argument names and the base URL.

OpenInteract2::Util

  • Add digest_file() as shortcut to calculate the hex MD5 digest of a file's contents.

sample/website/filter.ini

  • Removed in favor of 'observer.ini'; you can delete it if you like.

sample/website/observer.ini

  • New file used for registering all observers and mapping them to actions.

sample/website/server.ini

  • Add 'fulltext' section to specify the default full-text indexer.

  • Add 'fulltext.DBI' section to specify the class name and other configuration parameters for the default full-text indexer.

  • OIN-39: Add 'system_class.setup' to allow custom setup class registration

  • OIN-40: Add 'Global.timezone' to define server-wide timezone. (See corresponding proprties added to OpenInteract2::Context.)

  • Add 'system_class.ini_reader' to allow custom INI reader registration. Thanks to antti.vahakotamaki@helsinki.fi for the inspiration.

Miscellaneous

  • Add 'Scalar::Util' as dependency in both Makefile.PL and Build.PL

  • All script/oi2_manage status/progress messages now written to STDERR so you can separate them out from any meaningful data written to STDOUT. (This was useful for the new 'export_data' task so you could pipe the exported data somewhere else without worrying about filtering out the progress/status messages.)

  • Added sample/website/conf/sample-action_override.ini and renamed the SPOPS version from sample-override_spops.ini to sample-spops_override.ini.

  • Add a link to "What's new?" on the default main template.

script/oi2_manage

  • OIN-80: Never re-use the website logging configuration/file, even if it is absolutely available. It's just too confusing.

Package Updates

The following packages have been updated since the last version. See the 'Changes' file for each to view the modifications:

   OpenInteract     1.99_04 -> 1.99_05
   -----------------------------------
   base:            2.10    -> 2.11
   base_box:        2.11    -> 2.17
   base_error:      2.10    -> 2.10
   base_group:      2.11    -> 2.16
   base_page:       2.21    -> 2.28
   base_security:   2.13    -> 2.18
   base_template:   3.11    -> 3.15
   base_theme:      2.09    -> 2.10
   base_user:       2.27    -> 2.35
   comments:        1.10    -> 1.18
   full_text:       2.09    -> 2.58
   lookup:          2.04    -> 2.07
   news:            2.13    -> 2.20
   object_activity: 2.11    -> 2.11
   system_doc:      2.05    -> 2.08
   whats_new:       2.04    -> 2.10

1.99_04 (2.0 beta 4), 22 May 2004

Major Changes

  • Added basic localization support. See OpenInteract2::Manual::I18N for more information. Note that a number of OI2 classes have been modified to support additional data for i18n infrastructure. Also note: you don't have to use i18n if you don't want to :-)

  • You can now migrate your 1.x data automatically. The base SQL installation class OpenInteract2::SQLinstall has hooks for doing it yourself or for declaring a few pieces of information which it will use to copy data from table to table or to copy data to SPOPS objects which get saved to tables as normal. Read its docs under 'DEVELOPERS: MIGRATING DATA' for more information. All packages shipped in the distribution should be able to migrate themselves from a 1.x system.

    The management task 'migrate_data' (OpenInteract2::Manage::Website::MigratePackageData) is the external hook to this. Run:

     oi2_manage task_info --task=migrate_data

    for description and parameter information.

  • Added new package 'comments' to core distribution. It implements a simple flat comment thread for any object, so you can have comments on news items, links, documents, users, etc.

  • Added new package 'whats_new' to core distribution. With this you can register an SPOPS object with the service and track new additions to a central location. So when users click "What's new?" they see new documents, news items, comments, etc.

  • OpenInteract2 now runs under Apache 2/mod_perl 2. This has not been tested very deeply and I've got about two hours of experience with mod_perl 2, but at least it's something to work with.

  • A couple of table fieldname changes were necessary to make OI2 work under Sybase Adaptive Server Anywhere (ASA). So if you have an earlier beta you'll need to change the name of 'sys_error.message' to 'sys_error.err_message' and the 'comment' table to 'oi_comment'. The former has a backward-compatibility change in the SPOPS configuration (under 'field_map') so you won't even notice.

  • Tons of cleanup, rewriting, redoing...

Minor Changes

Apache2::OpenInteract2

  • Add interface for Apache2/mod_perl2.

HTTP::Daemon::OpenInteract2

  • Disambiguate 'close()' call on filehandle since we have a 'close()' method.

OpenInteract2::Action

  • Add clone() which copies the properties and parameters of the given object into a new object of the same class. We use this to cache actions created from the action configuration (profiling showed a good bit of time spent on this operation).

  • Modify the cache key we create when an action requests caching. It now includes the action name instead of the class name, otherwise we'd get some crazy behavior with action types (since they share the same class).

OpenInteract2::Action::Common*

  • Added SYNOPSIS documentation displaying all configuration entries

OpenInteract2::Config::Initializer

  • Added documentation for people wishing to catch the 'localization' event, fired when we generate a new localization class.

OpenInteract2::Config::Package

  • Add configuration item 'message_file' so users can declare one or more message files.

OpenInteract2::ContentGenerator

  • Remove unused 'instance_sub' method.

OpenInteract2::ContentGenerator::TT2Context

OpenInteract2::ContentGenerator::TT2Plugin

  • Add 'require' for Text::Sentence in 'limit_sentences()'. Thanks to Mike Castle for pointing out the error.

  • Move to OpenInteract2::TT2::Plugin

OpenInteract2::ContentGenerator::TemplateSource

  • Add new template source type 'message_key' which asks the language handle to lookup the template name (the normal 'package::name' syntax) given a particular key.

OpenInteract2::ContentGenerator::TT2Process

  • Modify 'initialize()' to save data as state in the content generator object ($self) rather than use class variables and store it in CTX -- the TT object is now a content generator property, not a CTX property.

  • Configuration data has moved from 'template_process' to 'content_generator' declaration and is pushed into 'initialize()' rather than being pulled from the server config/CTX.

  • You can no longer specify the methods in 'custom_init_class' and 'custom_variable_class' -- you need to use predefined methods for each ('custom_template_initialize' and 'customize_template_vars', respectively).

OpenInteract2::ContentGenerator::TT2Provider

OpenInteract2::Context

  • Add method 'lookup_mail_config' as shortcut into 'email' configuration.

  • Add step during setup() 'initialize messages' to read in the localized messages from all packages.

  • Modify docs for lookup_content_generator_config() (only returns class associated with name) and content_generator() (clarify what's returned).

  • Remove 'template()' method since content generators can store their own state now, and if you need a Template object you can get it from the content generator or create one yourself.

  • Add 'lookup_datasource_type_config()' as shortcut into 'datasource_type' configuration

  • Add 'lookup_id_config()' as shortcut into 'id' configuration.

  • Add 'lookup_cache_config()' as shortcut into 'cache' configuration.

  • Add 'lookup_config_watcher_config()' as shortcut into 'config_watcher' configuration

OpenInteract2::Exception::Parameter

  • Move to separate class so we can do customized stringification (previously just a declaration in OI2::Exception)

OpenInteract2::I18N

  • Add base class for use with Locale::Maketext

OpenInteract2::I18N::Initializer

  • Add class to read message keys and generate Locale::Maketext subclasses from them. (Called from OI2::Setup)

OpenInteract2::Manage::Website::CreateSuperuserPassword

  • Add check so that if 'login.disable_superuser_password_change' is set we'll throw an exception.

OpenInteract2::Manage::Website::PackageCheckExportInstall

  • Add new task to check a package, export it if the check succeeds, and install it to a website if the export succeeds.

OpenInteract2::Manual::I18N

  • Add section of manual to deal with I18N/L10N issues.

OpenInteract2::Package

  • Add get_message_files() to retrieve the files with localized messages.

  • In 'create_skeleton()' reject any blank/all-space package names.

OpenInteract2::Reponse::Apache2

  • Add interface for Apache2/mod_perl2 output.

OpenInteract2::Request

  • Add 'auth_clear()' method to clear all 'auth_*' properties from current request. Generally used when loggin a user out.

  • Document that the assign_request_url() method should take the full request URL, including the query string.

OpenInteract2::Request::Apache

  • Ensure parent assign_request_url() gets the request URL with query arguments.

OpenInteract2::Request::Apache2

  • Add interface for Apache2/mod_perl2 input, although we're not using the mp2 version of Apache::Request yet because I couldn't get it working properly on my machine. (Lots of 'child pid 12671 exit signal Bus error (10)' type messages...) Instead we just borrow the parameter/upload parsing from OpenInteract2::Request::CGI.

  • Ensure parent assign_request_url() gets the request URL with query arguments.

OpenInteract2::Request::CGI

  • Ensure parent assign_request_url() gets the request URL with query arguments.

OpenInteract2::Setup

  • Add read_localized_messages() to read in the localized messages.

OpenInteract2::SQLInstall

  • Add migrate_data() method along with implementations to copy data between tables and from a table to objects.

  • Modify the data file and structure file installations to report the full path to the files used rather than the filename itself.

  • Fix bug where a '0' specified in the object ID in a security specification would actually try to insert a hashref of the default security information. (Ah, perl's true/false semantics...)

OpenInteract::TT2::Provider

  • Sync up with how TT2 manages the linked list of stuff to refresh.

sample/README

  • Add description of what the sample files are for and how to create a public source directory.

sample/apache2/*

  • Add Apache 2/mod_perl 2 configuration files, copied over to a new website when it's created.

sample/msg/*

  • Add global message files (only US English for now, like to help?)

sample/website/conf/server.ini

  • Add key 'dir.package' so we can get the base package directory easily.

  • Add key 'dir.msg' so we can get the global message directory

  • Remove 'template_process' configuration section, moving the data into the respective 'content_generator' section.

  • Modify content generator type 'HTMLT' to be 'HTMLTemplate', and 'TextTmpl' to be 'TextTemplate'. (Seems friendlier...)

  • Add section 'language' to support I18N efforts.

  • Add 'login.disable_superuser_password_change' to stop people from changing superuser password using oi2_manage.

  • Rename 'cache_info' to 'cache', and remove subsections 'data' and 'template' -- all 'data' items are in 'cache' and 'template' items moved to the TT2 content generator configuration.

  • Remove 'context.info.request' and 'context_info.response', the adapters are responsible for setting this.

  • Rename 'display_info' to 'redirect' since that's all it was holding.

  • Remove key 'system_class.security' since you can just do CTX->lookup_object( 'security' ) instead.

1.99_03 (2.0 beta 3), 8 September 2003

Major Changes

  • A very thorough package development tutorial is in full effect, see OpenInteract2::Manual::Tutorial.

  • API for management tasks has changed, and oi2_manage is now a much simpler shell around the main facade. Adding a new task is as simple as creating a class under the right namespace and registering yourself with the facade.

  • Actions can store messages for the view to pickup and the built-in template input widgets are hooked into them, making for fairly seamless validation roundtripping.

  • SPOPS and Action configurations can now be modified at server startup by your code. This allows you to create configuration shortcuts (like 'is_googlable') and make other developers on your team happy. (See OpenInteract2::Config::Initializer)

  • Actions in all system packages should work as advertised, with the exception of some functionality in the base_page package.

  • Tons of smaller changes throughout, including cleaner APIs, more tests, lots more documentation and examples, and cleaning up as a result of testing more of the system.

Minor Changes

Makefile.PL/Build.PL

  • Bump up required version for File::DirSync since it has new feature.

  • Add Test::MockObject as requirement.

    HTTP::Daemon::OpenInteract2

  • Use the version() from the context rather than hardcoding it ourselves. (old...)

  • Move most of the functionality from script/oi2_daemon here so we can access it from other places too (like tests).

OpenInteract2::Action

  • Rename a number of methods to give them a 'protected' veneer: check_task_validity(), find_task(), find_task_method() become _check_task_validity(), _find_task(), _find_task_method(), respectively.

  • Add factory_log() and factory_error() to capture messages from Class::Factory and redirect to our logger

  • Add overridable init_at_startup() and documentation with example.

OpenInteract2::Action::CommonRemove

  • Blew up because wrong method called, how embarrassing. Works now.

OpenInteract2::Action::CommonSearch

  • Always pass search_criteria to template to be nice, add warning about the format of the fieldnames.

OpenInteract2::Action::TemplateOnly

  • Reflect parent change of find_task() to _find_task().

OpenInteract2::Auth

  • Make an object rather than using class methods. The various information that we passed around is now in the auth object, and this object is passed to any custom handlers you may have defined as well.

  • Port change from 1.x allowing users to configure the website not to accept users who aren't logged in.

OpenInteract2::Auth::AdminCheck

  • Modify to use information from auth object rather than having it passed in.

OpenInteract2::Auth::Group

  • Modify to use information from auth object rather than having it passed in.

OpenInteract2::Auth::User

  • Modify to use information from auth object rather than having it passed in.

OpenInteract2::Config

  • Add factory_log() and factory_error() to capture messages from Class::Factory and redirect to our logger

  • In translate_dirs() ensure that 'dir.website' doesn't have a trailing slash.

OpenInteract2::Config::Base

  • After object initialized remove trailing '/' from all set directories.

OpenInteract2::Config::Initializer

  • Add class to handle SPOPS and Action configuration initialization duties. The class is observable so you can add custom behavior. (See docs for details and how this hooks into packages.)

  • Note that the use of 'TASK_EDIT' in the 'display' key of SPOPS objects will only result in the 'url_edit' key being populated from a call to 'object_configuration()' on an SPOPS object if you're using SPOPS >= 0.79. It doesn't do any harm otherwise, you just won't get the right URLs...

OpenInteract2::Config::Package

  • Add 'config_watcher' property

OpenInteract2::ContentGenerator::TT2Plugin

  • Add can_write shortcut so we don't have to use 'tmp_security_level' anymore...

OpenInteract2::Controller

  • Add factory_log() and factory_error() to capture messages from Class::Factory and redirect to our logger

OpenInteract2::Context

  • Create lookup_session_config() rather than having outsiders root around server config. In the same vein add 'lookup_default_action_info', 'default_action_id', 'lookup_default_datasource_name', lookup_system_datasource_name', 'lookup_default_ldap_datasource_name', 'lookup_directory', 'lookup_temp_lib_directory'.

  • Rename 'datasource_config' -> 'lookup_datasource_config'

  • Add docs for filter shortcut methods

  • Remove alias() and replace with lookup_class(). This means that:

      CTX->template_class

    and similar calls (based on the names in the 'system_alias' server configuration key, now replaced by 'system_class') will no longer work and you must use:

     CTX->lookup_class( 'template' )

    instead. This wasn't used terribly often and all uses in OI2 and packages have been replaced.

    This change also entailed modifying the setup so that the alias building features weren't called, and removing the corresponding OI2::Setup call (see below).

  • Remove global_attribute() -- feature without a purpose.

OpenInteract2::Manage

  • Modify the API quite a bit. Some is just renaming (e.g., 'brief_description()' is now 'get_brief_description()') but other bits are much more substantial. Just read OpenInteract2::Manual::Management for how things work now.

  • No tasks are hardcoded in this class (or the OpenInteract2::Manage::Package or OpenInteract2::Manage::Website abstract subclasses). Instead we find all classes from @INC under the OpenInteract2::Manage namespace (including subnamespaces) and require them. This means all you need to do to create a new task is put it under the right package and register yourself with the main management class and you're good to go.

  • Add factory_log() and factory_error() to capture messages from Class::Factory and redirect to our logger

OpenInteract2::Manage::CreateSourceDirectory

  • Update to use new feature in File::DirSync so we can return on request information about what got synchronized.

OpenInteract2::Manage::Website::CleanExpiredSessions

  • Add new task to delete old and empty sessions. Replaces script from 'base' package.

OpenInteract2::Manage::Website::CreateSecurity

  • Add new task to batch create security for SPOPS objects. Replaces script from 'base_security' package.

OpenInteract2::Manage::Website::InstallPackage

  • After package is installed add notification to refresh the temp lib dir if necessary.

  • Do explicit check to see if this package name/version already installed, and if so don't fail but generate a message indicating that the install wasn't performed.

OpenInteract2::Manage::Website::ReindexObjects

  • Add new task to reindex (or initially index) SPOPS objects. Replaces script from 'full_text' package.

OpenInteract2::Manual::AdminDatabase

  • Add instructions for initializing iAnywhere ASA, thanks to Greg Fenton for writing them up.

OpenInteract2::Manual::Architecture

  • Fix errors in request process pointed out by Greg Fenton.

  • Add discussion of how OI implements MVC (or really, how it implements separation of concerns and the pieces of OI that map to the letters in MVC...)

OpenInteract2::Manual::Management

  • Add content, reflects fully the recent API changes.

OpenInteract2::Manual::QuickStart

  • Fix errors and inconsistencies and make clarifications throughout document, thanks to Greg Fenton for detailed report.

OpenInteract2::Manual::Templates

  • Add discussion of multiple content generators with the same code, declaring 'template_source' in an action to enable this, and similar matters.

OpenInteract2::Manual::Tutorial

  • Write the thing. It's really big, read it now!

OpenInteract2::Manual::TutorialAdvanced

  • Add placeholder for tutorial on advanced OI functionality.

OpenInteract2::Package

  • Add little 'parse_full_name()' class method to complement 'full_name' object method.

  • Modify check() for templates -- it was succeeding even though the template file didn't exist.

  • On install() be sure to translate the package filename into an absolute one, otherwise we eventually lose track.

  • Fix for reading package from file -- directory wasn't being set correctly.

OpenInteract2::Repository

  • Add internal methods to maintain a cache of packages rather than refetch them on every 'fetch_package()'. This may come back to bite us in the future because there's no synchronization going on...

OpenInteract2::Request

  • Add 'action_errors' and 'add_action_errors()', plus docs.

  • Add 'get_implementation_type'

OpenInteract2::Response

  • Add 'get_implementation_type'

  • Rename _set_url() to assign_request_url() so other modules can call; rename call in subclasses as well.

OpenInteract2::Response

  • Add factory_log() and factory_error() to capture messages from Class::Factory and redirect to our logger

  • Add factory_log() and factory_error() to capture messages from Class::Factory and redirect to our logger

OpenInteract2::ResultsManage

  • Use methods instead of object hash references. Another notch for Class::Accessor...

OpenInteract2::SessionManager

  • Renamed this and all subclasses from OI2::Session* to reflect that we're not session objects, we're managing session objects.

OpenInteract2::Setup

  • Move all initialization methods for action config and calls to the datasource-specific initializer to OpenInteract2::Config::Initializer so that users can add custom behaviors.

  • Document create_temp_lib call better, explaining our intentions.

  • Remove build_aliases and documentation for it. (No longer needed, see OI2::Context change docs.)

OpenInteract2::SPOPS

  • Fix bug resulting from evaluating $spops_obj->id in list context that was fixed in 1.x but didn't get replicated. Thanks to damien leri (again!) for pointing it out.

  • Move all configuration initialization modification routines into OpenInteract2::Config::Initializer.

  • All object key methods now use the 'system' datasource name rather than relying on the object that was being keyed.

OpenInteract2::SPOPS::DBI

OpenInteract2::SPOPS::LDAP

OpenInteract2::SQLInstall

  • Modify some server config retrievals into method calls on the context. (Data hiding, what's that?)

    sample/website/conf/server.ini

  • Add 'config_watcher' section. Allows us to declare SPOPS/action configuration initialization observers.

  • Add 'datasource_config.ldap' for the default LDAP datasource

  • Add 'required', 'required_url' and 'required_skip' to 'login'

  • Add 'use_meta_redirect' and 'use_header_redirect' to 'display_info'

  • Rename 'system_alias' section to 'system_class', remove a number of items from it and rename some others.

    script/oi2_daemon

  • Store the PID file in the directory from where the configuration file is read. (Thanks to Greg Fenton for suggestion.)

  • Move most functionality to HTTP::OpenInteract2::Daemon so we can run it outside the script.

t/*

  • Add lots of stub tests to be filled in shortly -- honest! Also created a TODO listing of tests to create.

1.99_02

NOTE: Skipped this release to sync up the beta number with the extra dev number.

1.99_01 (2.0 beta 1), 3 July 2003

Major Changes

  • Log4perl is now used for all logging. This is a major change in how OI2 presents its state to you, allowing you far more flexibility than you previously had.

  • Lots of documentation additions and updates.

  • Different content generators than the Template Toolkit exist and can be used. They're not as featureful (e.g., nothing similar to the TT plugin) but may be useful when porting applications. They are Text::Template (using OpenInteract2::ContentGenerator::TextTemplate) and HTML::Template (using OpenInteract2::ContentGenerator::HtmlTemplate).

    You can find examples of using them in the 'news' package -- look at the bottom of the conf/action.ini file to enable the different actions.

  • The controller has been decoupled from the content generator. Each controller is associated with a content generator, but a content generator doesn't map to a single controller. (This probably doesn't make sense to anybody who didn't read the code or try to use a different content generator, but trust me that it's better.)

  • OpenInteract2 now has content filters. And they're easy! A filter is just an observer (see Class::Observable) that catches 'filter' observations and has an opportunity to modify the content generated before it's optionally cached.

  • ...which leads to caching of action content, now implemented. It's mostly transparent to your action as long as the cached content doesn't depend on any non-request parameters. (See OpenInteract2::Manual::Caching for lots of info.)

  • OpenInteract2::Exception now uses Exception::Class rather than SPOPS::Exception, and E::C is a depdendency.

  • The standalone daemon (oi2_daemon) respects the OPENINTERACT2 environment variable and will use it to find the server configuration and the daemon configuration if unspecified.

Minor changes

Too many small fixes and improvements to note, sorry. As we stabilize to 2.0 this will get explicit.

Broken stuff

Full text searching doesn't seem to work. A number of other actions have not been fully tested by hand, much less in an automated fashion.

Also, tests for other areas of the system are lagging.

1.99_00 (2.0 beta 0), 10 June 2003

This is the first BETA release. DO NOT run production systems on it.

Compatibility

Since OpenInteract 2.x uses a separate namespace than OpenInteract 1.x (OpenInteract2 vs. OpenInteract), you should have no problems installing this on a machine with OpenInteract 1.x.

There is currently no automated way to upgrade the server configuration or everything about a custom package. (You can translate the conf/action.perl and conf/spops.perl into the new INI format -- see scripts in script/.) In addition, a number of core packages have upgraded schemas so you can't simply dump your table and reload it.

Before 2.0 final is released there should be tools to:

  • Do a simple translation of content handlers and other classes. This would just translate most of the $R calls to CTX calls (or CTX->request, CTX->response calls).

  • Do a translation of Template Toolkit directives that have changed (there aren't many).

Major Changes

These are the highlights. Many others are lurking under the covers.

  • There is no longer a package repository and a website, only a website. This greatly simplifies development.

  • You can deploy OI2 under a specific URL-space so that, for instance, all requests under '/OI2/' will get translated to the proper action.

  • And along with deployment you can easily rewrite URLs to fit in the deployment scheme.

  • Tight integration with SPOPS object persistence still exists and has been enhanced to make development easier -- you do not have to specify 'SPOPS::Secure' in the ISA, just set the 'is_secure' key to 'yes'. You also do not have to specify the database type in your persistent object -- it's wired to a datasource which knows this information, so we generate it at startup time.

  • An entirely new management scheme replaced the massive oi_manage with programmable tasks to create a website, create and install packages, install database schemas along with associated data and security settings, and more.

  • Request parameters that OI2 deals with are separate from the how those parameters are retrieved. This means it's easy to deploy an OI2 server in different environments -- it ships with interfaces for Apache 1.x/mod_perl 1.x, CGI, and a standalone server based on LWP. It's easy to create interfaces for other systems as well. (See "OI2 INTERFACES".)

  • Content handlers are now objects instead of classes, all deriving from OpenInteract2::Action. This simplifies development, making each action stateful rather than passing around a dumb hashref.

  • You can now generate any kind of content from OI2. OI2 is still heavily biased toward the Template Toolkit (can you blame it?), but you can plugin any type of content generator you like. A sample one is in the distribution: OpenInteract2::ContentGenerator::TextTemplate.

  • The OpenInteract::CommonHandler megalith has been split up into separate classes to deal with searching, displaying, updating, adding, and removing objects.

  • All actions in the core packages have been modified to use these common handlers where possible, and when not possible they don't overload as much functionality into a single task. For instance, 'display' will just display a non-editable object; 'display_form' will just display an existing object in a form for updating; 'display_add' will display a form without an object.

  • The procedures for installing SQL structures, initial data and security has been totally overhauled. It's much to create an installer now.

  • Authentication is more flexible and can be adapted to different systems (e.g., HTTP authentication instead of cookies) more easily.

  • The package and repository code was entirely rewritten. The repository now holds the bare minimum to keep track of objects and it should never become corrupted.

  • Everything in OI2 should throw an exception object rather than issue a die. This allows us to discern the different types of errors more easily, keep track of where they were thrown, etc.

  • An ever-growing testing suite ensures that OI2 can adapt easily and also provides a separate bunch of documentation.

OI2 INTERFACES

An 'interface' refers to how OpenInteract2 interacts with the outside world. An interface consists of three parts:

Since most of the functionality is pushed down into the Request and Response subclasses, adapters are generally pretty simple. For instance, here's an example of the Adapter for Apache 1.x/mod_perl 1.x:

 package Apache::OpenInteract2;

 use strict;
 use OpenInteract2::Auth;
 use OpenInteract2::Request;
 use OpenInteract2::Response;

 sub handler($$) {
     my ( $class, $r ) = @_;
     my $response = OpenInteract2::Response->new({ apache => $r });
     my $request  = OpenInteract2::Request->new({ apache => $r });
     OpenInteract2::Auth->login( $r->pnotes( 'login_user' ) );
     my $controller = eval {
         OpenInteract2::Controller->new( $request, $response )
     };
     if ( $@ ) {
         $response->content( $@ );
     }
     else {
         $controller->execute;
     }
     $response->send;
     return $response->status;
 }

SEE ALSO

OpenInteract Wiki

http://openinteract.sourceforge.net/cgi-bin/twiki/view/OI/

COPYRIGHT

Copyright (c) 2002-2005 Chris Winters. All rights reserved.

AUTHORS

Chris Winters <chris@cwinters.com>