Publishers of technology books, eBooks, and videos for creative people

Home > Articles > Web Design & Development > PHP/MySQL/Scripting

This chapter is from the book

PSML Storage and Access

Victor had analyzed Jetspeed fairly thoroughly at this point and had an idea of what classes might be available to use in the Sonic Systems project. Not many, he decided, but enough to save a little time and to give an overall framework for how the portal should look and feel. A few classes were available to read and write PSML, and they would return object representations of the XML elements. But to go any further, Victor needed to understand PSML.

The first lesson he learned was that PSML was used in two different file types: XREG and PSML files. The former were used to store portlets, skins, and other information in XML registries. The latter were used to store user information. Many of the elements were the same, though the purpose and organization of each was quite different. Victor chose to analyze the registries first.

PSML Registries

He simplified a registry template in order to dissect it:

<?xml version="1.0" encoding="UTF-8"?>
       <portlet-entry name="HelloJSP" hidden="false"
             type="ref" parent="JSP" application="false">
                       <description>Simple JSP Portlet
              <parameter name="template" value="hello.jsp"
              <media-type ref="html"/>

After the XML declaration, the registry was wrapped in the <registry> root element. Within this element were a number of <portlet-entry> elements (only one was in his sample registry). These represented portlets within the system. A number of attributes defined the name of the portlet, if it was hidden, what type it was (they all seemed to be ref), a parent (usually JSP, HTML or class), and whether it was an application. Victor wasn't entirely sure what all of these represented, nor if they would need to use them.

Additionally, the <meta-info> element contained a title and a description—both separate elements—defining the portlet. This is most likely what a user would see regarding a portlet. The <parameter> element was a multipurpose element that would set basic parameters and define whether they were hidden or not. In this sample, a hidden parameter called template was set to "hello.jsp". Finally, a <media-type> element has a ref attribute set to either html or wml; some had two elements. This defined whether the application was compatible with Web browsers (HTML) or wireless devices (WML).

It all seemed to make sense, but there was definitely more here than they would need, at least in this phase. The wireless compatibility, for one thing, wouldn't be necessary. Some of the attributes didn't have a lot of meaning either, such as hidden; these would most likely be ignored.

There were other registries that were similar: one for controllers, one for controls, one for skins, and one for media types. They were all structured similarly, containing entries called <skin-entry> and <media-type-entry>. They had a few different elements and attributes, but these were fairly intuitive. For example, the skins registry contained <property> elements that stored a name and hexadecimal or class values. These were likely styles and colors to control the output of the portal interface.

The purpose of this exercise was to plan how this aspect of the application would be used and also programmatically implemented. Because these were fairly straightforward documents, Victor felt that Macromedia Cold-Fusion's XML capabilities could be used to access information within registries. The portlet registries were the only ones that Victor would really use extensively, at least for now. With multiple portlet registries, different types of users could be associated with different registries. The registry a user had access to would define the portlets available to that user. For example, an administrative user would be able to access portlets to edit users and groups, but an ordinary user wouldn't. An anonymous user would only be able to access very public portlets—possibly only HTML-based portlets.

The skins, media type, and controller registries would be kept in place. Developers of related functions could use them if necessary, or ignore them if not.

User PSML Files

Next, Victor analyzed a user's PSML file. To start, all of the PSML files were stored in a protected directory called PSML. Within this directory, there were a number of subdirectories. Some seemed to make sense, such as users and groups, while others, such as anon and turbine, made less sense. The directories within these directories were even more numerous and ultimately a bit convoluted, but did display some sense of logic. Figure I-3.1 shows this directory structure.

Figure 3-1 Figure I-3.1 The users' PSML files are stored in a logical, if complex, directory structure.

Ultimately, Victor decided to simplify the PSML directory structure. There would be two main directories: groups and users. The groups directory would hold the default PSML profiles for a group, and users would contain all the PSML files for each user. Only HTML and nonlocalized portlets would be necessary to support, so many of the subdirectories (such as wml, for wireless portlets, and es for Spanish portlets) wouldn't need to be created.

As for the contents of the actual default.psml file, Victor looked at these (as well as the Jetspeed documentation) and made a note of the XML structure. Every file had the same basic elements:

<?xml version="1.0" encoding="iso-8859-1"?>
<portlets xmlns="
      <control name="TabControl"/>
      <controller name="CardPortletController">
        <parameter name="parameter" value="pane"/>
      <skin name="orange-grey"/>
          <controller name="RowColumnPortletController">
              <parameter name="sizes" value="66%,34%"/>
              <parameter name="mode" value="row"/>
               <title>Home Page</title>
              <controller name="RowColumnPortletController"/>
              <entry parent="JetspeedContent"/>
             <controller name="RowColumnPortletController"/>
             <entry parent="Jetspeed"/>
             <entry parent="Welcome"/>

The root element was the <portlets> element, Victor noted, and that <portlets> was also a child element; usually (though not in this example) multiple child <portlets> existed in each document. The names in the <control> elements matched items in the control registry. This was also true for all instances of both controller and skin elements, in regards to their registries. So these user files just stored metadata for each user. The actual data was stored in the registry, and these files simply served as lookups to store user information.

The <portlets> element was also a grandchild of the main <portlets> element. However, the <portlets> at this level had only a <controller> element and an <entry> element. It seemed that this could keep recursing. The controller defined how information would be displayed; the entries would then refer to the actual portlets (in one of the portlet registries) to render. This meant that a controller, say one that handled navigation, could actually have other controllers within it, such as a sub-navigation controller.

This was way too confusing for what they needed to do, Victor thought. Recursing wasn't necessary. Everything in this application was controlled using controllers, including the navigation. Victor decided that he would separate the navigation from the actual controllers. However, controllers would still be created to handle how the portlets would be displayed—for example, whether a page would have one, two, or three columns of portlets. And having multiple skins was too confusing; a single skin would be allowed for each user.

The bottom line, Victor concluded, was that PSML was a good way to store information, but there was no need to use everything it offered, or even to use it in the same way that Jetspeed used it. Of course, much of this would be determined by the tools.

Jetspeed API

Now that Victor had a good idea of what was available, he referred back to the API documents. He needed to find items that could help him read and write PSML files. However, what he discovered was that many of the classes developed for this purpose required that complex objects be passed to them. For example, the class seemed to be set up primarily to edit users' PSML documents. However, the create() method, which created a new PSMLDocument object, needed to be passed an object of type, or Profile. This is a common and useful technique in Java because all the information stored in the object passed can then be utilized by the method. However, the complexity of creating the Profile object simply added more to the process and would defeat the purpose of using Jetspeed—to speed up and simplify development. Eventually, Victor discovered that the org.apache.jetspeed.xml.api.portletmarkup.Portlets class contained a number of low-level utilities that could be used for reading these documents. Bingo!

Peachpit Promotional Mailings & Special Offers

I would like to receive exclusive offers and hear about products from Peachpit and its family of brands. I can unsubscribe at any time.


Pearson Education, Inc., 221 River Street, Hoboken, New Jersey 07030, (Pearson) presents this site to provide information about Peachpit products and services that can be purchased through this site.

This privacy notice provides an overview of our commitment to privacy and describes how we collect, protect, use and share personal information collected through this site. Please note that other Pearson websites and online products and services have their own separate privacy policies.

Collection and Use of Information

To conduct business and deliver products and services, Pearson collects and uses personal information in several ways in connection with this site, including:

Questions and Inquiries

For inquiries and questions, we collect the inquiry or question, together with name, contact details (email address, phone number and mailing address) and any other additional information voluntarily submitted to us through a Contact Us form or an email. We use this information to address the inquiry and respond to the question.

Online Store

For orders and purchases placed through our online store on this site, we collect order details, name, institution name and address (if applicable), email address, phone number, shipping and billing addresses, credit/debit card information, shipping options and any instructions. We use this information to complete transactions, fulfill orders, communicate with individuals placing orders or visiting the online store, and for related purposes.


Pearson may offer opportunities to provide feedback or participate in surveys, including surveys evaluating Pearson products, services or sites. Participation is voluntary. Pearson collects information requested in the survey questions and uses the information to evaluate, support, maintain and improve products, services or sites; develop new products and services; conduct educational research; and for other purposes specified in the survey.

Contests and Drawings

Occasionally, we may sponsor a contest or drawing. Participation is optional. Pearson collects name, contact information and other information specified on the entry form for the contest or drawing to conduct the contest or drawing. Pearson may collect additional personal information from the winners of a contest or drawing in order to award the prize and for tax reporting purposes, as required by law.


If you have elected to receive email newsletters or promotional mailings and special offers but want to unsubscribe, simply email

Service Announcements

On rare occasions it is necessary to send out a strictly service related announcement. For instance, if our service is temporarily suspended for maintenance we might send users an email. Generally, users may not opt-out of these communications, though they can deactivate their account information. However, these communications are not promotional in nature.

Customer Service

We communicate with users on a regular basis to provide requested services and in regard to issues relating to their account we reply via email or phone in accordance with the users' wishes when a user submits their information through our Contact Us form.

Other Collection and Use of Information

Application and System Logs

Pearson automatically collects log data to help ensure the delivery, availability and security of this site. Log data may include technical information about how a user or visitor connected to this site, such as browser type, type of computer/device, operating system, internet service provider and IP address. We use this information for support purposes and to monitor the health of the site, identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents and appropriately scale computing resources.

Web Analytics

Pearson may use third party web trend analytical services, including Google Analytics, to collect visitor information, such as IP addresses, browser types, referring pages, pages visited and time spent on a particular site. While these analytical services collect and report information on an anonymous basis, they may use cookies to gather web trend information. The information gathered may enable Pearson (but not the third party web trend services) to link information with application and system log data. Pearson uses this information for system administration and to identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents, appropriately scale computing resources and otherwise support and deliver this site and its services.

Cookies and Related Technologies

This site uses cookies and similar technologies to personalize content, measure traffic patterns, control security, track use and access of information on this site, and provide interest-based messages and advertising. Users can manage and block the use of cookies through their browser. Disabling or blocking certain cookies may limit the functionality of this site.

Do Not Track

This site currently does not respond to Do Not Track signals.


Pearson uses appropriate physical, administrative and technical security measures to protect personal information from unauthorized access, use and disclosure.


This site is not directed to children under the age of 13.


Pearson may send or direct marketing communications to users, provided that

  • Pearson will not use personal information collected or processed as a K-12 school service provider for the purpose of directed or targeted advertising.
  • Such marketing is consistent with applicable law and Pearson's legal obligations.
  • Pearson will not knowingly direct or send marketing communications to an individual who has expressed a preference not to receive marketing.
  • Where required by applicable law, express or implied consent to marketing exists and has not been withdrawn.

Pearson may provide personal information to a third party service provider on a restricted basis to provide marketing solely on behalf of Pearson or an affiliate or customer for whom Pearson is a service provider. Marketing preferences may be changed at any time.

Correcting/Updating Personal Information

If a user's personally identifiable information changes (such as your postal address or email address), we provide a way to correct or update that user's personal data provided to us. This can be done on the Account page. If a user no longer desires our service and desires to delete his or her account, please contact us at and we will process the deletion of a user's account.


Users can always make an informed choice as to whether they should proceed with certain services offered by Adobe Press. If you choose to remove yourself from our mailing list(s) simply visit the following page and uncheck any communication you no longer want to receive:

Sale of Personal Information

Pearson does not rent or sell personal information in exchange for any payment of money.

While Pearson does not sell personal information, as defined in Nevada law, Nevada residents may email a request for no sale of their personal information to

Supplemental Privacy Statement for California Residents

California residents should read our Supplemental privacy statement for California residents in conjunction with this Privacy Notice. The Supplemental privacy statement for California residents explains Pearson's commitment to comply with California law and applies to personal information of California residents collected in connection with this site and the Services.

Sharing and Disclosure

Pearson may disclose personal information, as follows:

  • As required by law.
  • With the consent of the individual (or their parent, if the individual is a minor)
  • In response to a subpoena, court order or legal process, to the extent permitted or required by law
  • To protect the security and safety of individuals, data, assets and systems, consistent with applicable law
  • In connection the sale, joint venture or other transfer of some or all of its company or assets, subject to the provisions of this Privacy Notice
  • To investigate or address actual or suspected fraud or other illegal activities
  • To exercise its legal rights, including enforcement of the Terms of Use for this site or another contract
  • To affiliated Pearson companies and other companies and organizations who perform work for Pearson and are obligated to protect the privacy of personal information consistent with this Privacy Notice
  • To a school, organization, company or government agency, where Pearson collects or processes the personal information in a school setting or on behalf of such organization, company or government agency.


This web site contains links to other sites. Please be aware that we are not responsible for the privacy practices of such other sites. We encourage our users to be aware when they leave our site and to read the privacy statements of each and every web site that collects Personal Information. This privacy statement applies solely to information collected by this web site.

Requests and Contact

Please contact us about this Privacy Notice or if you have any requests or questions relating to the privacy of your personal information.

Changes to this Privacy Notice

We may revise this Privacy Notice through an updated posting. We will identify the effective date of the revision in the posting. Often, updates are made to provide greater clarity or to comply with changes in regulatory requirements. If the updates involve material changes to the collection, protection, use or disclosure of Personal Information, Pearson will provide notice of the change through a conspicuous notice on this site or other appropriate way. Continued use of the site after the effective date of a posted revision evidences acceptance. Please contact us if you have questions or concerns about the Privacy Notice or any objection to any revisions.

Last Update: November 17, 2020