Podius

Content Management System

2008-08-09 New shop, community site and payment system are launched.
2007-12-31 Half hour demo plus lighting talk on Perl Workshop.
2007-12-24 A new release of a perl-based CMS with numerous new features.
2007-12-22 The site is now fully podius-based itself, with self-demo available.

Main Features

Contents   

General_Info | Multiple_projects | DBMS_independent | Component_Architecture | Component_collections | Component_caching | Component_Property_Mapping | Concurrency | Static_Publishing | Dynamic_Publishing | Multilingual_support | Notification_mechanism | Exception_mechanism | Scriptability | General_utilities


General Info

Podius software is Content Management System, which includes object persistence layer, component architecture and publishing infrastructure for web-oriented projects.

Podius software is written entirely in Perl and has no dependencies, it should run out of the box on any operating system with perl 5.6 or better installed.

Multiple projects

Podius provides a base for other projects. Using an included set of scripts it is easy to create and configure a new project. Projects may inherit from each other, reusing the code and structure.

For example, NewsWebMgmt project inherits from the base podius project. Like its parent, NewsWebMgmt is also abstract, it defines a common infrastructure (business object definition and code) used for deploying News Web Management projects. Concrete projects VirtualLand, DailyJournal and IsraelTourismGuide inherit from NewsWebMgmt.

DBMS independent

Currently 3 types of Persistence Media are supported:

  • RDBMS based
  • ODBMS based (not included)
  • File based

All three support transactions and concurrency. Communication with RDBMS is done using DBI interface; tested with PostgreSQL®, Oracle®, Access®. Communication with ODBMS is done using the custom interface; tested with Versant®.

Component Architecture

Podius implements a powerful architecture slightly resembling Java Beans. Persistent objects are called components. Components have a list of named properties. Super-class hierarchies of both component classes and property classes are designed to be highly reusable.

Supplied Component types are:

  • abstract Publishable, NonPublishable
  • abstract Multilingual
  • abstract AccessControlable, AccessCenter
  • AccessUser, AccessGroup
  • Page, Edition, Section, Article

Supplied Property types are:

  • Scalar, BigScalar, Text
  • Integer, Number, Time, Date, Password, Email, URL, FileSelection
  • ScalarList, LimitedScalarList
  • ScalarTable, DateRanges, ScalarHash, Rating
  • Multimedia, Image
  • PerlData
  • Selection, Boolean
  • Country, Currency, CurrencyAmount
  • MultilingualSelection, MultilingualBoolean, MultilingualLanguage
  • MultipleSelections, NMultipleSelections
  • AccessPermissions
  • VComponent
  • ComponentCollection, VComponentCollection, RComponentCollection
  • property mix-ins Automanaged, Constant, Hidden, Multilingual

New component classes and property classes can be easily added. In fact, it is recommended to define custom component types for every new podius project, by inheriting from existing component classes.

Component collections

Among other useful property types, component collections play a special role. There is support for 3 different types:

  • ComponentCollection - aggregation; parent-sons
  • VComponentCollection - virtual collection; linkage
  • RComponentCollection - reverse collection; automatic back-directional linkage
  • CComponentCollection - circular collection; automatic multi-directional linkage

ComponentCollection properties define a tree of components. VComponentCollection define other non parent relationships. RComponentCollection is a subtype of VComponentCollection, it is managed automatically and represents matching reversed relationships of the component.

All component collections are accessible using Component Iterator interface. Component Iterators provide convenient sequential or direct access to enclosed components, and several useful foreach-like, filtering and sorting methods, plus addition, moving, deletion and other operations on component collections.

Component caching

One of the strong sides of Podius is Component Cache. This is a full featured fixed size cache of components (the size is configurable and can be unlimited if there is no limitation on memory usage). Components once accessed are usually remain in the cache until there is a place, or the cache is explicitly freed. The Component Cache is also Component Manager, it manages loading, saving and deletion of components. It also handles high level transactions and interfaces with low level Persistence Medias using Component Property Mapping.

Once a persistent component is requested, it is created with no properties, and a lazy property loading is applied. Properties can be configured to compose proxy groups; if one property from a proxy group is accessed the whole group is loaded. For optimization reasons if the property is requested from a component in the component collection, this property will be loaded (and cached) for all components in the last requested bunch of components (from a component collection); this optimization feature may be turned off. A minimal required set of changes is applied on component saving, i.e. on transaction commit or component swapping.

Component Property Mapping

All component property types can be freely mapped to native types supported by Persistence Medias. For example, the component collection property type, which is technically a list of component ids, can be mapped to a comma-separated string field, to a separate table (one id per row), to a field list, where the number of fields and the chunk size is configurable, to a native string-array type (some RDBMSes may support this), to a native object-array type (ODBMSes should support this) and so on.

Component and Property classes are high level classes, which are not aware of any persistence aspect. Component Property Mapping enables to map property types or individual named properties in component types to abstract data types, which are translated by Persistence Medias to the actual DBMS data types. Changing of a mapping is easy; it is suggested to choose an appropriated mapping before starting a production system, but a mapping can be replaced even in this case using "dump & restore" technique.

Concurrency

Podius software enables a read and write access to persistent components concurrently from several clients. If user A changes one property, B changes another property, an automatic merging is occurred without a conflict. If they change the same property, there is a conflict and the second client triggers a merge callback, where one of 4 things (actually more) may happen: leave the local property value, leave the remote value, try to merge automatically, set a completely new value.

Static Publishing

Every component can be represented on the web (published). Podius implements a powerful template system used to publish components. The template language is a regular HTML or plain text enhanced with directives enabling to navigate to related components in the tree of components, access their properties, iterate over them, call user defined functions, use automatic stash variables and more.

Speaking in MVC terms, components are your site model, template parsers are (usually) one direction controllers, and published pages are views. It is possible to define several views for the model. For example, article objects may be published into two pages each, the full content and the summary; and some article parts may be also included in their sections and static search result pages. Articles with the long content may be divided into several continuation pages.

Dynamic Publishing

This technology is similar to Static Publishing, but is intended for sites with user-based dynamic contents, where the actual publishing should occur on visit-time. There is a support for user authentication, personalization, and many aspects of Dynamic Publishing can be customized.

Note: a good alternative to dynamic publishing is using static publishing together with a dynamic html technology, like Apache::ASP. Then templates may be published into asp pages with parts statically generated on publish-time and parts containing perl code that works with components on visit-time.

Multilingual support

To support informational systems operating in two or more languages concurrently, there is a support for Multilingual component types and Multilingual property types. This allows to define language-agnostic properties and synchronize appropriated components (language clones) in all languages.

In addition, there is a translation infrastructure to translate the interface strings or long texts or emails into any number of natural languages.

Notification mechanism

Changes in component properties activate notifiers listening to them. Observers may be assigned to all component properties, given a property name, type or other pattern; supported observables are: property modification, adding or removing from component collection properties and more.

This notification mechanism makes it possible to write an interactive GUI on top of the persistent layer. In fact, there are several kinds of GUI's including thin and thick clients, some of them may become open source.

Exception mechanism

Exceptions are used to raise an error or a message up. It is possible to catch exceptions like 'No component', 'File system error' and more.

Scriptability

A set of administration scripts is included making it is easy to manage a project from a command line: scripts for creating a new project, for checking a project work-ability, scripts for managing RDBMS tables, ODBMS classes or FileBased data, scripts showing the component tree or a component content, scripts dumping and restoring component trees (replication), scripts for publishing and more.

A large number of provided example scripts may help to write automatic tools manipulating the project data.

General utilities

Podius contains several perl modules for general use. This includes powerful Exception and Debug modules providing the consistent API for all other Podius perl modules, a convenient File::Operations module, a perl-based-configuration parser, several arbitrary-perl-data encoders / decoders / dumpers, a WikiText parser, a date formatter and string list formatters.