/* * Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com) and * JR Boyens <gnu-jrb[remove] at gmx dot net> * Licensed under the Apache License, Version 2.0 (the "License") * $Id: GenericQueryManagerFactory.java 3918 2008-04-14 17:35:35Z gbevin $ */ package com.uwyn.rife.database.querymanagers.generic; import com.uwyn.rife.database.Datasource; import com.uwyn.rife.database.DbQueryManagerCache; import com.uwyn.rife.database.exceptions.DatabaseException; import com.uwyn.rife.database.exceptions.UnsupportedJdbcDriverException; import com.uwyn.rife.database.querymanagers.generic.exceptions.MissingDefaultConstructorException; import com.uwyn.rife.site.Constrained; import com.uwyn.rife.site.ConstrainedProperty; import com.uwyn.rife.site.ConstrainedUtils; import com.uwyn.rife.tools.ClassUtils; import com.uwyn.rife.tools.StringUtils; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Collection; public class GenericQueryManagerFactory { private final static String GENERIC_DRIVER = "generic"; private static DbQueryManagerCache mCache = new DbQueryManagerCache(); private static String mPackageName = GenericQueryManagerFactory.class.getPackage().getName()+".databasedrivers."; public static <BeanType> GenericQueryManager<BeanType> getInstance(Datasource datasource, Class<BeanType> beanClass) throws DatabaseException { String short_name = ClassUtils.shortenClassName(beanClass); return getInstance(datasource, beanClass, short_name); } public static <BeanType> GenericQueryManager<BeanType> getInstance(Datasource datasource, Class<BeanType> beanClass, String tableName) throws DatabaseException { AbstractGenericQueryManager<BeanType> query_manager = null; String driver = datasource.getAliasedDriver(); try { beanClass.getConstructor(new Class[] {}); } catch (NoSuchMethodException e) { throw new MissingDefaultConstructorException(beanClass, e); } // get the identifier column String primary_key = null; boolean has_identifier = false; Constrained constrained_bean = ConstrainedUtils.getConstrainedInstance(beanClass); if (constrained_bean != null) { for (ConstrainedProperty property : (Collection<ConstrainedProperty>)constrained_bean.getConstrainedProperties()) { if (property.isIdentifier()) { primary_key = property.getPropertyName(); has_identifier = true; break; } } } if (null == primary_key) { primary_key = "id"; } // check if the query manager wasn't cached before String cache_name = "GENERIC."+beanClass.getName()+"."+primary_key; query_manager = (AbstractGenericQueryManager<BeanType>)mCache.get(datasource, cache_name); if (query_manager != null) { return query_manager; } // construct the specialized driver class name StringBuilder specialized_name = new StringBuilder(mPackageName); specialized_name.append(StringUtils.encodeClassname(driver)); try { try { Class<AbstractGenericQueryManager<BeanType>> specialized_class = (Class<AbstractGenericQueryManager<BeanType>>)Class.forName(specialized_name.toString()); Constructor<AbstractGenericQueryManager<BeanType>> specialized_constructor = specialized_class.getConstructor(new Class[] {Datasource.class, String.class, String.class, Class.class, boolean.class}); query_manager = specialized_constructor.newInstance(new Object[] {datasource, tableName, primary_key, beanClass, Boolean.valueOf(has_identifier)}); } catch (ClassNotFoundException e) { // could not find a specialized class, try to get a generic driver try { // construct the generic driver class name StringBuilder generic_name = new StringBuilder(mPackageName); generic_name.append(GENERIC_DRIVER); Class<AbstractGenericQueryManager<BeanType>> generic_class = (Class<AbstractGenericQueryManager<BeanType>>)Class.forName(generic_name.toString()); Constructor<AbstractGenericQueryManager<BeanType>> generic_constructor = generic_class.getConstructor(new Class[] {Datasource.class, String.class, String.class, Class.class, boolean.class}); query_manager = generic_constructor.newInstance(new Object[] {datasource, tableName, primary_key, beanClass, Boolean.valueOf(has_identifier)}); } catch (ClassNotFoundException e2) { throw new UnsupportedJdbcDriverException(driver, e); } } } catch (InstantiationException e) { throw new UnsupportedJdbcDriverException(driver, e); } catch (IllegalAccessException e) { throw new UnsupportedJdbcDriverException(driver, e); } catch (NoSuchMethodException e) { throw new UnsupportedJdbcDriverException(driver, e); } catch (SecurityException e) { throw new UnsupportedJdbcDriverException(driver, e); } catch (InvocationTargetException e) { if (e.getTargetException() != null) { throw new RuntimeException(e.getTargetException()); } else { throw new UnsupportedJdbcDriverException(driver, e); } } return query_manager; } }