taylor 01/05/07 23:26:12 Added: src/java/org/apache/jetspeed/util/customization AllowableColumnSet.java AllowablePortletSet.java CustomizerException.java CustomizerResources.java ElementNotFoundException.java JetspeedColors.java PSMLDocument.java PSMLEntry.java UserNotLoggedInException.java Log: adding Glucode customizer for 1.3a2 Revision Changes Path 1.1 jakarta-jetspeed/src/java/org/apache/jetspeed/util/customization/AllowableColumnSet.java Index: AllowableColumnSet.java =================================================================== package org.apache.jetspeed.util.customization; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Jetspeed" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" or * "Apache Jetspeed", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ // Java import java.util.*; // Required Turbine classes import org.apache.turbine.util.RunData; import org.apache.turbine.util.Log; /** * This class represents all the allowable layout columns for a given user. * * @author <a href="mailto:[EMAIL PROTECTED]">Van Truong </a> * @author <a href="mailto:[EMAIL PROTECTED]">Ernest Ros </a> * @version $Id: AllowableColumnSet.java,v 1.1 2001/05/08 06:26:09 taylor Exp $ * */ public class AllowableColumnSet { // Allowable Columns private final int maxAllowableColumn = 3; // Column Attributes public static final int HEADINGCOLOR = 0; public static final int BACKGROUNDCOLOR = 1; private String[] defaultHeadingColors = null; private String[] defaultBackgroundColors = null; private String[] columnDescription = null; // User Atributes private RunData data = null; public AllowableColumnSet(RunData data) throws Exception { this.data = data; refresh(); } //end AllowablePortletSet /** *Refreshes the attributes of the object. * */ public void refresh() throws CustomizerException, java.io.FileNotFoundException, UserNotLoggedInException, ElementNotFoundException { PSMLDocument psmlDoc = new PSMLDocument(data); defaultHeadingColors = new String[maxAllowableColumn]; defaultBackgroundColors = new String[maxAllowableColumn]; columnDescription = new String[]{"Left Column", "Middle Column", "Right Column"}; for (int i=0; i<maxAllowableColumn; i++) { defaultHeadingColors[i] = psmlDoc.getTitleColor(new int[]{i}); defaultBackgroundColors[i] = psmlDoc.getBackgroundColor(new int[]{i}); } } //end refresh /** * Set the color for the column. * * @param column int representing column number. * @param columnAttr int representing the column's attribute, such as * AllowableColumnSet.HEADINGCOLOR or AllowableColumnSet.BACKGROUNDCOLOR. * * @throws Exception if the column or the column's attribute is invalid. */ public void setColor(int column, int columnAttr, String color) throws ArrayIndexOutOfBoundsException, CustomizerException { switch (columnAttr) { case HEADINGCOLOR: { defaultHeadingColors[column] = color; break; } case BACKGROUNDCOLOR: { defaultBackgroundColors[column] = color; break; } default: { throw new CustomizerException("The column attribute is invalid."); } } //end switch } //end setColor /** * Get the color for the column. * * @param column int representing column number. * @param columnAttr int representing the column's attribute, such as * AllowableColumnSet.HEADINGCOLOR or AllowableColumnSet.BACKGROUNDCOLOR. * @return String The hexidecimal value of this color. * @throws Exception if the column or the column's attribute is invalid. */ public String getColor(int column, int columnAttr) throws ArrayIndexOutOfBoundsException, CustomizerException { switch (columnAttr) { case HEADINGCOLOR: { return defaultHeadingColors[column]; } case BACKGROUNDCOLOR: { return defaultBackgroundColors[column]; } default: { throw new CustomizerException("The column attribute is invalid."); } } //end switch } //end getColor /** * Get the column description. * * @param column int representing column number. * @return String Description of this column. * @throws Exception if the column is invalid. */ public String getColumnDescription(int column) throws ArrayIndexOutOfBoundsException { return columnDescription[column]; } //end getColor /** * Return the maximum columns allowed for the user's layout. * * @return int Maximum columns allowed. */ public int getMaximumNumOfColumnAllowed() { return maxAllowableColumn; } //end getMaximumNumOfColumnAllowed } //end class AllowableColumnSet 1.1 jakarta-jetspeed/src/java/org/apache/jetspeed/util/customization/AllowablePortletSet.java Index: AllowablePortletSet.java =================================================================== package org.apache.jetspeed.util.customization; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Jetspeed" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" or * "Apache Jetspeed", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ // Java import java.util.*; // Required Turbine classes import org.apache.turbine.util.RunData; import org.apache.turbine.util.Log; // Jetspeed import org.apache.jetspeed.services.resources.JetspeedResources; import org.apache.jetspeed.cache.disk.*; import org.apache.jetspeed.util.*; import org.apache.jetspeed.xml.api.jetspeedconfig.JetspeedConfig; import org.apache.jetspeed.om.registry.EntryFactory; import org.apache.jetspeed.om.registry.peer.PortletEntry; /** * This class represents all the allowable portlets for a given user, including those that * are within the user's psml file and those that are mandatory for this user. * * @author <a href="mailto:[EMAIL PROTECTED]">Van Truong </a> * @author <a href="mailto:[EMAIL PROTECTED]">Ernest Ros </a> * @version $Id: AllowablePortletSet.java,v 1.1 2001/05/08 06:26:10 taylor Exp $ * */ public class AllowablePortletSet { private Hashtable portletEntry = new Hashtable(); // PortletEntryWrapper private RunData data = null; // User data public AllowablePortletSet(RunData data) throws ElementNotFoundException, CustomizerException, Exception { this.data = data; refresh(); } //end AllowablePortletSet /** * Return a PortletEntry when given a portlet name. * * @param name The name of the PortletEntry. * @return PortletEntry if the given name is mapped to an existing PortletEntry, else null. * @throws ElementNotFoundException if the portlet does not exist in this allowable set. */ public PortletEntry getPortletEntry(String name) throws ElementNotFoundException { PortletEntryWrapper pw = (PortletEntryWrapper)portletEntry.get(name); if (pw == null) { Log.error("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); throw new ElementNotFoundException("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); } return pw.getPortletEntry(); } //end getPortletEntry /** * Reset all the user's default portlet to only include the mandatory ones. * */ public void resetAllUserDefaultPortlets() { Enumeration elements = portletEntry.elements(); while (elements.hasMoreElements()) { PortletEntryWrapper pw = (PortletEntryWrapper)elements.nextElement(); pw.setAsUserDefaultPortlet(pw.isMandatoryPortlet()); } } //resetAllUserDefaultPortlets /** * Set the give portlet name as a the user's default portlet. * * @param name The name of a portlet. * @throws ElementNotFoundException if the portlet does not exist in this allowable set. */ public void setPortletAsUserDefault(String name) throws ElementNotFoundException { try { PortletEntryWrapper pw = (PortletEntryWrapper)portletEntry.get(name); pw.setAsUserDefaultPortlet(true); } catch (NullPointerException n) { Log.error("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); throw new ElementNotFoundException("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); } } //end setPortletAsUserDefault /** * Given the portlet name, if it is the user default portlet, returns its position within a column. * * @param The name of the portlet. * @return An int representing the position of this portlet. * @throws ElementNotFoundException if the portlet does not exist in this allowable set or * CustimizerException if the portlet is not register to the user. */ public int getUserDefaultPortletPosition(String name) throws ElementNotFoundException, CustomizerException { try { PortletEntryWrapper pw = (PortletEntryWrapper)portletEntry.get(name); if (!pw.isUserDefaultPortlet()) { Log.error("The portlet name, " + name + ", is currently not registered to user " + data.getUser().getUserName() + "."); throw new CustomizerException("The portlet name, " + name + ", is currently not registered to user " + data.getUser().getUserName() + "."); } return pw.getPortletPosition(); } catch (NullPointerException n) { Log.error("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); throw new ElementNotFoundException("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); } } //end getUserDefaultPortletPosition /** * Given the portlet name, if it is the user default portlet, returns its column. * * @param The name of the portlet. * @return An int representing the column of this portlet. * @throws ElementNotFoundException if the portlet does not exist in this allowable set or * CustimizerException if the portlet is not register to the user. */ public int getUserDefaultPortletColumn(String name) throws ElementNotFoundException, CustomizerException { try { PortletEntryWrapper pw = (PortletEntryWrapper)portletEntry.get(name); if (!pw.isUserDefaultPortlet()) { Log.error("The portlet name, " + name + ", is currently not registered to user " + data.getUser().getUserName() + "."); throw new CustomizerException("The portlet name, " + name + ", is currently not registered to user " + data.getUser().getUserName() + "."); } return pw.getPortletColumn(); } catch (NullPointerException n) { Log.error("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); throw new ElementNotFoundException("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); } } //end getUserDefaultPortletColumn /** *Return the names of portlets that the user selected as his/her set of default portlets. * *@return String[] of portlet names. */ public String[] getUserDefaultPortletNames() { Enumeration elements = portletEntry.elements(); LinkedList list = new LinkedList(); while (elements.hasMoreElements()) { PortletEntryWrapper pw = (PortletEntryWrapper)elements.nextElement(); if (pw.isUserDefaultPortlet()) { list.add(pw.getPortletEntry().getName()); } } //end while if (list.size() == 0) { return new String[0]; } else { String[] portlets = new String[list.size()]; for (int i=0; i<list.size(); i++) { portlets[i] = (String)list.get(i); } return portlets; } //end if-else } //getUserDefaultPortletNames /** * Return the description for the portlet with the given name. * * @return String description of the portlet. * @throws ElementNotFoundException if the portlet does not exist in this allowable set. */ public String getPortletDescription(String name) throws ElementNotFoundException { try { PortletEntryWrapper pw = (PortletEntryWrapper)portletEntry.get(name); return pw.getPortletEntry().getMetaInfo().getDescription(); } catch (NullPointerException n) { Log.error("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); throw new ElementNotFoundException("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); } } //end getPortletDescription /** * Return the title for the portlet with the given name. * * @return String title of the portlet. * @throws ElementNotFoundException if the portlet does not exist in this allowable set. */ public String getPortletTitle(String name) throws ElementNotFoundException { try { PortletEntryWrapper pw = (PortletEntryWrapper)portletEntry.get(name); String title = pw.getPortletEntry().getMetaInfo().getTitle(); if (title == null || title.trim().equals("")) { return name; } return title; } catch (NullPointerException n) { Log.error("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); throw new ElementNotFoundException("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); } } //end getPortletTitle /** * Get the allowable portlet set from the config file and store the entries in * this object's hashtable. * * @throws ElementNotFoundException if no entry are found or CustomizerException if any other exceptions occur. */ private void loadPortletEntryFromJetspeedConfigFile() throws ElementNotFoundException, CustomizerException { try { // Read from the Jetspeed config file // FIXME: this needs to be converted over to the new Registry interface String url = JetspeedResources.getString("services.RegistryManager.url"); DiskCacheEntry pde = JetspeedDiskCache.getInstance().getEntry(url); JetspeedConfig jetspeedConfig = JetspeedConfig.unmarshal(pde.getReader()); // Get the PortletEntry org.apache.jetspeed.xml.api.jetspeedconfig.PortletEntry[] xml_pe = jetspeedConfig.getPortletRegistry().getPortletEntry(); for (int i=0; i<xml_pe.length; i++) { PortletEntry reg_pe = EntryFactory.getEntry(xml_pe[i]); if (!reg_pe.getType().equals(PortletEntry.TYPE_ABSTRACT) && !reg_pe.getType().equals(PortletEntry.TYPE_UNKNOWN)) { portletEntry.put(reg_pe.getName(), new PortletEntryWrapper(reg_pe)); } } //end for } catch (NullPointerException n) { // This might occur when xml_pe is null or xml_pe[i] is null Log.error("Error, unable to retrieve PortletEntry from the Jetspeed config file."); throw new ElementNotFoundException("Error, unable to retrieve PortletEntry from the Jetspeed config file."); } catch (Exception e) { Log.error(e.toString() + "\n Invalid PortletEntry encountered."); throw new CustomizerException(e.toString() + "\n Invalid PortletEntry encountered."); } //end try-catch if (portletEntry.size() == 0) { Log.error("Error, unable to retrieve the PortletEntry."); throw new ElementNotFoundException("Error, unable to retrieve the PortletEntry."); } } //end getPortletEntryFromJetspeedConfigFile /** * Set the user default portlets. * * @throws Exception if the user psml document object is null. */ private void setUserPortletsData() throws Exception { PSMLDocument psmlDoc = new PSMLDocument(this.data); if (psmlDoc == null) { Log.error("The allowable portlet set for this user is not retrievable " + "because of possible error/s within the user's psml file."); throw new Exception("The allowable portlet set for this user is not retrievable " + "because of possible error/s within the user's psml file."); } Enumeration en = this.portletEntry.elements(); while(en.hasMoreElements()) { PortletEntryWrapper pw = (PortletEntryWrapper)en.nextElement(); if (psmlDoc.inDocument(pw.getPortletEntry().getName())) { PSMLEntry psmlEntry = psmlDoc.getPSMLEntry(pw.getPortletEntry().getName()); pw.setAsUserDefaultPortlet(true); pw.setPortletColumn(psmlEntry.getCoordinates()[0]); pw.setPortletPosition(psmlEntry.getPosition()); } } //end while } //end setUserPortletData /** * Set the madatory portlets. * * Note: Should we throw an exception if the mandatory portlet does not exist in the config file? */ private void setMandatoryPortlet() { String mandatory = JetspeedResources.getString(JetspeedResources.MANDATORY_PORTLET); if (mandatory != null) { StringTokenizer st = new StringTokenizer(mandatory.trim(), " "); while (st.hasMoreTokens()) { PortletEntryWrapper pw = (PortletEntryWrapper)portletEntry.get(st.nextToken().trim()); if (pw != null) { pw.setAsMandatoryPortlet(true); pw.setAsUserDefaultPortlet(true); } } //end while } //end if } //end setMandatoryPortlet /** * Get the names of the allowable portlet set. * */ public String[] getAllowablePortletNames() { Enumeration elements = portletEntry.keys(); String[] names = new String[portletEntry.size()]; for (int i=0; i<names.length; i++) { names[i] = (String)elements.nextElement(); } return names; } //end getAllowablePortletNames /** * Refresh the data within this object * * @throws Exception if an error occurs. */ public void refresh() throws ElementNotFoundException, CustomizerException, Exception { portletEntry.clear(); loadPortletEntryFromJetspeedConfigFile(); setUserPortletsData(); setMandatoryPortlet(); } //end refresh /** * Verify if the given portlet name is within the user's set of default portlet. * * @param String name of the portlet. */ public boolean isUserDefaultPortlet(String name) throws ElementNotFoundException, Exception { try { PortletEntryWrapper pw = (PortletEntryWrapper)portletEntry.get(name); return pw.isUserDefaultPortlet(); } catch (NullPointerException n) { Log.error("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); throw new ElementNotFoundException("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); } } //end isUserDefaultPortlet /** * Verify if the given portlet name is a mandatory portlet. * * @param String name of the portlet. */ public boolean isMandatoryPortlet(String name) throws ElementNotFoundException, Exception { try { PortletEntryWrapper pw = (PortletEntryWrapper)portletEntry.get(name); return pw.isMandatoryPortlet(); } catch (Exception e) { Log.error("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); throw new ElementNotFoundException("The portlet name, " + name + ", is not within user " + data.getUser().getUserName() + "'s allowable portlet set."); } } //end isMandatoryPortlet /** * Use as a data structure to hold additional information for PortletEntry. */ private class PortletEntryWrapper { private PortletEntry pe = null; private boolean defaultPortlet = false; // Indicates user's default PE private boolean mandatoryPortlet = false; // Indicates mandatory PE private int portletCol = -1; // PE col number. private int portletPos = -1; // PE row number. public PortletEntryWrapper(PortletEntry portletEntry) { this.pe = portletEntry; } public PortletEntry getPortletEntry() { return this.pe; } public boolean isUserDefaultPortlet() { return this.defaultPortlet; } public boolean isMandatoryPortlet() { return mandatoryPortlet; } public void setAsUserDefaultPortlet(boolean b) { this.defaultPortlet = b; } public void setAsMandatoryPortlet(boolean b) { this.mandatoryPortlet = b; } public int getPortletPosition() { return this.portletPos; } public int getPortletColumn() { return this.portletCol; } public void setPortletPosition(int pos) { this.portletPos = pos; } public void setPortletColumn(int col) { this.portletCol = col; } } //end PortletEntryWrapper } //end class AllowablePortletSet 1.1 jakarta-jetspeed/src/java/org/apache/jetspeed/util/customization/CustomizerException.java Index: CustomizerException.java =================================================================== package org.apache.jetspeed.util.customization; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Jetspeed" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" or * "Apache Jetspeed", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ /** * This class represents all the allowable portlets for a given user, including those that * are within the user's psml file and those that are mandatory for this user. * * @author <a href="mailto:[EMAIL PROTECTED]">Peter Yoo </a> * @author <a href="mailto:[EMAIL PROTECTED]">Ernest Ros </a> * @version $Id: CustomizerException.java,v 1.1 2001/05/08 06:26:10 taylor Exp $ * */ public class CustomizerException extends Exception { public CustomizerException() { super(); } public CustomizerException(String msg) { super(msg); } } 1.1 jakarta-jetspeed/src/java/org/apache/jetspeed/util/customization/CustomizerResources.java Index: CustomizerResources.java =================================================================== package org.apache.jetspeed.util.customization; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Jetspeed" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" or * "Apache Jetspeed", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ /** * Resource class providing static keys to use by the customization classes. * * @author <a href="mailto:[EMAIL PROTECTED]">Peter Yoo </a> * @author <a href="mailto:[EMAIL PROTECTED]">Ernest Ros </a> * @version $Id: CustomizerResources.java,v 1.1 2001/05/08 06:26:10 taylor Exp $ * */ public class CustomizerResources { public static final String CUSTOMIZATIONPREFIX = "CUSTOMIZATION:"; public static final String PORTLET = CUSTOMIZATIONPREFIX + "PORTLET"; public static final String ALLOWABLEPORTLETSET = CUSTOMIZATIONPREFIX + "ALLOWABLEPORTLETSET"; public static final String ALLOWABLECOLUMNSET = CUSTOMIZATIONPREFIX + "ALLOWABLECOLUMNSET"; public static final String CUSTOMIZERSCREEN1 = "Customizer1"; public static final String CUSTOMIZERSCREEN2 = "Customizer2"; public static final String CUSTOMIZERACTION1 = "CustomizeUserPSMLFile"; public static final String CHECKBOXPREFIX = CUSTOMIZATIONPREFIX + "CHECKBOX"; public static final String SELECTBOXPREFIX = CUSTOMIZATIONPREFIX + "SELECTBOX"; public static final String COLUMNPREFIX = CUSTOMIZATIONPREFIX + "COLUMN"; public static final String ROWPREFIX = CUSTOMIZATIONPREFIX + "ROW"; public static final String PREVIOUSSCREEN = CUSTOMIZATIONPREFIX + "PREVIOUS-SCREEN"; public static final String COLORS = CUSTOMIZATIONPREFIX + "COLOR"; public static final String HEADINGCOLOR = CUSTOMIZATIONPREFIX + "HEADING-COLOR"; public static final String BACKGROUNDCOLOR = CUSTOMIZATIONPREFIX + "BACKGROUND-COLOR"; } //end CustomizerResources 1.1 jakarta-jetspeed/src/java/org/apache/jetspeed/util/customization/ElementNotFoundException.java Index: ElementNotFoundException.java =================================================================== package org.apache.jetspeed.util.customization; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Jetspeed" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" or * "Apache Jetspeed", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ /** * * @author <a href="mailto:[EMAIL PROTECTED]">Peter Yoo </a> * @author <a href="mailto:[EMAIL PROTECTED]">Ernest Ros </a> * @version $Id: ElementNotFoundException.java,v 1.1 2001/05/08 06:26:11 taylor Exp $ * */ public class ElementNotFoundException extends Exception { public ElementNotFoundException() { super(); } public ElementNotFoundException(String msg) { super(msg); } } 1.1 jakarta-jetspeed/src/java/org/apache/jetspeed/util/customization/JetspeedColors.java Index: JetspeedColors.java =================================================================== package org.apache.jetspeed.util.customization; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Jetspeed" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" or * "Apache Jetspeed", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ import org.apache.jetspeed.services.resources.JetspeedResources; import org.apache.turbine.util.Log; /** * * JetspeedColors loads all the html colors defined in the JetspeedProperties * file. These colors are defined with both names and hexidecimal values. * @author <a href="mailto:[EMAIL PROTECTED]">Peter Yoo </a> * @author <a href="mailto:[EMAIL PROTECTED]">Ernest Ros </a> * @version $Id: JetspeedColors.java,v 1.1 2001/05/08 06:26:11 taylor Exp $ * */ public class JetspeedColors { private String[] hexColors; private String[] colorNames; private int size; /** * This constructor stores the colors defined in the JetspeedResources.properties * file into 2 private String arrays. */ public JetspeedColors() throws CustomizerException { String hexColorKey = JetspeedResources.HTML_HEX_COLOR_KEY; String colorNameKey = JetspeedResources.HTML_COLOR_NAME_KEY; // Get the colors from the JetspeedResources.properties file and store them // in memory. this.hexColors = this.getValues(hexColorKey); this.colorNames = this.getValues(colorNameKey); // Checksum if (this.hexColors.length != this.colorNames.length) throw new CustomizerException("The number of hexadecimal color values differs from the " + "number of color names. Each color must have a name and vice versa."); if (this.hexColors.length == 0) throw new CustomizerException("Colors have not been defined in " + "JetspeedResources.properties!" + "\n use the keys: " + hexColorKey + ".x and " + colorNameKey + ".x"); this.size = this.hexColors.length; this.sort(); }// end constructor /** * getHexColor() A simple getter method. */ public String getHexColor(int i) { if (0 <= i && i < this.size) { return this.hexColors[i]; } return null; }// end getHexColor() /** * getColorNames() A simple getter method. */ public String getColorName(int i) { if (0 <= i && i < this.size) { return this.colorNames[i]; } return null; }// end getColorName() /** * getColorName() Returns the name of the color that corresponds to the hex * value given. */ public String getColorName(String hexVal) throws ElementNotFoundException { for (int i=0; i<this.hexColors.length; i++) { if (hexVal.toLowerCase().equals(this.hexColors[i].toLowerCase())) { return this.colorNames[i]; }// end if }// end for // Nothing was found. throw new ElementNotFoundException("The name for color: " + hexVal + "was not found."); }// end getColorName() /** * getHexValue() Returns the hex value of the color that corresponds to * to the color name given. */ public String getHexValue(String name) throws ElementNotFoundException { for (int i=0; i<this.colorNames.length; i++) { if (name.toLowerCase().equals(this.colorNames[i].toLowerCase())) { return this.hexColors[i]; }// end if }// end for // Nothing was found. throw new ElementNotFoundException("The hex value for color: " + name + "was not found."); }// end getColorName() /** * getSize() A simple getter method. */ public int getSize() { return this.size; } /** * This version of getValues is the initiator method for the recursive version * of the method. */ private String[] getValues(String key) { return this.getValues(key, 1); }// end getValues() /** * getValues recursively extracts the indicated data elements from the * JetspeedResources.properties file. */ private String[] getValues(String key, int depth) { // Get the value. String theValue = JetspeedResources.getString(key+depth); // Test the value returned. if (theValue == null || theValue.trim().equals("")) // There are no further values available, return null. return null; //end if // Recursively retrieve the later values. String[] values = this.getValues(key, depth+1); // If this is the last element, then a new array must be created. if (values == null){ values = new String[depth]; }// end if // Insert the value into the result array. values[depth-1] = theValue; return values; }// end getValues() /** * This method sorts the colors by name. */ private void sort() { this.sort(0, this.size-1); }// end sort() /** * sort by Quicksort */ private void sort(int start, int end) { if (start < end) { int left = start; int right = end; int pivot = left; String holder = null; while (left < right) { while (this.colorNames[left].compareToIgnoreCase(this.colorNames[pivot]) <= 0) left++; while (this.colorNames[right].compareToIgnoreCase(this.colorNames[pivot]) > 0) right--; if (left < right) { holder = this.colorNames[left]; this.colorNames[left] = this.colorNames[right]; this.colorNames[right] = holder; holder = this.hexColors[left]; this.hexColors[left] = this.hexColors[right]; this.hexColors[right] = holder; }// end if }// end while holder = this.colorNames[pivot]; this.colorNames[pivot] = this.colorNames[right]; this.colorNames[right] = holder; holder = this.hexColors[pivot]; this.hexColors[pivot] = this.hexColors[right]; this.hexColors[right] = holder; this.sort(start, right-1); this.sort(right+1, end); }// end if }// end sort() }// end class JetspeedColors 1.1 jakarta-jetspeed/src/java/org/apache/jetspeed/util/customization/PSMLDocument.java Index: PSMLDocument.java =================================================================== package org.apache.jetspeed.util.customization; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Jetspeed" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" or * "Apache Jetspeed", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ // Basic Java stuff import java.io.*; import org.apache.turbine.util.RunData; import org.apache.jetspeed.xml.api.portletmarkup.Portlets; import org.apache.jetspeed.xml.api.portletmarkup.Entry; // For portlets marshalling. import org.apache.jetspeed.services.resources.JetspeedResources; import org.apache.jetspeed.cache.disk.DiskCacheEntry; import org.apache.jetspeed.cache.disk.JetspeedDiskCache; import org.apache.jetspeed.portal.factory.PortletSetFactory; import org.apache.jetspeed.portal.PortletSet; import org.apache.jetspeed.xml.api.portletmarkup.Skin; import org.apache.jetspeed.xml.api.portletmarkup.Property; import org.apache.jetspeed.xml.api.portletmarkup.Layout; import org.apache.jetspeed.util.PSMLManager; import org.apache.jetspeed.util.MimeType; import org.apache.jetspeed.profiler.*; // Turbine import org.apache.turbine.om.security.User; import org.apache.turbine.util.Log; // Castor import org.exolab.castor.xml.ValidationException; import org.exolab.castor.xml.MarshalException; /** * * PSMLDocument is a class that represents the psml document itself. This class * will fetch the user psml document in the RunData object. After modifications * have been made, it can write the document back to the original file or to a * new file. * * @author <a href="mailto:[EMAIL PROTECTED]">Peter Yoo </a> * @author <a href="mailto:[EMAIL PROTECTED]">Ernest Ros </a> * @version $Id: PSMLDocument.java,v 1.1 2001/05/08 06:26:11 taylor Exp $ * */ public class PSMLDocument { private JetspeedColors jColors; private RunData rundata; private Portlets portlets; private DiskCacheEntry diskEntry; private String psmlFileName; private String psmlFilePath; // The UserProfiler that handles conversions by MimeTypes private static MultiDeviceUserProfiler profiler = null; static { profiler = new MultiDeviceUserProfiler(); } /** * The constructor extracts the Jetspeed configuration information to locate * the psml file to be read. The Porlets class then unmarshals the file. */ public PSMLDocument(RunData rdata) throws CustomizerException, FileNotFoundException, UserNotLoggedInException { // Create a JetspeedColors object. this.jColors = new JetspeedColors(); // Set the default file name in case it is needed. String defaultFileName = JetspeedResources.getString(JetspeedResources.PSML_DEFAULT_USER_KEY) + ".psml"; // Set rundata this.rundata = rdata; // Determine the name of this user's psml file. User theUser = this.rundata.getUser(); if (theUser.hasLoggedIn()) { this.psmlFileName = theUser.getUserName() + ".psml"; } else throw new UserNotLoggedInException("The user must log in before attempting to" + " customize preferences."); // end if-else // Set the location of the psml files. this.psmlFilePath = JetspeedResources.getString(JetspeedResources.PSML_BASE_URL_KEY); MimeType mimetype = new MimeType("text/html"); String psmlURL = profiler.getUserURL( rundata.getUser().getUserName(), mimetype.HTML ); try { DiskCacheEntry pde = JetspeedDiskCache.getInstance().getEntry( psmlURL ); Reader theReader; try { // Open the user's psml file. theReader = pde.getReader(); } catch (FileNotFoundException fnfe) { pde = JetspeedDiskCache.getInstance().getEntry( this.psmlFilePath + defaultFileName ); theReader = pde.getReader(); }// end try-catch try { // Unmarshal the PSML file and build the portlets object. this.portlets = Portlets.unmarshal(theReader); } catch (ValidationException ve) { throw new CustomizerException("The psml file is invalid."); } catch (MarshalException me) { throw new CustomizerException("An error occurred while reading the psml " + "file."); } } catch (Exception e) { Log.error("PSMLDocument: Error reading PSML", e); } }// end constructor /** * getEntry finds the Entry object in the portlets object with the name * given. getEntry then packages the entry into a PSMLEntry object so it can * include the positioning information for the indicated Entry. */ public PSMLEntry getPSMLEntry(String portletName) throws ElementNotFoundException { return this.find(portletName, this.portlets); }// end PSMLEntry() /** * addPSMLEntry adds an entry to the portlets object indicated by the * coordinates of the PSMLEntry object passed in. */ public void addPSMLEntry(PSMLEntry theEntry) throws CustomizerException { Portlets thePortlets = null; try { // Get the "parent" portlets object. thePortlets = this.getPortletsObject(theEntry.getCoordinates()); } catch (ElementNotFoundException enf) { enf.printStackTrace(); throw new CustomizerException("The coordinates of the entry are invalid."); }// end try-catch // Add the new Entry. thePortlets.addEntry(theEntry.getEntry()); }// end addPSMLEntry /** * setPSMLEntry re-sets an existing entry in the portlets object indicated by * the coordinates of the PSMLEntry object passed in. */ public void setPSMLEntry(PSMLEntry theEntry) throws CustomizerException, ElementNotFoundException { Portlets thePortlets = null; // Get the "parent" portlets object. thePortlets = this.getPortletsObject(theEntry.getCoordinates()); // Find the current index of the entry we wish to replace. int idx = this.findIndex(thePortlets, theEntry); // Entry has been found. thePortlets.setEntry(theEntry.getEntry(), idx); }// end setEntry() /** * deleteEntry deletes the named portlet from the document. If the portlet * cannot be found or if the name is blank or null, an exception is thrown. */ public void deleteEntry(String portletName) throws ElementNotFoundException { // Find the entry that is to be deleted. PSMLEntry markedForDeath = this.find(portletName, this.portlets); // Get the portlets object that contains the entry to be deleted. Portlets thePortlets = this.getPortletsObject(markedForDeath.getCoordinates()); // Get the index of the object to be deleted. int idx = this.findIndex(thePortlets, markedForDeath); // Delete the entry thePortlets.removeEntry(idx); }// end deleteEntry() /** * deleteAllEntries removes all entries in the portlets object found at the * coordinates given. This method deletes all entries in sub-Portlets objects. */ public void deleteAllEntries(int[] coord) throws CustomizerException { Portlets targetPortlets = null; try { // Get the portlets object that is to be modified. targetPortlets = this.getPortletsObject(coord); } catch (ElementNotFoundException enf) { enf.printStackTrace(); throw new CustomizerException("The coordinates provided are invalid."); }// end try-catch // Delete the Entries from the portlets object. targetPortlets.removeAllEntry(); int[] newCoord = null; int thisCoord = 0; if (coord == null) { // thisCoord is already 0. newCoord = new int[1]; } else { // Create a new coordinates array. thisCoord = coord.length; newCoord = new int[coord.length+1]; System.arraycopy(coord, 0, newCoord, 0, coord.length); }// end if-else // Delete entries from sub-portlets. Portlets[] subPortlets = targetPortlets.getPortlets(); for (newCoord[thisCoord]=0; newCoord[thisCoord]<subPortlets.length; newCoord[thisCoord]++) { this.deleteAllEntries(newCoord); }// end for }// end deleteAllEntries() /** * inDocument returns true if an Entry object with the specified portlet name * is found in the Portlets object. */ public boolean inDocument(String portletName) { try { if (this.find(portletName, this.portlets) != null) return true; } catch (ElementNotFoundException enf) { return false; }// end try-catch return false; }// end inDocument() /** * getTitleColor returns the title color set for the portlets object indicated * by the position array. */ public String getTitleColor(int[] coord) throws CustomizerException { return this.getSkinPropertyValue("title-color", coord); }// end getTitleColor() /** * setTitleColor sets the title color value for the portlets object indicated * by the postion array. */ public void setTitleColor(String newColor, int[] coord) throws CustomizerException { this.setSkinPropertyValue("title-color", newColor, coord); }// end setTitleColor() /** * getBackgoundColor returns the background color set for the portlets object * indicated by the position array. */ public String getBackgroundColor(int[] coord) throws CustomizerException { return this.getSkinPropertyValue("background-color", coord); }// end getBackgroundColor() /** * setBackgroundColor sets the title color value for the portlets object * indicated by the postion array. */ public void setBackgroundColor(String newColor, int[] coord) throws CustomizerException { this.setSkinPropertyValue("background-color", newColor, coord); }// end setBackgroundColor() /** * writePSMLDocument generates the default filename for the current user * defined in the RunData object and then calls the PSMLManager * to actually write the file. */ public void writePSMLDocument() throws CustomizerException { MimeType mimetype = new MimeType ( "text/html" ); PSMLManager.setPSMLContent ( rundata, mimetype.HTML, this.portlets ); }// end writePSMLDocument() /** * getPortletsObjectAt is a goto method. This method traverses the portlets * tree and returns the portlets object found there. */ private Portlets getPortletsObject(int[] coord) throws ElementNotFoundException { // if coord is null, return the top level portlets object. if (coord == null) return this.portlets; // The portlets tree starts with the top level portlets object. Portlets holder = this.portlets; // Traverse the Portlets tree to get to the desired portlets for (int i = 0; i < coord.length; i++) { if (i < holder.getPortletsCount()-1) holder = holder.getPortlets(coord[i]); else throw new ElementNotFoundException("A request was made for a portlets " + "object that cannot be found."); // end if-else }// end for // Return the last portlets object found. return holder; }// end getPorteletsObjectAt() /** * setPortletsObject re-inserts a (presumably) modified portlets object into * the portlets tree at the specified coordinates. */ private void setPortletsObject(Portlets thePortlets, int[] coord) throws ElementNotFoundException { // Set the layout for this portlets object. if (coord != null) { Layout aLayout = new Layout(); aLayout.setPosition(String.valueOf(coord[coord.length-1])); thePortlets.setLayout(aLayout); }// end if // If coord is null, then we have reached the top. The portlets object that // was passed in should be the new top level portlets object. if (coord == null) this.portlets = thePortlets; else { // Since coord is not null, we must discern the coordinates of the // "parent" portlets object. // Declare an array to hold the parent coordinates. int[] parentCoordinates = null; // Find the "parent" portlets object. Portlets parent; if (coord.length > 1) { // Create a new coordinates array for the "parent". parentCoordinates = new int[coord.length-1]; System.arraycopy(coord, 0, parentCoordinates, 0, coord.length-1); // Get the parent using the new coordinates array. parent = this.getPortletsObject(parentCoordinates); } else // If there is only one coordinate in coord, the parent must be the // root portlets object. parent = this.portlets; }// end if-else }// end setPortletsObject() /** * This find method calls the recursive find method properly. This method * allows programmers to call find without having to know about how * find works. */ private PSMLEntry find(String portletName, Portlets pTree) throws NullPointerException, ElementNotFoundException { return this.find(portletName, pTree, null); }// end find() /** * This find method recursively traverses the portlets tree and discovers the * location of the Entry with the matching portlet name (There can be only * one.) Once it has been found, the location information and the Entry object * itself is bundled into a PSMLEntry object and returned. */ private PSMLEntry find(String portletName, Portlets pTree, int[] coord) throws ElementNotFoundException { // If coord is null, then we need to create a new array that has 1 empty // slot. The empty slot is for this portlets object's position number. // If coord is not null, then we need to grow the array by 1 space so the // array can accomodate this portlets object's position numbber int colnum = 0; if (coord == null) { coord = new int[1]; colnum = -1; } else { colnum = coord[coord.length-1]; // Declare a new array that is one size longer. int[] newCoord = new int[coord.length+1]; // Copy the contents of the old array into the new one. System.arraycopy(coord, 0, newCoord, 0, coord.length); // Replace the old array with the new array. coord = newCoord; }// end if else // Declare a counter and a PSMLEntry holder variable. int counter = 0; Entry testEntry; // Check each entry in this portlets object. Log.note("Column " + colnum + " has " + pTree.getEntryCount() + " Entries."); for (counter=0; counter < pTree.getEntryCount(); counter++) { testEntry = pTree.getEntry(counter); if (portletName.equals(testEntry.getParent())) { coord[coord.length-1] = counter; // Create a new PSML object with this info and return it. return new PSMLEntry(testEntry, coord); }// end if }// end for // Declare a PSMLEntry to hold any possible result. PSMLEntry resultEntry = null; // If we have gotten to this point, the desired entry is not in this portlets // object. Re-use the counter integer to step through each portlets object. for (counter=0; counter < pTree.getPortletsCount() && resultEntry== null; counter++) { coord[coord.length-1] = counter; try { resultEntry = this.find(portletName, pTree.getPortlets(counter), coord); } catch (ElementNotFoundException enf) { //Do nothing. }// end try-catch }// end for // If nothing was found. if (resultEntry == null) throw new ElementNotFoundException("The entry, " + portletName + " was " + "not found."); return resultEntry; }// end find() /** * Returns the default color (in hex) for the given property name. */ private String getDefaultColor(String propertyName) { try { if (propertyName.equals("background-color")) return jColors.getHexValue("DEFAULT_BC"); if (propertyName.equals("title-color")) return jColors.getHexValue("DEFAULT_TC"); } catch (ElementNotFoundException enf) { }// end try-catch return "#FFFFFF"; }// end getDefaultColor /** * getSkinPropertyValue returns the property value for the portlets object * indicated by the coordinates. */ private String getSkinPropertyValue(String propertyName, int[] coord) throws CustomizerException { Portlets thePortlets = null; try { // Get the portlets object found at the coordinates given. thePortlets = this.getPortletsObject(coord); } catch (ElementNotFoundException enf) { enf.printStackTrace(); throw new CustomizerException("The coordinates are invalid."); } // Extract the skin object. Skin theSkin = thePortlets.getSkin(); if (theSkin == null) return this.getDefaultColor(propertyName); // Extract the skin properties. Property[] props = thePortlets.getSkin().getProperty(); // Search for the desired property. Property found = null; for (int i=0; i<props.length; i++) { if (props[i].getName().equals(propertyName)) { found = props[i]; break; }// end if }// end for // if nothing was found, get the default color. if (found == null) return this.getDefaultColor(propertyName); // Otherwise, return the value string of the found property. return found.getValue(); }// end getSkinPropertyValue() /** * setSkinPropertyValue sets the property value for the portlets object * indicated by the coordinates. */ private void setSkinPropertyValue(String propertyName, String value, int[] coord) throws CustomizerException { Portlets thePortlets = null; try { // Get the portlets object found at the coordinates given. thePortlets = this.getPortletsObject(coord); } catch (ElementNotFoundException enf) { enf.printStackTrace(); throw new CustomizerException("The coordinates are invalid."); } // Extract the skin. Skin theSkin = thePortlets.getSkin(); // Check for null skin if (theSkin == null) { // Create a new skin. theSkin = new Skin(); } // Extract the Properties. Property[] props = theSkin.getProperty(); // Search for the desired property. Property found = null; int foundIndex = -1; if (props != null) { for (int i=0; i<props.length; i++) { if (props[i].getName().equals(propertyName)) { foundIndex = i; found = props[foundIndex]; break; }// end if }// end for }// end if // if nothing was found, add a new property if (found == null) { found = new Property(); found.setName(propertyName); }// end if found.setValue(value); if (foundIndex != -1) theSkin.setProperty(found, foundIndex); else theSkin.addProperty(found); // end if thePortlets.setSkin(theSkin); }// end setSkinPropertyValue() private int findIndex(Portlets thePortlets, PSMLEntry theEntry) throws ElementNotFoundException { return this.findIndex(thePortlets, theEntry.getEntry()); }// end findIndex() private int findIndex(Portlets thePortlets, Entry theEntry) throws ElementNotFoundException { // Find the current index of the entry we wish to replace. int idx = -1; for (int i=0; i<thePortlets.getEntryCount(); i++) { if (theEntry.getParent().equals(thePortlets.getEntry(i).getParent())) { idx = i; break; }// end if }// end for if (idx == -1) throw new ElementNotFoundException("The entry does not exist in the " + "Portlets object indicated."); return idx; }// end findIndex() }// end class PSMLDocument 1.1 jakarta-jetspeed/src/java/org/apache/jetspeed/util/customization/PSMLEntry.java Index: PSMLEntry.java =================================================================== package org.apache.jetspeed.util.customization; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Jetspeed" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" or * "Apache Jetspeed", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ import org.apache.jetspeed.xml.api.portletmarkup.Entry; import org.apache.jetspeed.om.registry.peer.PortletEntry; import org.apache.jetspeed.xml.api.portletmarkup.Layout; import org.apache.turbine.util.Log; import java.lang.NullPointerException; /** * * PSMLEntry is a wrapper class that bundles the Entry object and positioning * information for a particular portlet together. * * @author <a href="mailto:[EMAIL PROTECTED]">Peter Yoo </a> * @author <a href="mailto:[EMAIL PROTECTED]">Ernest Ros </a> * @version $Id: PSMLEntry.java,v 1.1 2001/05/08 06:26:11 taylor Exp $ * */ public class PSMLEntry { private Entry theEntry; /** * The coordinates of a portlet is defined by an integer array. This array * contains the position information ranging from least specific to most * specific. For example, the position of a portlet located in column 2, * row 1 would be defined by the following array: [2, 1]. Remember that the * coordinate does not include the portlet's actual position number within the * space defined by the coordinates. */ private int[] coordinates; //private String bgColor; //private String titleColor; public PSMLEntry(Entry entry, int[] coord) throws NullPointerException { if (entry == null || coord == null) throw new NullPointerException("Neither parameter of PSMLEntry constructor may be null."); this.setEntry(entry); this.setCoordinates(coord); //this.bgColor = bColor; //this.titleColor = tColor; }// end contructor() /** * Alternate constructor takes a PortletEntry from the PortletRegistry * and converts it into an Entry object. */ public PSMLEntry(PortletEntry entry, Layout layout, int [] coord) throws NullPointerException { if (entry == null || layout == null || coord == null) throw new NullPointerException("No parameter of PSMLEntry constructor may be null."); Entry ne = PSMLEntry.portletEntryToEntry(entry, layout); this.setEntry(ne); this.setCoordinates(coord); }// end contstructor() // Getters ------------------------------------------------------------------- public Entry getEntry() { return this.theEntry; }// end getEntry() public int[] getCoordinates() { Log.note("Returning the coordinates: " + this.coordinates[0]); return this.coordinates; }// end getCoordinates() public int getPosition() { Layout theLayout = this.theEntry.getLayout(); if (theLayout == null) return 0; return Integer.parseInt(theLayout.getPosition()); }// end getPosition() /* For later use public String getBackgoundColor(){ return this.bgColor; }// end getBackgroundColor() public String getTitleColor(){ return this.titleColor; }// end getTitleColor() */ // Setters ------------------------------------------------------------------- public void setEntry(Entry newEntry) { this.theEntry = newEntry; }// end setEntry() public void setEntry(PortletEntry newEntry, Layout layout) throws Exception { this.setEntry(PSMLEntry.portletEntryToEntry(newEntry, layout)); }// end setEntry() public void setCoordinates(int[] coord) { this.coordinates = coord; }// end setPosition() public void setPosition(int position) { this.setPosition(String.valueOf(position)); }// end setPosition() public void setPosition(String position) { Layout theLayout = this.theEntry.getLayout(); if (theLayout == null) theLayout = new Layout(); theLayout.setPosition(position); this.theEntry.setLayout(theLayout); }// end setPosition() /* For later use public void setBackgroundColor(String newColor){ this.bgColor = newColor; }// end setBackgroundColor() public void setTitleColor(String newColor){ this.titleColor = newColor; }// end setTitleColor() */ private static Entry portletEntryToEntry(PortletEntry entry, Layout layout) { Entry result = new Entry(); result.setParent(entry.getName()); result.setLayout(layout); result.setType(entry.getType().toString()); return result; }// end portletEntryToEntry }// end class PSMLEntry 1.1 jakarta-jetspeed/src/java/org/apache/jetspeed/util/customization/UserNotLoggedInException.java Index: UserNotLoggedInException.java =================================================================== package org.apache.jetspeed.util.customization; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Jetspeed" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" or * "Apache Jetspeed", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ /** * * @author <a href="mailto:[EMAIL PROTECTED]">Peter Yoo </a> * @author <a href="mailto:[EMAIL PROTECTED]">Ernest Ros </a> * @version $Id: UserNotLoggedInException.java,v 1.1 2001/05/08 06:26:11 taylor Exp $ * */ public class UserNotLoggedInException extends Exception { public UserNotLoggedInException() { super(); } public UserNotLoggedInException(String msg) { super(msg); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]