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.
-
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
-
Optional - add the following server keys:
[login] ... initial_login_expires = 24h
-
In your
$WEBSITE_DIR/conf/startup.plchange 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_errorpackage) 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
-
Use new OpenInteract2::ParamContainer for
param()and related methods.
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
$objectand\%old_datato_update_post_action()callback rather than forcing the user to get them from parameters.
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.
-
OIN-72: Added base class for package classes to do installation and report other metdata about the package. (Part of making them CPAN-installable.)
-
Add
author_names()andauthor_emails()to pull the names and emails from the 'author' key.
-
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()
-
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.
-
Use OpenInteract2::ParamContainer for
param()and related methods.
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
OIN-134: Add 'file' parameter to pass to modified
OpenInteract2::SQLInstall install_structure().
-
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
-
Add simple class to provide storage and manipulation of arbitrary parameters. (Previously four separate classes had implementations of a 'param' method...)
-
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 toparam_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()toassign_languages()and allow optional override values to be passed in. This lets the language be assigned later in the process.
(Also see the notes under Major Changes for 1.99_06 above.)
-
Use OpenInteract2::ParamContainer for
param()and related methods.
-
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
-
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.
-
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.
-
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
-
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(), andadd_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()andclear_status(), which delete all error/status messages.
-
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.
-
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()ortransfer().
-
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.
-
Extract rules from 'full_text' and move to distribution.
-
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
-
Move code for checking whether an SPOPS key is valid from OpenInteract2::Manage::Website::ReindexObject here for common use.
OpenInteract2::Manage::Website::Create
-
Add two new directories to website 'cache/sessions' and 'cache/sessions_lock' for use by the default session manager (OpenInteract2::SessionManager::File).
OpenInteract2::Manage::Website::ExportData
-
Add new task to export data in SPOPS::Export::Object format.
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.
-
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.
-
OIN-56: Add 'charset' property and a 'content_type_header' method which adds the charset (if specified) to the content type.
-
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.
-
OIN-8: Fix CGI response to generate redirects properly, thanks to Salve Nilsen for the patch.
-
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.
-
OIN-104: In
get_security_scopes(): if the request is not defined return empty scopes.
-
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.)
-
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.
-
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\%paramsto$url. Note that$urlis 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.
-
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_managestatus/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.iniand renamed the SPOPS version fromsample-override_spops.initosample-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
-
Add interface for Apache2/mod_perl2.
-
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
-
Move to OpenInteract2::TT2::Context
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
-
Move to OpenInteract2::TT2::Provider
-
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) andcontent_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)
-
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.
-
Add section of manual to deal with I18N/L10N issues.
-
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.
-
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.
-
Ensure parent
assign_request_url()gets the request URL with query arguments.
-
Add
read_localized_messages()to read in the localized messages.
-
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...)
-
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_manageis 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_pagepackage. -
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.
-
Use the
version()from the context rather than hardcoding it ourselves. (old...) -
Move most of the functionality from
script/oi2_daemonhere so we can access it from other places too (like tests).
-
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_criteriato template to be nice, add warning about the format of the fieldnames.
OpenInteract2::Action::TemplateOnly
-
Reflect parent change of
find_task()to_find_task().
-
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.
-
Modify to use information from auth object rather than having it passed in.
-
Modify to use information from auth object rather than having it passed in.
-
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.
-
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_writeshortcut so we don't have to use 'tmp_security_level' anymore...
-
Add factory_log() and factory_error() to capture messages from Class::Factory and redirect to our logger
-
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 withlookup_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.
-
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
@INCunder theOpenInteract2::Managenamespace (including subnamespaces) andrequirethem. 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.
-
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.
-
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...
-
Add 'action_errors' and 'add_action_errors()', plus docs.
-
Add 'get_implementation_type'
-
Add 'get_implementation_type'
-
Rename
_set_url()toassign_request_url()so other modules can call; rename call in subclasses as well.
-
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
-
Use methods instead of object hash references. Another notch for Class::Accessor...
-
Renamed this and all subclasses from OI2::Session* to reflect that we're not session objects, we're managing session objects.
-
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_libcall better, explaining our intentions. -
Remove
build_aliasesand documentation for it. (No longer needed, see OI2::Context change docs.)
-
Fix bug resulting from evaluating
$spops_obj->idin 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.
-
Move all configuration initialization modification routines into OpenInteract2::Config::Initializer.
-
Move all configuration initialization modification routines into OpenInteract2::Config::Initializer.
-
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) andHTML::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 theOPENINTERACT2environment 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_managewith 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::CommonHandlermegalith 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:
-
Adapter to take the user's request, login the user and create the necessary OpenInteract2 objects (OpenInteract2::Request, OpenInteract2::Response, OpenInteract2::Controller).
-
Subclass of OpenInteract2::Request to take the parameters, cookies, and other user information from the user's request and put it into the OpenInteract2 framework.
-
Subclass of OpenInteract2::Response to take the generated headers, cookies, and content generated by OpenInteract2 and send it back to the client.
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>
Generated from the OpenInteract 1.99_06 source.
