Java tutorial
package org.apache.ddlutils.dynabean; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.DynaBean; import org.apache.commons.beanutils.DynaClass; import org.apache.ddlutils.model.Table; /** * Provides a cache of dyna class instances for a specific model, as well as * helper methods for dealing with these classes. * * @version $Revision: 231110 $ */ public class DynaClassCache { /** A cache of the SqlDynaClasses per table name. */ private Map _dynaClassCache = new HashMap(); /** * Creates a new dyna bean instance for the given table. * * @param table The table * @return The new empty dyna bean */ public DynaBean createNewInstance(Table table) throws SqlDynaException { try { return getDynaClass(table).newInstance(); } catch (InstantiationException ex) { throw new SqlDynaException("Could not create a new dyna bean for table " + table.getName(), ex); } catch (IllegalAccessException ex) { throw new SqlDynaException("Could not create a new dyna bean for table " + table.getName(), ex); } } /** * Creates a new dyna bean instance for the given table and copies the values from the * given source object. The source object can be a bean, a map or a dyna bean. * This method is useful when iterating through an arbitrary dyna bean * result set after performing a query, then creating a copy as a DynaBean * which is bound to a specific table. * This new DynaBean can be kept around, changed and stored back into the database. * * @param table The table to create the dyna bean for * @param source Either a bean, a {@link java.util.Map} or a dyna bean that will be used * to populate the resultint dyna bean * @return A new dyna bean bound to the given table and containing all the properties from * the source object */ public DynaBean copy(Table table, Object source) throws SqlDynaException { DynaBean answer = createNewInstance(table); try { // copy all the properties from the source BeanUtils.copyProperties(answer, source); } catch (InvocationTargetException ex) { throw new SqlDynaException("Could not populate the bean", ex); } catch (IllegalAccessException ex) { throw new SqlDynaException("Could not populate the bean", ex); } return answer; } /** * Returns the {@link SqlDynaClass} for the given table. If the it does not * exist yet, a new one will be created based on the Table definition. * * @param table The table * @return The <code>SqlDynaClass</code> for the indicated table */ public SqlDynaClass getDynaClass(Table table) { SqlDynaClass answer = (SqlDynaClass) _dynaClassCache.get(table.getName()); if (answer == null) { answer = createDynaClass(table); _dynaClassCache.put(table.getName(), answer); } return answer; } /** * Returns the {@link SqlDynaClass} for the given bean. * * @param dynaBean The bean * @return The dyna bean class */ public SqlDynaClass getDynaClass(DynaBean dynaBean) throws SqlDynaException { DynaClass dynaClass = dynaBean.getDynaClass(); if (dynaClass instanceof SqlDynaClass) { return (SqlDynaClass) dynaClass; } else { // TODO: we could autogenerate an SqlDynaClass here ? throw new SqlDynaException("The dyna bean is not an instance of a SqlDynaClass"); } } /** * Creates a new {@link SqlDynaClass} instance for the given table based on the table definition. * * @param table The table * @return The new dyna class */ private SqlDynaClass createDynaClass(Table table) { return SqlDynaClass.newInstance(table); } }