## Copyright 2001-2005 The Apache Software Foundation.
##
## 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.
#*
 * author <a href="mailto:jmcnally@collab.net">John McNally</a>
 * author <a href="mailto:thomas@vandahl.org">Thomas Vandahl</a>
 * version $Id: BaseManager.vm 280407 2005-09-12 20:12:19Z tfischer $
 *#
#set ($interfaceName = $table.JavaName)
#if ($table.Interface)
  #set ($interfaceName = $table.Interface)
#end

/**
 * Copyright (c) 2006, yher.net
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 * * Redistributions of source code must retain the above copyright notice, 
 *   this list of conditions and the following disclaimer.
 * * 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.
 * * Neither the name of the nor the names of its contributors may be used to endorse or 
 *   promote products derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
 * ANY EXPRESS 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 COPYRIGHT OWNER OR 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.
 */
package ${packageBaseManager};

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import org.apache.torque.Torque;
import org.apache.torque.TorqueException;
import org.apache.torque.manager.AbstractBaseManager;
import org.apache.torque.manager.CacheListener;
import org.apache.torque.manager.MethodResultCache;
import org.apache.torque.om.ObjectKey;
import org.apache.torque.om.SimpleKey;
import org.apache.torque.om.Persistent;
import org.apache.torque.util.Criteria;

#if ($packageBaseManager != $packageManager)
import ${packageManager}.*;
#end

#if ($packageBaseManager != $packagePeer)
import ${packagePeer}.*;
#end

#if ($packageBaseManager != $packageObject)
import ${packageObject}.*;
#end

/**
 * This class manages $interfaceName objects.
 * This class was autogenerated by Torque #if ($addTimeStamp)on:
 *
 * [$now]
 *
 #end
 *
 * You should not use this class directly.  It should not even be
 * extended all references should be to ${interfaceName}Manager
 */
public abstract class $basePrefix${interfaceName}Manager
    extends AbstractBaseManager
{
    /** The name of the manager */
    protected static final String MANAGED_CLASS = "${package}.${interfaceName}";

    /** The name of our class to pass to Torque as the default manager. */
    protected static final String DEFAULT_MANAGER_CLASS
        = "${package}.${interfaceName}Manager";

    /**
     * Retrieves an implementation of the manager, based on the settings in
     * the configuration.
     *
     * @return an implementation of ${interfaceName}Manager.
     */
    public static ${interfaceName}Manager getManager()
    {
        return (${interfaceName}Manager)
            Torque.getManager(${interfaceName}Manager.MANAGED_CLASS,
                ${interfaceName}Manager.DEFAULT_MANAGER_CLASS);
    }

    /**
     * Static accessor for the @see #getInstanceImpl().
     *
     * @return a <code>${interfaceName}</code> value
     * @exception TorqueException if an error occurs
     */
    public static ${interfaceName} getInstance()
        throws TorqueException
    {
        return getManager().getInstanceImpl();
    }

    /**
     * Static accessor for the @see #getInstanceImpl(ObjectKey).
     *
     * @param id an <code>ObjectKey</code> value
     * @return a <code>${interfaceName}</code> value
     * @exception TorqueException if an error occurs
     */
    public static ${interfaceName} getInstance(ObjectKey id)
        throws TorqueException
    {
        return getManager().getInstanceImpl(id);
    }

    /**
     * Static accessor for the @see #getCachedInstanceImpl(ObjectKey).
     * Loads <code>${interfaceName}</code> from cache, returns 
     * <code>null</code>, if instance is not in cache
     *
     * @param id an <code>ObjectKey</code> value
     * @return a <code>${interfaceName}</code> value
     * @exception TorqueException if an error occurs
     */
    public static ${interfaceName} getCachedInstance(ObjectKey id)
        throws TorqueException
    {
        return getManager().getCachedInstanceImpl(id);
    }

    /**
     * Static accessor for the @see #getInstanceImpl(ObjectKey, boolean).
     *
     * @param id an <code>ObjectKey</code> value
     * @param fromCache if true, look for cached ${interfaceName}s before loading
     * from storage.
     * @return a <code>${interfaceName}</code> value
     * @exception TorqueException if an error occurs
     */
    public static ${interfaceName} getInstance(ObjectKey id, boolean fromCache)
        throws TorqueException
    {
        return getManager().getInstanceImpl(id, fromCache);
    }

#set ($pks = $table.PrimaryKey)
#if ($pks.size() == 1)
  #set ($pk = $pks.get(0))
    /**
     * Static accessor for the @see #getInstanceImpl(ObjectKey).
     *
     * @param id an <code>ObjectKey</code> value
     * @return a <code>${interfaceName}</code> value
     * @exception TorqueException if an error occurs
     */
    public static ${interfaceName} getInstance($pk.JavaNative id)
        throws TorqueException
    {
        return getManager().getInstanceImpl(SimpleKey.keyFor(id));
    }

    /**
     * Static accessor for the @see #getInstanceImpl(ObjectKey).
     *
     * @param id an <code>ObjectKey</code> value
     * @param fromCache if true, look for cached ${interfaceName}s before loading
     * from storage.
     * @return a <code>${interfaceName}</code> value
     * @exception TorqueException if an error occurs
     */
    public static ${interfaceName} getInstance($pk.JavaNative id, boolean fromCache)
        throws TorqueException
    {
        return getManager().getInstanceImpl(SimpleKey.keyFor(id), fromCache);
    }
#end

    /**
     * Static accessor for the @see #getInstancesImpl(List).
     *
     * @param ids a <code>List</code> value
     * @return a <code>List</code> value
     * @exception TorqueException if an error occurs
     */
    public static List getInstances(List ids)
        throws TorqueException
    {
        return getManager().getInstancesImpl(ids);
    }

    /**
     * Static accessor for the @see #getInstancesImpl(List, boolean).
     *
     * @param ids a <code>List</code> value
     * @param fromCache if true, look for cached ${interfaceName}s before loading
     * from storage.
     * @return a <code>List</code> value
     * @exception TorqueException if an error occurs
     */
    public static List getInstances(List ids, boolean fromCache)
        throws TorqueException
    {
        return getManager().getInstancesImpl(ids, fromCache);
    }

    public static void putInstance(Persistent om)
        throws TorqueException
    {
        getManager().putInstanceImpl(om);
    }

    public static void clear()
        throws TorqueException
    {
        getManager().clearImpl();
    }

    public static boolean exists(${interfaceName} obj)
        throws TorqueException
    {
        return getManager().existsImpl(obj);
    }

    public static MethodResultCache getMethodResult()
    {
        return getManager().getMethodResultCache();
    }

    public static void addCacheListener(CacheListener listener)
    {
        getManager().addCacheListenerImpl(listener);
    }

    /**
     * Creates a new <code>$basePrefix${interfaceName}Manager</code> instance.
     *
     * @exception TorqueException if an error occurs
     */
    public $basePrefix${interfaceName}Manager()
        throws TorqueException
    {
        setClassName("${package}.${interfaceName}");
    }

    /**
     * Get a fresh instance of a ${interfaceName}Manager
     */
    protected ${interfaceName} getInstanceImpl()
        throws TorqueException
    {
        ${interfaceName} obj = null;
        try
        {
            obj = (${interfaceName}) getOMInstance();
        }
        catch (Exception e)
        {
            throw new TorqueException(e);
        }
        return obj;
    }

    /**
     * Get a ${interfaceName} with the given id.
     *
     * @param id <code>ObjectKey</code> value
     */
    protected ${interfaceName} getInstanceImpl(ObjectKey id)
        throws TorqueException
    {
        return (${interfaceName}) getOMInstance(id);
    }

    /**
     * Get a ${interfaceName} with the given id from the cache. Returns 
     * <code>null</code> if instance is not in cache
     *
     * @param id <code>ObjectKey</code> value
     */
    protected ${interfaceName} getCachedInstanceImpl(ObjectKey id)
        throws TorqueException
    {
        return (${interfaceName}) cacheGet(id);
    }

    /**
     * Get a ${interfaceName} with the given id.
     *
     * @param id <code>ObjectKey</code> value
     * @param fromCache if true, look for cached ${interfaceName}s before loading
     * from storage.
     */
    protected ${interfaceName} getInstanceImpl(ObjectKey id, boolean fromCache)
        throws TorqueException
    {
        return (${interfaceName}) getOMInstance(id, fromCache);
    }

    /**
     * Gets a list of ${interfaceName}s based on id's.
     *
     * @param ids a List of <code>ObjectKeys</code> value
     * @return a <code>List</code> of ${interfaceName}s
     * @exception TorqueException if an error occurs
     */
    protected List getInstancesImpl(List ids)
        throws TorqueException
    {
        return getOMs(ids);
    }

    /**
     * Gets a list of ${interfaceName}s based on id's.
     *
     * @param ids a List of <code>ObjectKeys</code> value
     * @param fromCache if true, look for cached ${interfaceName}s before loading
     * from storage.
     * @return a <code>List</code> of ${interfaceName}s
     * @exception TorqueException if an error occurs
     */
    protected List getInstancesImpl(List ids, boolean fromCache)
        throws TorqueException
    {
        return getOMs(ids, fromCache);
    }

    /**
     * check for a duplicate project name
     */
    protected boolean existsImpl(${interfaceName} om)
        throws TorqueException
    {
        Criteria crit = ${table.JavaName}Peer
            .buildCriteria((${table.JavaName})om);
        return ${table.JavaName}Peer.doSelect(crit).size() > 0;
    }

#if ($table.isAlias())
  #set ($retrieveMethod = "retrieve${table.JavaName}ByPK")
#else
  #set ($retrieveMethod = "retrieveByPK")
#end

    protected Persistent retrieveStoredOM(ObjectKey id)
        throws TorqueException
    {
        return ${table.JavaName}Peer.${retrieveMethod}(id);
    }

    /**
     * Gets a list of ModuleEntities based on id's.
     *
     * @param ids a <code>NumberKey[]</code> value
     * @return a <code>List</code> value
     * @exception TorqueException if an error occurs
     */
    protected List retrieveStoredOMs(List ids)
        throws TorqueException
    {
        return ${table.JavaName}Peer.${retrieveMethod}s(ids);
    }
}
