/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Rodrigo Westrupp */ package com.caucho.amber.gen; import com.caucho.VersionFactory; import com.caucho.amber.entity.Listener; import com.caucho.amber.type.ListenerType; import com.caucho.java.JavaWriter; import com.caucho.java.gen.ClassComponent; import com.caucho.util.L10N; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; /** * Generates the Java code for the wrapped entity listener object. */ public class ListenerComponent extends ClassComponent { private static final L10N L = new L10N(ListenerComponent.class); private String _baseClassName; private String _extClassName; private ListenerType _listenerType; public ListenerComponent() { } /** * Sets the bean info for the generator */ public void setListenerType(ListenerType listenerType) { _listenerType = listenerType; } /** * Sets the base class name */ public void setBaseClassName(String baseClassName) { _baseClassName = baseClassName; } /** * Gets the base class name */ public String getBaseClassName() { return _baseClassName; } /** * Sets the ext class name */ public void setExtClassName(String extClassName) { _extClassName = extClassName; } /** * Sets the ext class name */ public String getClassName() { return _extClassName; } /** * Get bean class name. */ public String getBeanClassName() { return _baseClassName; } /** * Starts generation of the Java code */ @Override public void generate(JavaWriter out) throws IOException { try { generateHeader(out); generateMainCallback(out, _listenerType); generateCallbacks(out, Listener.PRE_PERSIST, _listenerType); generateCallbacks(out, Listener.POST_PERSIST, _listenerType); generateCallbacks(out, Listener.PRE_REMOVE, _listenerType); generateCallbacks(out, Listener.POST_REMOVE, _listenerType); generateCallbacks(out, Listener.PRE_UPDATE, _listenerType); generateCallbacks(out, Listener.POST_UPDATE, _listenerType); generateCallbacks(out, Listener.POST_LOAD, _listenerType); } catch (IOException e) { throw e; } } /** * Generates the class header for the generated code. */ private void generateHeader(JavaWriter out) throws IOException { out.println("/*"); out.println(" * Generated by Resin Amber"); out.println(" * " + VersionFactory.getVersion()); out.println(" */"); out.print("private static final java.util.logging.Logger __caucho_log = "); out.println("java.util.logging.Logger.getLogger(\"" + getBeanClassName() + "\");"); // if (_listenerType.getParentType() == null) { out.println(); } private void generateMainCallback(JavaWriter out, ListenerType listenerType) throws IOException { out.println("public void __caucho_callback(int callbackIndex, Object entity)"); out.println("{"); out.pushDepth(); out.println("switch (callbackIndex) {"); out.println("case com.caucho.amber.entity.Listener.PRE_PERSIST:"); out.println(" __caucho_prePersist(entity);"); out.println(" break;"); out.println("case com.caucho.amber.entity.Listener.POST_PERSIST:"); out.println(" __caucho_postPersist(entity);"); out.println(" break;"); out.println("case com.caucho.amber.entity.Listener.PRE_REMOVE:"); out.println(" __caucho_preRemove(entity);"); out.println(" break;"); out.println("case com.caucho.amber.entity.Listener.POST_REMOVE:"); out.println(" __caucho_postRemove(entity);"); out.println(" break;"); out.println("case com.caucho.amber.entity.Listener.PRE_UPDATE:"); out.println(" __caucho_preUpdate(entity);"); out.println(" break;"); out.println("case com.caucho.amber.entity.Listener.POST_UPDATE:"); out.println(" __caucho_postUpdate(entity);"); out.println(" break;"); out.println("case com.caucho.amber.entity.Listener.POST_LOAD:"); out.println(" __caucho_postLoad(entity);"); out.println(" break;"); out.println("}"); out.popDepth(); out.println("}"); } private void generateCallbacks(JavaWriter out, int callbackIndex, ListenerType listenerType) throws IOException { String name = toCallbackName(callbackIndex); out.println("public void __caucho_" + name + "(Object entity)"); out.println("{"); out.pushDepth(); ArrayList<Method> callbacks = null; ListenerType parentType; parentType = listenerType; do { switch (callbackIndex) { case Listener.PRE_PERSIST: callbacks = parentType.getPrePersistCallbacks(); break; case Listener.POST_PERSIST: callbacks = parentType.getPostPersistCallbacks(); break; case Listener.PRE_REMOVE: callbacks = parentType.getPreRemoveCallbacks(); break; case Listener.POST_REMOVE: callbacks = parentType.getPostRemoveCallbacks(); break; case Listener.PRE_UPDATE: callbacks = parentType.getPreUpdateCallbacks(); break; case Listener.POST_UPDATE: callbacks = parentType.getPostUpdateCallbacks(); break; case Listener.POST_LOAD: callbacks = parentType.getPostLoadCallbacks(); break; } if (callbacks.size() > 0) break; parentType = parentType.getParentType(); } while (parentType != null); if (callbacks.size() > 0) { for (Method method : callbacks) { Class params[] = method.getParameterTypes(); out.print("this."); /* jpa/0r42 if (listenerType.getParentType() == null) out.print("this."); else out.print("super."); */ out.print(method.getName()); out.println("((" + params[0].getName() + ") entity);"); } } out.popDepth(); out.println("}"); } private static String toCallbackName(int callbackIndex) { switch (callbackIndex) { case Listener.PRE_PERSIST: return "prePersist"; case Listener.POST_PERSIST: return "postPersist"; case Listener.PRE_REMOVE: return "preRemove"; case Listener.POST_REMOVE: return "postRemove"; case Listener.PRE_UPDATE: return "preUpdate"; case Listener.POST_UPDATE: return "postUpdate"; case Listener.POST_LOAD: return "postLoad"; } return null; } }