I found ${variable} substitution to work well for me in the past (Jetspeed
1.3x). The resource service supports this for string properties only so I
subclassed the resource service for other data types. For each variation, I
would define a site.properties file containing properties that vary between
sites. For example:
site-TEST.properties:
================
_database.default.driver=org.hsql.jdbcDriver
_database.default.url=jdbc:HypersonicSQL:${webappRoot}/WEB-INF/db/jetspeed
// this does not currently work in Torque.properties
_database.default.username=test
_database.default.password=test
_database.default.maxConnections=3
site-PROD.properties:
================
_database.default.driver=org.hsql.jdbcDriver
_database.default.url=jdbc:HypersonicSQL:hsql://localhost
_database.default.username=sa
_database.default.password=
_database.default.maxConnections=10
Torque.properties:
==================
include=site.properties
database.default.url=${_database.default.url}
database.default.url=${_database.default.url}
database.default.username=${_database.default.username}
database.default.password=${_database.default.password}
database.default.maxConnections=${_database.default.maxConnections} // this
does not currently work
I would have copy the proper site-*.properties file to site.properties
during the build process. The same applies to tr.props and jr.pros. The
downside is that you have to modify Torque/tr/jr.properties but for me
benefits outweigh the additional work.
I am currently trying to port this method into Jetspeed 1.4 but I'm running
into some issues. Once I have this worked out, I'll contribute the method if
anyone is interested.
Best regards,
Mark C. Orciuch
Next Generation Solutions, Ltd.
e-Mail: [EMAIL PROTECTED]
web: http://www.ngsltd.com
> -----Original Message-----
> From: Pat Ryan [mailto:[EMAIL PROTECTED]]
> Sent: Wednesday, September 18, 2002 3:54 PM
> To: Jetspeed Users List
> Subject: Re: JR.prop duplicate booleans break...
>
>
>
> This is what we did at our place to, but I could not find a way
> to do this for
> Torque.properties.
>
> Right now I include our torque file as the first line in the
> Torque.properties.
> Any ideas on how to do this better?
>
> Thanks
> Pat
>
>
> "Glenn R. Golden" wrote:
>
> > Josh -
> >
> > What I do is change the web.xml to point to my own properties file, put
> > in all my overrides, then include tr.p from my properties file.
> >
> > - Glenn
> >
> > On Wednesday, September 18, 2002, at 08:37 AM, Josh Hone wrote:
> >
> > > Hi Glenn -
> > >
> > > No, my version is not very new at all. So my personal properties
> > > include in TR.p must be before the include of JR.p?
> > >
> > > Josh Hone
> > >
> > >
> > >> From: Glenn Golden <[EMAIL PROTECTED]>
> > >> Reply-To: "Jetspeed Users List" <[EMAIL PROTECTED]>
> > >> To: 'Jetspeed Users List' <[EMAIL PROTECTED]>
> > >> Subject: RE: JR.prop duplicate booleans break...
> > >> Date: Wed, 18 Sep 2002 08:25:24 -0400
> > >>
> > >> Josh -
> > >>
> > >> I just recently fixed this for Jetspeed properties
> (properties aimed at
> > >> Turbine may not be done in this way), so that you can
> override the jr.p
> > >> values in your own resources.properties. Make sure your values come
> > >> *first*. The first setting will be used.
> > >>
> > >> Are you using the latest code from cvs?
> > >>
> > >> If you are running with this fix already in, let me know and
> I'll look
> > >> into
> > >> it further.
> > >>
> > >> Thanks!
> > >>
> > >> Here's the cvs message from that checkin:
> > >>
> > >> * * * * * * * * * * * * * * *
> > >>
> > >> ggolden 2002/09/09 19:01:27
> > >>
> > >> Modified: src/java/org/apache/jetspeed/services/resources
> > >> JetspeedResources.java
> > >> Log:
> > >> When overriding settings in the JetspeedResources.properties (and
> > >> TurbineResources.properties), we might want to set a value with our
> > >> site's setting, a value that is also set in the standard jr.p and
> > >> tr.p
> > >> distribution files. It's nice to be able to use these files
> unchanged
> > >> so we
> > >> can keep up easily
> > >> with Jetspeed development.
> > >>
> > >> If the value we are setting is a string, this already works - the
> > >> first
> > >> value set to
> > >> the property is used, so we can just do our settings before the
> > >> standard
> > >> files
> > >> are read in.
> > >>
> > >> If the value we are setting is a boolean, long, float, double, or
> > >> int,
> > >> this doesn't work - we get class cast exceptions.
> > >>
> > >> JetspeedSecurity, which is used by Jetspeed code to access the
> > >> configuration values, now catches these class cast
> exceptions, and also
> > >> takes the calls to getString. If there's an array of values, it will
> > >> use
> > >> the first one (it's the combination of the array of values that mess
> > >> up the
> > >> reading without this).
> > >>
> > >> Note: this only works for Jetspeed properties - turbine properties
> > >> don't
> > >> use this
> > >> code. Only string properties can be overridden by setting
> your site
> > >> values first
> > >> for turbine properties.
> > >>
> > >> Note: This code would be best deep inside turbine, but can
> live here
> > >> till
> > >> Turbine
> > >> handles these cases.
> > >>
> > >> Revision Changes Path
> > >> 1.13 +322 -2
> > >> jakarta-
> > >> jetspeed/src/java/org/apache/jetspeed/services/resources/JetspeedRes
> > >> ources.java
> > >>
> > >> Index: JetspeedResources.java
> > >> ===================================================================
> > >> RCS file:
> > >> /home/cvs/jakarta-
> > >> jetspeed/src/java/org/apache/jetspeed/services/resources/J
> > >> etspeedResources.java,v
> > >> retrieving revision 1.12
> > >> retrieving revision 1.13
> > >> diff -u -r1.12 -r1.13
> > >> --- JetspeedResources.java 26 Jul 2002 01:47:21 -0000 1.12
> > >> +++ JetspeedResources.java 10 Sep 2002 02:01:27 -0000 1.13
> > >> @@ -55,16 +55,22 @@
> > >> package org.apache.jetspeed.services.resources;
> > >>
> > >> import org.apache.turbine.services.resources.TurbineResources;
> > >> +import org.apache.turbine.util.Log;
> > >>
> > >> /**
> > >> * This class defines the Jetspeed properties keys.
> > >> * All properties can be retrieved using TurbineResources or
> > >> JetspeedResources
> > >> - * directly
> > >> + * directly.
> > >> + *
> > >> + * This class also overrides the covers for many of the get
> > >> routines. It
> > >> handles the cases
> > >> + * where we want a single value, perhaps as a boolean or
> float, but
> > >> the
> > >> configuration may have
> > >> + * an array of values. In these cases, we let the first value
> > >> override
> > >> all the others and use it.
> > >> *
> > >> * @author <a href="mailto:[EMAIL PROTECTED]">Kevin A. Burton</a>
> > >> * @author <a href="mailto:[EMAIL PROTECTED]">Rapha�l Luta</a>
> > >> * @author <a href="mailto:[EMAIL PROTECTED]">Tom Adams</a>
> > >> * @author <a href="mailto:[EMAIL PROTECTED]">Chris
> Kimpton</a>
> > >> + * @author <a href="mailto:[EMAIL PROTECTED]">Glenn R. Golden</a>
> > >> * @version $Id$
> > >> */
> > >> public class JetspeedResources extends TurbineResources {
> > >> @@ -156,7 +162,321 @@
> > >> */
> > >> public static final String PATH_PANEL_KEY = "select-panel";
> > >>
> > >> + /**
> > >> + * The purpose of this method is to get the configuration
> > >> resource
> > >> + * with the given name as a boolean value.
> > >> + *
> > >> + * @param name The resource name.
> > >> + * @return The value of the named resource as a boolean.
> > >> + */
> > >> + public static boolean getBoolean(String name)
> > >> + {
> > >> + try
> > >> + {
> > >> + return TurbineResources.getBoolean (name);
> > >> + }
> > >> + catch (ClassCastException e)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> +
> > >> + // try again with the first
> > >> + if ((values != null) && (values.length > 0))
> > >> + return new Boolean(values[0]).booleanValue();
> > >> +
> > >> + // otherwise, just throw the exception
> > >> + throw e;
> > >> + }
> > >> + }
> > >> +
> > >> + /**
> > >> + * The purppose of this method is to get the configuration
> > >> + * resource with the given name as a boolean value,
> or a default
> > >> + * value.
> > >> + *
> > >> + * @param name The resource name.
> > >> + * @param def The default value of the resource.
> > >> + * @return The value of the named resource as a boolean.
> > >> + */
> > >> + public static boolean getBoolean(String name,
> > >> + boolean def)
> > >> + {
> > >> + try
> > >> + {
> > >> + return TurbineResources.getBoolean(name, def);
> > >> + }
> > >> + catch (ClassCastException e)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> +
> > >> + // try again with the first
> > >> + if ((values != null) && (values.length > 0))
> > >> + return new Boolean(values[0]).booleanValue();
> > >> +
> > >> + // otherwise, just throw the exception
> > >> + throw e;
> > >> + }
> > >> + }
> > >> +
> > >> + /**
> > >> + * The purpose of this method is to get the configuration
> > >> resource
> > >> + * with the given name as a double.
> > >> + *
> > >> + * @param name The resoource name.
> > >> + * @return The value of the named resource as double.
> > >> + */
> > >> + public static double getDouble(String name)
> > >> + {
> > >> + try
> > >> + {
> > >> + return TurbineResources.getDouble(name);
> > >> + }
> > >> + catch (ClassCastException e)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> +
> > >> + // try again with the first
> > >> + if ((values != null) && (values.length > 0))
> > >> + return Double.parseDouble(values[0]);
> > >> +
> > >> + // otherwise, just throw the exception
> > >> + throw e;
> > >> + }
> > >> + }
> > >> +
> > >> + /**
> > >> + * The purpose of this method is to get the configuration
> > >> resource
> > >> + * with the given name as a double, or a default value.
> > >> + *
> > >> + * @param name The resource name.
> > >> + * @param def The default value of the resource.
> > >> + * @return The value of the named resource as a double.
> > >> + */
> > >> + public static double getDouble(String name,
> > >> + double def)
> > >> + {
> > >> + try
> > >> + {
> > >> + return TurbineResources.getDouble(name, def);
> > >> + }
> > >> + catch (ClassCastException e)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> +
> > >> + // try again with the first
> > >> + if ((values != null) && (values.length > 0))
> > >> + return Double.parseDouble(values[0]);
> > >> +
> > >> + // otherwise, just throw the exception
> > >> + throw e;
> > >> + }
> > >> + }
> > >> +
> > >> + /**
> > >> + * The purpose of this method is to get the configuration
> > >> resource
> > >> + * with the given name as a float.
> > >> + *
> > >> + * @param name The resource name.
> > >> + * @return The value of the resource as a float.
> > >> + */
> > >> + public static float getFloat(String name)
> > >> + {
> > >> + try
> > >> + {
> > >> + return TurbineResources.getFloat(name);
> > >> + }
> > >> + catch (ClassCastException e)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> +
> > >> + // try again with the first
> > >> + if ((values != null) && (values.length > 0))
> > >> + return Float.parseFloat(values[0]);
> > >> +
> > >> + // otherwise, just throw the exception
> > >> + throw e;
> > >> + }
> > >> + }
> > >> +
> > >> + /**
> > >> + * The purpose of this method is to get the configuration
> > >> resource
> > >> + * with the given name as a float, or a default value.
> > >> + *
> > >> + * @param name The resource name.
> > >> + * @param def The default value of the resource.
> > >> + * @return The value of the resource as a float.
> > >> + */
> > >> + public static float getFloat(String name,
> > >> + float def)
> > >> + {
> > >> + try
> > >> + {
> > >> + return TurbineResources.getFloat(name, def);
> > >> + }
> > >> + catch (ClassCastException e)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> +
> > >> + // try again with the first
> > >> + if ((values != null) && (values.length > 0))
> > >> + return Float.parseFloat(values[0]);
> > >> +
> > >> + // otherwise, just throw the exception
> > >> + throw e;
> > >> + }
> > >> + }
> > >> +
> > >> + /**
> > >> + * The purpose of this method is to get the configuration
> > >> resource
> > >> + * with the given name as an integer.
> > >> + *
> > >> + * @param name The resource name.
> > >> + * @return The value of the resource as an integer.
> > >> + */
> > >> + public static int getInt(String name)
> > >> + {
> > >> + try
> > >> + {
> > >> + return TurbineResources.getInt(name);
> > >> + }
> > >> + catch (ClassCastException e)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> +
> > >> + // try again with the first
> > >> + if ((values != null) && (values.length > 0))
> > >> + return Integer.parseInt(values[0]);
> > >> +
> > >> + // otherwise, just throw the exception
> > >> + throw e;
> > >> + }
> > >> + }
> > >> +
> > >> + /**
> > >> + * The purpose of this method is to get the configuration
> > >> resource
> > >> + * with the given name as an integer, or a default value.
> > >> + *
> > >> + * @param name The resource name.
> > >> + * @param def The default value of the resource.
> > >> + * @return The value of the resource as an integer.
> > >> + */
> > >> + public static int getInt(String name,
> > >> + int def)
> > >> + {
> > >> + try
> > >> + {
> > >> + return TurbineResources.getInt(name, def);
> > >> + }
> > >> + catch (ClassCastException e)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> +
> > >> + // try again with the first
> > >> + if ((values != null) && (values.length > 0))
> > >> + return Integer.parseInt(values[0]);
> > >> +
> > >> + // otherwise, just throw the exception
> > >> + throw e;
> > >> + }
> > >> + }
> > >> +
> > >> + /**
> > >> + * The purpose of this method is to get the configuration
> > >> resource
> > >> + * with the given name as a long.
> > >> + *
> > >> + * @param name The resource name.
> > >> + * @return The value of the resource as a long.
> > >> + */
> > >> + public static long getLong(String name)
> > >> + {
> > >> + try
> > >> + {
> > >> + return TurbineResources.getLong(name);
> > >> + }
> > >> + catch (ClassCastException e)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> +
> > >> + // try again with the first
> > >> + if ((values != null) && (values.length > 0))
> > >> + return Long.parseLong(values[0]);
> > >> +
> > >> + // otherwise, just throw the exception
> > >> + throw e;
> > >> + }
> > >> + }
> > >> +
> > >> + /**
> > >> + * The purpose of this method is to get the configuration
> > >> resource
> > >> + * with the given name as a long, or a default value.
> > >> + *
> > >> + * @param name The resource name.
> > >> + * @param def The default value of the resource.
> > >> + * @return The value of the resource as a long.
> > >> + */
> > >> + public static long getLong(String name,
> > >> + long def)
> > >> + {
> > >> + try
> > >> + {
> > >> + return TurbineResources.getLong(name, def);
> > >> + }
> > >> + catch (ClassCastException e)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> +
> > >> + // try again with the first
> > >> + if ((values != null) && (values.length > 0))
> > >> + return Long.parseLong(values[0]);
> > >> +
> > >> + // otherwise, just throw the exception
> > >> + throw e;
> > >> + }
> > >> + }
> > >>
> > >> + /**
> > >> + * The purpose of this method is to get the configuration
> > >> resource
> > >> + * with the given name as a string.
> > >> + *
> > >> + * @param name The resource name.
> > >> + * @return The value of the resource as a string.
> > >> + */
> > >> + public static String getString(String name)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> + if ((values != null) && (values.length > 0))
> > >> + return values[0];
> > >>
> > >> + return TurbineResources.getString(name);
> > >> + }
> > >>
> > >> + /**
> > >> + * The purpose of this method is to get the configuration
> > >> resource
> > >> + * with the given name as a string, or a default value.
> > >> + *
> > >> + * @param name The resource name.
> > >> + * @param def The default value of the resource.
> > >> + * @return The value of the resource as a string.
> > >> + */
> > >> + public static String getString(String name,
> > >> + String def)
> > >> + {
> > >> + // get the possible list
> > >> + String[] values = getStringArray(name);
> > >> + if ((values != null) && (values.length > 0))
> > >> + return values[0];
> > >> +
> > >> + return TurbineResources.getString(name, def);
> > >> + }
> > >> }
> > >> +
> > >>
> > >>
> > >>
> > >>
> > >> --
> > >> To unsubscribe, e-mail:
> > >> <mailto:[EMAIL PROTECTED]>
> > >> For additional commands, e-mail:
> > >> <mailto:[EMAIL PROTECTED]>
> > >>
> > >>
> > >> > -----Original Message-----
> > >> > From: Josh Hone [mailto:[EMAIL PROTECTED]]
> > >> > Sent: Tuesday, September 17, 2002 9:58 PM
> > >> > To: [EMAIL PROTECTED]
> > >> > Subject: JR.prop duplicate booleans break...
> > >> >
> > >> >
> > >> > Hi all -
> > >> >
> > >> > I have noticed that if I have duplicate boolean values for
> > >> > some properties
> > >> > that the machine gives you a horrible exception and does not
> > >> > like it at all.
> > >> > It says that the value assigned to the property is not
> > >> > boolean. Here is
> > >> > what I did:
> > >> >
> > >> > I copied some properties from JR.p to my own properties
> > >> > files. Then I
> > >> > edited some (for the email config) and restarted everything.
> > >> > Upon opening
> > >> > the portal, I encountered the horrible exception for a
> > >> > property that was
> > >> > duplicated in both properties files. It was the same both
> places. I
> > >> > commented it out and restarted everything. This time I was
> > >> > able to log in
> > >> > but again received a Horrible Exception, pointing to a
> > >> > property that I did
> > >> > alter. Both times the error message was the same.
> > >> >
> > >> > The issue was resolved as I removed the duplicate areas. I
> > >> > deleted the ones
> > >> > I changed in my personal file from JR.p. I also deleted the
> > >> > ones I did not
> > >> > change from my personal file. Then the system works fine (I
> > >> > just have to
> > >> > get out of the firewall...).
> > >> >
> > >> > Is this a bug?
> > >> >
> > >> > I am interested in this mainly because for an upgrade of a
> > >> > jetspeed system,
> > >> > it is much easier to maintain your own properties files. It
> > >> > gets much
> > >> > harder when you have to manually go into the default files to
> > >> > look for
> > >> > things to edit. Not harder for me personally, but for
> > >> > whoever after me
> > >> > looks after this portal.
> > >> >
> > >> > Josh Hone
> > >> >
> > >> > _________________________________________________________________
> > >> > Chat with friends online, try MSN Messenger:
> http://messenger.msn.com
> > >> >
> > >> >
> > >> > --
> > >> > To unsubscribe, e-mail:
> > >> > <mailto:jetspeed-user-> [EMAIL PROTECTED]>
> > >> > For
> > >> > additional commands,
> > >> > e-mail: <mailto:[EMAIL PROTECTED]>
> > >> >
> > >>
> > >> --
> > >> To unsubscribe, e-mail: <mailto:jetspeed-user-
> > >> [EMAIL PROTECTED]>
> > >> For additional commands, e-mail: <mailto:jetspeed-user-
> > >> [EMAIL PROTECTED]>
> > >
> > >
> > >
> > >
> > > _________________________________________________________________
> > > MSN Photos is the easiest way to share and print your photos:
> > > http://photos.msn.com/support/worldwide.aspx
> > >
> > >
> > > --
> > > To unsubscribe, e-mail: <mailto:jetspeed-user-
> > > [EMAIL PROTECTED]>
> > > For additional commands, e-mail: <mailto:jetspeed-user-
> > > [EMAIL PROTECTED]>
> > >
> >
> > - Glenn
> >
> > ---------------------------------------------------------------------
> > Glenn R. Golden Systems Research Programmer
> > School of Information University of Michigan
> > [EMAIL PROTECTED] 734-615-1419
> > ---------------------------------------------------------------------
> >
> > --
> > To unsubscribe, e-mail:
> <mailto:[EMAIL PROTECTED]>
> > For additional commands, e-mail:
> <mailto:[EMAIL PROTECTED]>
>
>
> --
> To unsubscribe, e-mail:
> <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
> <mailto:[EMAIL PROTECTED]>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>