I don't know about a parallel site, but I put my code under sf.net/projects/struts (just because I already use that repos)
I'm not one of those letter-of-the-law types, but I don't want anything I work on to be accused of said infractions (Gawd!! I sound like one now ;) -- James Mitchell Software Engineer / Open Source Evangelist EdgeTech, Inc. 678.910.8017 AIM: jmitchtx ----- Original Message ----- From: "Eric Pugh" <[EMAIL PROTECTED]> To: "Jakarta Commons Developers List" <[EMAIL PROTECTED]> Sent: Wednesday, October 06, 2004 9:05 AM Subject: RE: [configuration] handling exceptions in AbstractConfiguration implementations > I tried hitting commons-resources.sf.net but no joy.. I think this > licensing thing is going to bite a lot of projects.. I was thinking of > settingup a sf project called "hibernatecodethatiwantedatapache.sf.net" > where I could toss all these bits and pieces. > > Has Jakarta-Commons actually set up a parralel site on SF to work around > these issues? > > ERic > > > -----Original Message----- > > From: James Mitchell [mailto:[EMAIL PROTECTED] > > Sent: Wednesday, October 06, 2004 2:15 PM > > To: Jakarta Commons Developers List > > Subject: Re: [configuration] handling exceptions in > > AbstractConfiguration implementations > > > > > > Problem with having Hibernate implementations is that the license is > > incompatible with the ASL. So you'll need to keep any incompatible code > > somewhere else....like I do with commons-resources at sf.net. > > > > > > -- > > James Mitchell > > Software Engineer / Open Source Evangelist > > EdgeTech, Inc. > > 678.910.8017 > > AIM: jmitchtx > > > > ----- Original Message ----- > > From: "Ricardo Gladwell" <[EMAIL PROTECTED]> > > To: "Jakarta Commons Developers List" <[EMAIL PROTECTED]> > > Sent: Wednesday, October 06, 2004 8:07 AM > > Subject: Re: [configuration] handling exceptions in AbstractConfiguration > > implementations > > > > > > > Eric Pugh wrote: > > > > Hi Ricardo.. Sounds like you are working on something I've > > been wanting > > for > > > > a long time! > > > > > > Of course, I was going to release it anyway so please find the > > > source-code attached. Not sure it belongs in commons-configration API; > > > probably better contributed to the hibernate project. If you can think > > > of any improvements please mail the patches back to me for my > > own project > > :) > > > > > > > In otherwords, say I am using a Configuration object in my code, and I > > do > > > > configuration.getDouble("key");. If getDouble throws an > > exception then > > I am > > > > going to have these try/catch cluases all over the place, > > cluttering the > > > > code. and, I really except getDouble() to allows work. If > > it doesn't, > > my > > > > application will just pass it on,not have some sort of fancy if > > getDouble > > > > fails, then try getString or something weird. > > > > > > Good point, although I'm still dubious about throwing RuntimeExceptions > > > - those things shoot straight through everything like a silver bullet > > > and can even crash some servlet engines. > > > > > > From my perspective, I'm not bothered if the Configuration object > > > throws exceptions: I wouldn't catch such exceptions in my web > > > application, instead letting them fly all the way to the exception > > > screen. This way, I can see them occuring as I test my application > > > through the browser. > > > > > > Obviously, sometimes when configuring your application you just want > > > your configuration to work or keep on working untill if it encounters an > > > errors. However, simply allowing your application to ignore exceptions > > > until they create new exception elsewhere seems like a good way to > > > create hard-to-fix bugs. Surely, it would be better to relay the errors > > > and let the application decide what to do with them? > > > > > > > I think what you can do is just wrap your HibernateException in a > > > > ConfiguratoinRuntimeException and toss that. JDBCConfiguration should > > > > probably be doning the same thing. > > > > > > Another alternative would be to have a getExceptions() method for all > > > Configurations which stores exceptions occuring and stores them for > > > later reporting. A good comprimise would be to allow all Configuration > > > objects to have two modes: one where exceptions are thrown as soon as > > > they occur and another one which stores exceptions as I suggested. > > > > > > Kind regards, > > > -- Ricardo Gladwell > > > > > > >>-----Original Message----- > > > >>From: Ricardo Gladwell [mailto:[EMAIL PROTECTED] > > > >>Sent: Wednesday, October 06, 2004 12:56 PM > > > >>To: Jakarta Commons Developers List > > > >>Subject: [configuration] handling exceptions in AbstractConfiguration > > > >>implementations > > > >> > > > >> > > > >>Hi All, > > > >> > > > >>I'm currently developing a sub-class of the AbstractConfiguration > > > >>classthat uses Hibernate to access configuration properties > > > >>(unimaginatively called Hibernate Configuration). I'm > > slightly concerned > > > >>about the way sub-classes are suposed to handle exceptions: > > > >> > > > >>All the abstract method are defined as not throwing exceptions. All > > > >>calls to hibernate, however, throw HibernateExceptions. So, > > for example, > > > >>my implementation of getPropertyDirect calls the hibernate > > Session.get() > > > >>method which can throw an exception. > > > >> > > > >>Looking at your implementation of the DatabaseConfiguration I can see > > > >>that it simply consumes SQLExceptions thrown from the JDBC > > API, logging > > > >>the stack trace. However, what if you want to be warned of exceptions > > > >>being thrown by the underlying implementation of Configuration? > > > >> > > > >>I notice you already have a nestable ConfigurationException > > implemented. > > > >>Surely, all Configuration methods should indicate they will throw this > > > >>exception if they are expected to read/write data? > > > >> > > > >>Also, the AbstractConfiguration class does not describe this contract > > > >>(logging all errors throw by underlying framework) or what should be > > > >>returned in the event of an error? I assume you should return null > > > >>values but this is not described anywhere. > > > >> > > > >>Kind regards, > > > >>-- Ricardo Gladwell > > > > > > > > > ------------------------------------------------------------------ > > ---------- > > ---- > > > > > > > package net.sf.jexus.server.components; > > > > > > import org.apache.commons.logging.Log; > > > import org.apache.commons.logging.LogFactory; > > > > > > import java.util.Iterator; > > > import java.util.List; > > > > > > import net.sf.hibernate.HibernateException; > > > import net.sf.hibernate.Session; > > > import net.sf.hibernate.Transaction; > > > import net.sf.jexus.server.data.object.ConfigurationProperty; > > > > > > import org.apache.commons.beanutils.ConvertUtils; > > > import org.apache.commons.configuration.AbstractConfiguration; > > > > > > /** > > > * <p>Hibernate configuation class. Reads configuration > > infomation from a > > > * database through the <a > > href="http://www.hibernate.org/">Hibernate</a> > > > * O/R mapping API. Data is stored as name-value pairs, along with the > > class > > > * information of data stored, using the mapping* defined by the > > > * [EMAIL PROTECTED] ConfigurationProperty} POJO hibernate xdoclet > > directives. Values > > are > > > * converted to and from strings using > > > * [EMAIL PROTECTED] org.apache.commons.beanutils.ConvertUtils}.</p> > > > * > > > * @author <a href="mailto:[EMAIL PROTECTED]">Ricardo > > Gladwell</a> > > > */ > > > public class HibernateConfiguration extends AbstractConfiguration { > > > > > > /** > > > * Logger for this class > > > */ > > > private static final Log log = > > LogFactory.getLog(HibernateConfiguration.class); > > > > > > /** > > > * Reference to the session factory. > > > */ > > > Session session; > > > > > > /** > > > * > > > */ > > > class KeyIterator implements Iterator { > > > > > > Iterator iterator; > > > String last; > > > > > > public KeyIterator(Iterator iterator) throws > > HibernateException { > > > this.iterator = iterator; > > > } > > > > > > /** > > > * @see java.util.Iterator#hasNext() > > > */ > > > public boolean hasNext() { > > > return iterator.hasNext(); > > > } > > > > > > /** > > > * @see java.util.Iterator#next() > > > */ > > > public Object next() { > > > ConfigurationProperty config = > > (ConfigurationProperty)iterator.next(); > > > String key = config.getName(); > > > last = key; > > > return key; > > > } > > > > > > /** > > > * @see java.util.Iterator#remove() > > > */ > > > public void remove() { > > > clearProperty(last); > > > } > > > > > > } > > > > > > /** > > > * > > > */ > > > public HibernateConfiguration(Session session) { > > > super(); > > > if(log.isTraceEnabled()) log.trace("HibernateConfiguration()"); > > > this.session = session; > > > } > > > > > > /** > > > * @see > > org.apache.commons.configuration.AbstractConfiguration#getProperty > > Direct(jav > > a.lang.String) > > > */ > > > protected Object getPropertyDirect(String key) { > > > if(log.isTraceEnabled()) > > log.trace("getPropertyDirect("+key+")"); > > > ConfigurationProperty config = null; > > > try { > > > config = (ConfigurationProperty) > > session.get(ConfigurationProperty.class,key); > > > } catch(HibernateException e) { > > > log.error("Error reading congfiguration > > property=["+key+"]",e); > > > return null; > > > } > > > try { > > > Class clazz = > > getClass().getClassLoader().loadClass(config.getType()); > > > return ConvertUtils.convert(config.getValue(), clazz); > > > } catch(ClassNotFoundException e) { > > > log.warn("Cannot find class=["+config.getType()+"] for > > property=["+key+"]",e); > > > } > > > return config.getValue(); > > > } > > > > > > /** > > > * @see > > org.apache.commons.configuration.AbstractConfiguration#addProperty > > Direct(jav > > a.lang.String, java.lang.Object) > > > */ > > > protected void addPropertyDirect(String key, Object value) { > > > if(log.isTraceEnabled()) > > log.trace("addPropertyDirect("+key+","+value+")"); > > > ConfigurationProperty config = new ConfigurationProperty(); > > > config.setName(key); > > > config.setValue(ConvertUtils.convert(value)); > > > config.setType(value.getClass().getName()); > > > try { > > > Transaction transaction = session.beginTransaction(); > > > session.save(config); > > > transaction.commit(); > > > } catch(HibernateException e) { > > > log.error("Error adding congfiguration > > property=["+key+"]",e); > > > } > > > } > > > > > > /** > > > * @see org.apache.commons.configuration.Configuration#isEmpty() > > > */ > > > public boolean isEmpty() { > > > if(log.isTraceEnabled()) log.trace("isEmpty()"); > > > try { > > > List list = session.find("from Configuration"); > > > return list.isEmpty(); > > > } catch(HibernateException e) { > > > log.error("Error reading keys.",e); > > > return true; > > > } > > > } > > > > > > /*** > > > * @see > > org.apache.commons.configuration.Configuration#containsKey(java.la > > ng.String) > > > */ > > > public boolean containsKey(String key) { > > > if(log.isTraceEnabled()) log.trace("containsKey("+key+")"); > > > return (getPropertyDirect(key) != null); > > > } > > > > > > /** > > > * @see > > org.apache.commons.configuration.Configuration#clearProperty(java. > > lang.Strin > > g) > > > */ > > > public void clearProperty(String key) { > > > if(log.isTraceEnabled()) log.trace("clearProperty("+key+")"); > > > ConfigurationProperty config = new ConfigurationProperty(); > > > config.setName(key); > > > try { > > > Transaction transaction = session.beginTransaction(); > > > session.delete(config); > > > transaction.commit(); > > > } catch(HibernateException e) { > > > log.error("Error clearing congfiguration > > property=["+key+"]",e); > > > } > > > } > > > > > > /** > > > * @see org.apache.commons.configuration.Configuration#getKeys() > > > */ > > > public Iterator getKeys() { > > > if(log.isTraceEnabled()) log.trace("getKeys()"); > > > try { > > > List list = session.find("from Configuration"); > > > return new KeyIterator(list.iterator()); > > > } catch(HibernateException e) { > > > log.error("Error reading keys.",e); > > > return null; > > > } > > > } > > > > > > } > > > > > > > > > ------------------------------------------------------------------ > > ---------- > > ---- > > > > > > > /* > > > * Copyright 2004 Ricardo Gladwell > > > * > > > * Licensed under the Apache License, Version 2.0 (the "License"); > > > * you may not use this file except in compliance with the License. > > > * You may obtain a copy of the License at > > > * > > > * http://www.apache.org/licenses/LICENSE-2.0 > > > * > > > * Unless required by applicable law or agreed to in writing, software > > > * distributed under the License is distributed on an "AS IS" BASIS, > > > * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > > implied. > > > * See the License for the specific language governing permissions and > > > * limitations under the License. > > > */ > > > > > > package net.sf.jexus.server.data.object; > > > > > > /** > > > * Hibernate persistance JavaBean encapsulating information about > > > * a configuration property. > > > * > > > * @hibernate.class > > > * table="configuration" > > > * > > > * @todo Create JUnit test cases. > > > * @author <a href="mailto:[EMAIL PROTECTED]">Ricardo > > Gladwell</a> > > > * @version $Revision: 1.1 $, $Date: 2004/10/05 14:03:55 $ > > > */ > > > public class ConfigurationProperty { > > > > > > /** > > > * Name of this configuration property. > > > */ > > > String name; > > > > > > /** > > > * String representation of the valye of this configuration > > property. > > > */ > > > String value; > > > > > > /** > > > * Fully qualified class for this configuration property's type. > > > */ > > > String type; > > > > > > /** > > > * Returns the key name for this configuration property. > > > * > > > * @hibernate.id > > > * generator-class="assigned" > > > * > > > * @return Returns the name. > > > */ > > > public String getName() { > > > return name; > > > } > > > > > > /** > > > * Sets the key name for this configuration property. > > > * @param name The name to set. > > > */ > > > public void setName(String name) { > > > this.name = name; > > > } > > > > > > /** > > > * Returns the value of this property. > > > * > > > * @hibernate.property > > > * > > > * @return Returns the value. > > > */ > > > public String getValue() { > > > return value; > > > } > > > > > > /** > > > * Sets the value of this property. > > > * @param value The value to set. > > > */ > > > public void setValue(String value) { > > > this.value = value; > > > } > > > > > > /** > > > * Returns the fully qualified class name for the type > > > * of the value for this configuration property. > > > * > > > * @hibernate.property > > > * > > > * @return Returns the type. > > > */ > > > public String getType() { > > > return type; > > > } > > > > > > /** > > > * Sets the fully qualified class name for the type > > > * of the value for this configuration property. > > > * @param type The type to set. > > > */ > > > public void setType(String type) { > > > this.type = type; > > > } > > > } > > > > > > > > > > > > ------------------------------------------------------------------ > > ---------- > > ---- > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]