23,27 €
OpenCms is a professional-level open-source Website Content Management System, based on Java and XML. Many companies or organizations have requirements that go beyond what is available in the standard OpenCms application. Thankfully, OpenCms can be used by Java developers to create sophisticated add-ons and customizations that extend the power of OpenCms in virtually unlimited directions.
Targeting version 7 of OpenCms, this book is for Java developers interested in extending and further customizing OpenCms through its Java API.
Starting by showing how to set up a development environment for OpenCms work, the book moves you through various tasks of increasing complexity. Some of the common tasks covered are building OpenCms, XML asset type development, templating, module development, user and role setup, and search integration. In addition to these common tasks some more advanced topics are covered such as self-registering users, RSS support, developing custom widgets and extending the administrative interface. All the topics include examples and are presented while building a sample blog site.
The skills you develop will make you an OpenCms developer to be reckoned with!
Targeting version 7 of OpenCms, this book is for Java developers interested in extending and further customizing OpenCms through its Java API.
This book is a clear, practical tutorial to OpenCms development. It will take you through the development of an example site, illustrating the key concepts of OpenCms development with examples at every stage.
The book is for Java developers with a basic knowledge of the operations of OpenCms. No previous experience of developing OpenCms is expected.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 320
Veröffentlichungsjahr: 2008
Copyright © 2008 Packt Publishing
All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, without the prior written permission of the publisher, except in the case of brief quotations embedded in critical articles or reviews.
Every effort has been made in the preparation of this book to ensure the accuracy of the information presented. However, the information contained in this book is sold without warranty, either express or implied. Neither the author, Packt Publishing, nor its dealers or distributors will be held liable for any damages caused or alleged to be caused directly or indirectly by this book.
Packt Publishing has endeavored to provide trademark information about all the companies and products mentioned in this book by the appropriate use of capitals. However, Packt Publishing cannot guarantee the accuracy of this information.
First published: April 2008
Production Reference: 1160408
Published by Packt Publishing Ltd.
32 Lincoln Road
Olton
Birmingham, B27 6PA, UK.
ISBN 978-1-847191-05-2
www.packtpub.com
Cover Image by Karl Moore (<[email protected]>)
Author
Dan Liliedahl
Reviewer
Olli Aro
Senior Acquisition Editor
Douglas Paterson
Development Editor
Nikhil Bangera
Technical Editor
Himanshu Panchal
Editorial Team Leader
Mithil Kulkarni
Project Manager
Abhijeet Deobhakta
Indexer
Rekha Nair
Proofreader
Angie Butcher
Production Coordinator
Shantanu Zagade
Cover Work
Shantanu Zagade
Dan Liliedahl is the founder and CTO of eFoundry Corporation, a premier consulting company with expertise in selecting, specifying, and delivering Open Source and commercial content management portal and collaboration systems. Since starting eFoundry in 1998, he has architected and developed Web solutions for Fortune 500 companies such as JPMorganChase, Disney, Sirius Satellite Radio, and AMTRAK. Prior to starting eFoundry, Dan was a principal consultant and architect with FutureTense, a start up commercial CMS product vendor, and Open Market, whose products continue to have a strong market presence under a new company name. In addition to his full-time work, Dan frequently donates his marketplace and technical expertise to selected non‑profit organizations. He holds a degree in Electrical Engineering and Computer Science from the University of New Hampshire and has over 20 years of industry experience. In his spare time, he enjoys alpine skiing, ice hockey and coaching his kids' soccer.
I would like to thank the people at Packt who have helped me along the way with this book, especially Douglas Paterson, Senior Acquisition Editor for his initial guidance and ongoing support. Thanks also to Abhijeet Deobhakta for his patience and for putting up with many delays and missed deadlines. Many thanks to Olli Arro and Himanshu Panchal for their time, comments, and helpful suggestions. It is great people like these who have made this book enjoyable to write and seem to go by quickly.
I also would like to thank Alexander Kandzior and his OpenCms team. Beside building an outstanding product, they have always been available for questions and help, despite their busy schedules. I know their schedules are busy because they came out with four versions of the software before this book was completed! Alex's focus, diligence, obsession with quality, and professionalism has made OpenCms and his company great.
Special thanks to my wife for her support and encouragement and for keeping me going on those days I didn't want to. And of course, to my three children for making me laugh and for tolerating the times I couldn't spend with them.
Olli Aro hails from Finnish Lapland, but is based now in the north of England. Olli Aro has over 10 years experience in the area of innovation and development of software and web-based applications. In his current role as head of technology and product development for Clicks and Links Ltd, Olli has been responsible for the company's portfolio of Open Source-based solutions. He has been involved in the OpenCms project since 2001 (version 4), contributing various open source modules and bug fixes to the project. Olli was also involved in reviewing the previous version of the OpenCms book. Prior to Clicks and Links, Olli worked for organizations such as Nokia, eMobile Ltd, and CCC Systems Oy. In his spare time, he works on his own social networking site, Breakaway Republix.
OpenCms can be used by Java developers to create sophisticated add-ons and customizations that extend the power of OpenCms in virtually unlimited directions. Starting by showing how to set up a development environment for OpenCms work, this book moves you through various tasks of increasing complexity. Some of the common tasks covered are building OpenCms, XML asset type development, templating, module development, user and role setup, and search integration. In addition to these common tasks some more advanced topics are covered such as self-registering users, RSS support, developing custom widgets, and extending the administrative interface. All the topics include examples and are presented while building a sample blog site.
This book is a clear, practical tutorial to OpenCms development. It will take you through the development of an example site, illustrating the key concepts of OpenCms development with examples at every stage.
Chapter 1 starts out by describing a sample site that will be created to demonstrate OpenCms development concepts. It also provides a description of the developer skills required for OpenCms development, followed by a basic overview of OpenCms architecture. We also provide a basic description of OpenCms configuration files and their file locations.
Chapter 2 sets the stage for coding by providing details on how to set up various OpenCms development environments. The chapter includes a step-by-step procedure for using Eclipse to check out and build OpenCms from the CVS repository. The chapter describes how to build OpenCms using Ant and also how to debug OpenCms itself.
Chapter 3 begins with an explanation of OpenCms modules, including a guide for creating a new module. The module is used to define a new content type, which is another concept covered in the chapter. Included in the content type discussion is a complete, step-by-step guide for designing and creating a new content type used to contain blog entries. All aspects of content type schema files are covered, including schema design, widget usage, field selectors, field validations, nested definitions, and registration. At the end of the chapter, the content type may be used to create new blog entries.
Chapter 4 continues developing the sample site by covering JSP template coding. A set of templates is created to display the blog content, including a complete run through of how they are put together. The example illustrates the use of custom template coding beyond the standard OpenCms tag library by sub-classing Java template classes. Included in the chapter is an overview of the resource and template loading mechanism. Also relating to templates is a description of using expressions and JSTL within template code. Lastly in the chapter is a guide to using WebDAV for template editing in Eclipse.
Chapter 5 covers the usage of Lucene within OpenCms, beginning with an overview of basic Lucene concepts. This is followed by an in-depth guide to creating a search index in OpenCms. The guide provides an example of building a new search index for the blog site example and describes a developer tool, which may be used to performtest queries against the index. The chapter includes a walkthrough of implementing a search form in OpenCms for simple cases and for more advanced situations.
Chapter 6 continues the build out of the sample site by adding support for users and commenting. It starts with an explanation of OpenCms security, including a discussion on Roles, Groups, Users, and Organizational Units. It then proceeds with the set up of the group and role structure for the sample, and shows how they are used within the code.
Chapter 7 shows how easy it is to support user customizations of site pages. It then show an example of this by adding RSS feed support to the sample site, allowing users to specify a custom feed. Included in the chapter is a discussion of integrating third-party libraries into OpenCms.
Chapter 8 describes the custom widget interface, and then shows how to design and create a widget. The widget provides a pluggable data interface that is used to obtain a list of selection values for a select list. The chapter then illustrates how to read XML content fields by creating a list source that gets its values from any content field. Finally, the chapter shows how to localize message strings and how to register and use the custom widget.
Chapter 9 shows how RSS feeds can be generated from OpenCms content. It also shows how wrapper classes can be used around structured content items to make them easier to work with, and then walks through creation of an RSS feed generation module using these concepts.
Chapter 10 discusses how administration points are created in OpenCms, and also how to use OpenCms dialog classes. The chapter also discusses how widgets can be used programmatically. An example administration point is created that ties together topics from previous chapters, showing how to use widgets, dialogs, and multiple screens.
Tools needed and used for this book:
In this book, you will find a number of styles of text that distinguish between different kinds of information. Here are some examples of these styles and an explanation of their meaning.
There are three styles for code. Code words in text are shown as follows: "We can include other contexts through the use of the include directive."
A block of code will be set as follows:
When we wish to draw your attention to a particular part of a code block, the relevant lines or items will be made bold:
Any command-line input and output is written as follows:
New terms and important words are introduced in a bold-type font. Words that you see on the screen, in menus or dialog boxes for example, appear in our text like this: "clicking the Next button moves you to the next screen".
Important notes appear in a box like this.
Tips and tricks appear like this.
Feedback from our readers is always welcome. Let us know what you think about this book, what you liked or may have disliked. Reader feedback is important for us to develop titles that you really get the most out of.
To send us general feedback, simply drop an email to <[email protected]>, making sure to mention the book title in the subject of your message.
If there is a book that you need and would like to see us publish, please send us a note in the SUGGEST A TITLE form on www.packtpub.com or email <[email protected]>.
If there is a topic that you have expertise in and you are interested in either writing or contributing to a book, see our author guide on www.packtpub.com/authors.
Now that you are the proud owner of a Packt book, we have a number of things to help you to get the most from your purchase.
Visit http://www.packtpub.com/files/code/1052_Code.zip to directly download the example code.
The downloadable files contain instructions on how to use them.
Although we have taken every care to ensure the accuracy of our contents, mistakes do happen. If you find a mistake in one of our books—maybe a mistake in text or code—we would be grateful if you would report this to us. By doing this you can save other readers from frustration, and help to improve subsequent versions of this book. If you find any errata, report them by visiting http://www.packtpub.com/support, selecting your book, clicking on the Submit Errata link, and entering the details of your errata. Once your errata are verified, your submission will be accepted and the errata are added to the list of existing errata. The existing errata can be viewed by selecting your title from http://www.packtpub.com/support.
You can contact us at <[email protected]> if you are having a problem with some aspect of the book, and we will do our best to address it.
This book is a guide for developers interested in building websites using the OpenCms content management system. The book is intended for developers who are familiar with Java, JSP, and building web applications based on the Java J2EE framework.
In this book, we will develop a website designed for a blog writer. In the course of building our site, we will go over these topics:
We will go over all the steps involved in building a blog website using OpenCms. We will start by describing the features and requirements of our website and will then provide an overview of OpenCms. Next, we will discuss how to create a development environment. We then will go over the steps involved in creating structured content types, to hold our site content. After that, we will cover creation of templates and Java code, to display the content. The site also supports search and user comments;, so we will cover the Lucene search engine as well to show how to provide login support. As the site additionally supports RSS clients and feeds, we will discuss how to add new features to OpenCms.
Before we get into the development details, we will first discuss some of the skills required to develop sites with OpenCms. This will provide us with a basis for understanding the environment and tools, which we will need to do our development work.
Before the development of any site can begin, there should be an understanding of the site's feature requirements. The feature requirements will often be driven by the actual layout and design of the site. We will design and build a blog website named 'Deep Thoughts'. The design of the site homepage layout looks like this:
The blog site is designed to support the following features:
In addition to the features seen in the mockup, we will also support:
There are two additional mockups for the site. The first one shows a detailed view of a blog. This view is shown when a user clicks on a blog from the homepage:
The last mockup shows what the search result screen looks like. Search results are shown in decreasing order of relevance to the search term. The pagination controls at the bottom of the page allow for the results to be scrolled, if necessary:
The level of technology and coding skills required to do site development will vary depending upon the requirements and features of the site. Designing and architecting a site that properly utilizes and leverages OpenCms is an exercise in itself, which we will not discuss in this book. However, we will discuss the development tasks that are involved, once the architecture has been designed. In general, we can think of four different developer levels and skills.
OpenCms may be used to manage content right after installation. One way of using it is to import static files into the Virtual File System (VFS) and utilize the publishing and version control features to manage them. In this scenario, files from an existing non-content managed website may easily be content managed. Files in the VFS may be created, edited, and previewed in the offline staging area, before they are published to the online file system. When published, versions can be taken to allow for roll back, if necessary.
Files in the VFS may also be exported to the Real File System (RFS) and served statically or by a web server. In this way, the website can operate in exactly the same way it did, prior to being placed into OpenCms, except for the fact that it is now version controlled. The following illustration shows how OpenCms can be used in this fashion:
Utilizing OpenCms this way is straightforward, needs little, if any development effort, and probably doesn't require use of this book! However, it is worth mentioning here that there are a number of sites that can take advantage of this.
For this developer audience, the skill levels will include the following:
OpenCms also provides a sample site called TemplateOne, packaged as a module. This module contains structured content types and templates. Although somewhat complex and confusing, content types and templates provided with TemplateOne may be used to construct sites without requiring development work. The documentation for these templates may be downloaded from the OpenCms website and installed into OpenCms.
After looking at the TemplateOne samples, we may soon realize that it does not quite address our site requirements. Perhaps, the template layouts are not what we desire or the structured content types do not contain the fields necessary to hold our data. In this case, we will want to develop our own JSP code and extend or create our own custom content types. This level of development will require some understanding of Java, JSPs and XML.
This type of development involves working within the framework provided by OpenCms, to define the templates, content types, and JSPs, and also perhaps java classes that we need. Developing, at this level, does not require us to utilize a development environment such as Eclipse or Netbeans. But we will probably want to use a nice editor for our JSP and XML code.
Before undertaking this task, we will want to understand the feature and content requirements of our site in detail. This will allow us to properly design the templates and custom content types, which our site will need. This is a design exercise which will not be touched upon in this book. However, we will discuss the specific tasks required in implementing templates and the custom content types once they have been designed.
For this type of development, the developer requires first level skills plus:
There are different types of projects that require integration of features which are not provided with OpenCms. For example, we may need a feature that automatically imports data from a back office application into a structured content type. Or perhaps we need to create a content type that we can easily use to define RSS feeds from articles in our site. For these types of projects, we will want to code in Java, using a development environment. We will also probably want to build OpenCms for ourselves, so that we can step through the source and gain a better understanding of how our own code will need to work. We will discuss how to do these, in the later chapters of this book.
Developing custom features in OpenCms will require the second level skills, plus:
The last type of development level is custom development, where OpenCms is used as a base framework or platform, and a custom site interface is built on top of it. This type of development might be suitable where the Workplace Explorer is too general, and a more task-specific user interface is required.
Developing, at this level, requires the third level skills, plus:
This type of development is not covered in this book.
Before undertaking development, it will be helpful to understand the basic design of OpenCms. OpenCms is structured as a typical J2EE web application conforming to a 3-tier web application architecture:
A web server on the front-end tier services incoming requests. The requests are passed through to an application server in the middle tier, where the OpenCms application runs. The OpenCms application utilizes the database on the third tier to read and store its content.
For production, using an array of web servers will typically distribute load to the application server tier. A common choice is to use the Apache web server, utilizing the mod_jk plug-in to distribute load. For development purposes, using a web server is optional, and instead the application server container may be accessed directly. OpenCms supports a wide variety of application servers, including commercial servers such as IBM Websphere and BEA WebLogic. It also supports open source servers such as Tomcat and JBoss. A popular choice among developers is the Apache Tomcat server. We will be using the Apache server for our development environment.
On the back end, OpenCms supports a variety of databases, including Oracle, Postgreas, and the popular open source database, MySQL. The OpenCms installation setup procedure provides a wizard interface guiding the user through the creation of the database schema. Optionally, it allows for manual creation of the database schema through provided scripts.
This wide variety of choices makes it easy to install and run OpenCms in many mixed environments. It also allows for easy integration with other technologies, such as portals, CRM systems, and document management systems. Next, let's take a look at the file structure of an installed environment.
OpenCms must be installed into the application server as an exploded Web Application Resource (WAR) file, due to the way OpenCms JSP files are handled. We will discuss more of this, in the later chapters. After extracting the WAR file and completing the setup process, the file directory structure should look something like this:
The web application directory structure should be familiar to anyone who has looked at or developed a web application.
OPENCMS_WEBAPP_NAME/
These directories are explained in detail here:
opencms.properties
This file contains the configuration information for connecting to the database. The setup program will automatically populate this file, based on the input selections.
opencms.xml
This is a master configuration file containing the names of classes usedto configure a system area. Each class implements theI_CmsXmlConfiguration interface and is called upon, at startup, to parse its configuration and initialize its area. This file will rarely need alterations.
opencms-system.xml
This file contains core system settings such as locales, cache and site definitions. Most of thesettings must be changed manually.
opencms-vfs.xml
This file contains settings related to the virtual file system. This file needs to be edited when adding a new resource type, and this is covered in a later chapter.
opencms-workplace.xml
This file contains settings related to the Workplace Explorer interface. This file also needs to be edited when adding a new resource type.
opencms-search.xml
This file contains settings related to searching and search indexes. Most of the settings in this file can be managed though the Workplace Administrator.
opencms-importexport.xml
This file controls the behavior of importing and exporting files from the VFS.
opencms-modules.xml
This file contains a registry of modules and is managed by the Module Manager within the Workplace Administrator. Settings in this file should not be modified manually.
Now let's look at the layout of the files in the virtual file system, where the bulk of the application structure exists. To view the entire virtual file system, we must be logged in as Admin and have the root site (/) selected. Underneath the root, there are two main branches:
The level of development required will determine if any resources within these locations need modifications.
OpenCms has a modular architecture centered on a VFS. The file system is considered virtual as it resides inside a database and not on a hard disk. The VFS is similar to a real file system that supports folders, file types, and permissions. Access permission masks on the files and folders, and controls access that users and groups have to the files. The OpenCms VFS also provides a feature very similar to symbolic links in a Unix file system. A link is a directory entry that contains meta-information which is kept separate from the file contents.
The core also provides support for basic features such as publishing, access control, and revisions. Layered above this are application level features such as configuration, the user interface, and module support. Module support is a key feature of OpenCms, providing the ability to extend and modify it. Module support is layered on top of OpenCms. A logical view looks like this:
It is interesting to note that although OpenCms is a web application, it comes with a shell application that provides an interpretive interface to the API from a Java command line interface! Furthermore, it is possible to script this interface to install content into the VFS.
Most of our development will center around using, or extending these core features. While working on our project, we will strive to work within the framework that OpenCms provides, rather than modify any OpenCms source code.
Modules are a key aspect of the OpenCms design. They provide a way to package together necessary components that may be easily plugged into OpenCms. Modules are the way that new content types, templates, or web capabilities are added to OpenCms. Later in this book, we will go into the details of creating an administration module for OpenCms.
It would be useful to understand how a request made to OpenCms results in the display of content. The structure of a typical OpenCms URL looks like:
http://[server]:[port]/[context]/[servlet]/[parameters]
For example:
http://mydevserver:8080/opencms/opencms/system/logon/index.html
Server: mydevserver
Port: 8080
Context: opencms
Servlet: opencms
Parameters: /system/logon/index.html
The request will invoke the opencms servlet with the parameter /system/logon/index.html. When the servlet runs, it goes through the following sequence:
There is a bit more going on; but for our discussion we will consider only the previous steps. It can be seen that after permission has been established, a resource loader is utilized to load the file. Resource loaders are responsible for encapsulating the knowledge required to load and execute items requested from the VFS. There are several types of resource loaders provided by OpenCms, and there is a one-to-one mapping between an OpenCms file type and a resource loader.
Most site content is structured XML, and the assigned loader for this type is the CmsXmlContentLoader. When this resource loader is invoked, it examines the properties assigned to the resource, specifically looking for the template-elements property. This property must contain the full path to a template used to render the XML content. The resource loader passes control to the template. When the template runs, it takes the responsibility of parsing the original XML resource, and displaying it. Most templates will be JSP files, but they are not restricted to this type. In fact, when a template is invoked, it follows the same loading process, resulting in its corresponding resource loader being invoked. This allows for new template languages to be plugged into OpenCms, by writing and adding new resource loaders.
As resource loaders act on file types, the extension of a file in the VFS is not significant. This means that a file with an HTML extension in the VFS may, in fact, be run as a JSP file, or vice versa. A useful way to leverage this, is to create a file with a .CSS extension that is in fact a JSP file. The JSP could then dynamically generate the CSS based on browser type. We will discuss resource loaders in more detail in a later chapter.
Although OpenCms is distributed in a standard WAR file it must be exploded when it is deployed into the application server. This is because, in order to execute a JSP stored in the OpenCms virtual file system, the JSP must be written to the real file system first. As the web application writes to the file system, it cannot be run as a WAR file.
In this book, we will build a sample blog site using OpenCms. The site will have the following features:
