/*
* Copyright 2000-2001,2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jetspeed.om.profile;
import org.apache.jetspeed.om.profile.Portlets;
import org.apache.jetspeed.om.profile.Entry;
import java.util.Iterator;
/**
* This class represents a loaded PSML document in memory, providing
* all facilities for finding and updating specific parts of the
* document.
*
* @author <a href="mailto:raphael@apache.org">Rapha謖 Luta</a>
* @version $Id: BasePSMLDocument.java,v 1.9 2004/02/23 03:05:01 jford Exp $
*/
public class BasePSMLDocument implements PSMLDocument
{
/**
* The name of this PSML document, will be typically the URL of the file
* for file-based implementations
*/
private String name = null;
/**
* The PortletSet descriptions that make up this document
*/
private Portlets portlets = null;
/**
* Construct a new empty PSMLDocument
*/
public BasePSMLDocument()
{
// empty constructor
}
/**
* Construct a new named PSMLDocument associated with the specified
* PSML portlet set description
*
* @param name the name of this document
* @param portlets the PSML memory structure
*/
public BasePSMLDocument( String name, Portlets portlets )
{
this.name = name;
this.portlets = portlets;
}
/**
* Return the name of this document
*/
public final String getName()
{
return this.name;
}
/**
* Sets a new name for this document
*
* @param name the new document name
*/
public final void setName(String name)
{
this.name = name;
}
/**
* Return ths portlet set PSML description of this document
*
* @return a PSML object model hierarchy, or null if none is
* defined for this document
*/
public final Portlets getPortlets()
{
return this.portlets;
}
/**
* Sets a new PSML object model for this document
*
* @param portlets the PSML object model
*/
public final void setPortlets(Portlets portlets)
{
this.portlets = portlets;
}
/** Returns the first entry in the current PSML resource corresponding
* to the given portlet name
*
* @param name the portlet name to seek
* @return the found entry description or null
*/
public Entry getEntry(String name)
{
return getEntry(this.portlets, name);
}
/** Returns the first entry in the current PSML resource corresponding
* to the given entry id
*
* @param entryId the portlet's entry id to seek
* @return the found entry description or null
*/
public Entry getEntryById(String entryId)
{
return getEntryById(this.portlets, entryId);
}
/** Returns the first portlets element in the current PSML resource corresponding
* to the given name
*
* @param name the portlets name to seek
* @return the found portlets description or null
*/
public Portlets getPortlets(String name)
{
Portlets p = getPortlets(this.portlets, name);
if (p == null)
{
//maybe name is a position...
try
{
p = getPortlets(Integer.parseInt(name));
}
catch (NumberFormatException e)
{
// this will happen if name is not parseable, ignore
}
}
return p;
}
/** Returns the first portlets element in the current PSML resource corresponding
* to the given id
*
* @param name the portlets id to seek
* @return the found portlets description or null
*/
public Portlets getPortletsById(String portletId)
{
Portlets p = getPortletsById(this.portlets, portletId);
return p;
}
/** Returns the first portlets element in the current PSML resource
* found at the specified position. The position is computed using
* a left-most tree traversal algorithm of the existing portlets (thus
* not counting other entry objects)
*
* @param position the sought position
* @return the found portlets object or null if we did not find such an
* object
*/
public Portlets getPortlets(int position)
{
return getPortlets(this.portlets, position, 0);
}
/** Returns the first entry in the specified PSML resource corresponding
* to the given portlet name
*
* @param portlets the PSML description to look into
* @param name the portlet name to seek
* @return the found entry description or null
*/
public static Entry getEntry(Portlets portlets, String name)
{
Entry entry = null;
for (Iterator it1 = portlets.getEntriesIterator(); it1.hasNext(); )
{
entry = (Entry) it1.next();
if (entry.getParent().equals (name))
return (entry);
}
entry = null;
for (Iterator it2 = portlets.getPortletsIterator(); it2.hasNext(); )
{
Portlets p = (Portlets) it2.next();
entry = getEntry(p, name);
if (entry != null)
break;
}
return (entry);
}
/** Returns the first entry in the specified PSML resource corresponding
* to the given portlet Id
*
* @param portlets the PSML description to look into
* @param entryId the portlet's entry id to seek
* @return the found entry description or null
*/
public static Entry getEntryById(Portlets portlets, String entryId)
{
Entry entry = null;
for (Iterator it1 = portlets.getEntriesIterator(); it1.hasNext(); )
{
entry = (Entry) it1.next();
if ((entry.getId()!=null) && entry.getId().equals (entryId))
return (entry);
}
entry = null;
for (Iterator it2 = portlets.getPortletsIterator(); it2.hasNext(); )
{
Portlets p = (Portlets) it2.next();
entry = getEntryById(p, entryId);
if (entry != null)
break;
}
return (entry);
}
/** Returns the first portlets element in the specified PSML resource corresponding
* to the given Id
*
* @param portlets the PSML description to look into
* @param portletId the portlet's id to seek
* @return the found portlets description or null
*/
public static Portlets getPortletsById(Portlets portlets, String portletId)
{
Portlets entry = portlets;
if ( (entry.getId()!=null) && entry.getId().equals(portletId) )
{
return entry;
}
entry = null;
for (Iterator it2 = portlets.getPortletsIterator(); it2.hasNext(); )
{
Portlets p = (Portlets) it2.next();
entry = getPortletsById(p, portletId);
if (entry != null) break;
}
return (entry);
}
/** Returns the first portlets element in the specified PSML resource corresponding
* to the given name
*
* @param portlets the PSML description to look into
* @param name the portlets name to seek
* @return the found portlets description or null
*/
public static Portlets getPortlets(Portlets portlets, String name)
{
Portlets entry = portlets;
if ( (entry.getName()!=null) && entry.getName().equals(name) )
{
return entry;
}
entry = null;
for (Iterator it2 = portlets.getPortletsIterator(); it2.hasNext(); )
{
Portlets p = (Portlets) it2.next();
entry = getPortlets(p, name);
if (entry != null) break;
}
return (entry);
}
/** Returns the first portlets element in the specified PSML resource
* in the given position
*
* @param portlets the PSML description to look into
* @param position the position to look for
* @param count the numbering for the portlets passed as parameter
* @return the found portlets description or null
*/
public static Portlets getPortlets(Portlets portlets, int position, int count)
{
// sanity check, we never look after the sought position
if (position < count)
{
return null;
}
// the base portlets is the one we're looking for...
if (position == count)
{
return portlets;
}
// we need to recurse in the children
Portlets result = null;
for (Iterator it2 = portlets.getPortletsIterator(); it2.hasNext(); )
{
Portlets p = (Portlets) it2.next();
count++;
result = getPortlets(p, position, count);
if (result != null) break;
}
return result;
}
/**
* Remove the Entry in the specified PSML resource corresponding
* to the given portlet Id
*
* @param entryId the portlet's entry id to seek
*/
public boolean removeEntryById(String entryId)
{
return removeEntryById(this.portlets, entryId);
}
/**
* Remove the Entry in the specified PSML resource corresponding
* to the given portlet Id
*
* @param portlets the PSML description to look into
* @param entryId the portlet's entry id to seek
*/
public static boolean removeEntryById(Portlets portlets, String entryId)
{
for (int i=0; i < portlets.getEntryCount(); i++)
{
if ( entryId.equals(portlets.getEntry(i).getId()) )
{
portlets.removeEntry(i);
return true;
}
}
for (Iterator it2 = portlets.getPortletsIterator(); it2.hasNext(); )
{
Portlets p = (Portlets) it2.next();
if (removeEntryById(p, entryId) == true)
return true;
}
return false;
}
/**
* Create a clone of this object
*/
public Object clone()
throws java.lang.CloneNotSupportedException
{
Object cloned = super.clone();
// clone the portlets
((BasePSMLDocument)cloned).portlets = ((this.portlets == null) ? null : (Portlets) this.portlets.clone());
return cloned;
}
}