compositeid.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 691 行 · 第 1/2 页

JAVA
691
字号
/* * Copyright (c) 1998-2008 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 Scott Ferguson */package com.caucho.amber.field;import com.caucho.amber.manager.AmberPersistenceUnit;import com.caucho.amber.table.AmberColumn;import com.caucho.amber.type.BeanType;import com.caucho.amber.type.EmbeddableType;import com.caucho.amber.type.EntityType;import com.caucho.amber.type.AmberType;import com.caucho.java.JavaWriter;import com.caucho.util.CharBuffer;import com.caucho.util.L10N;import java.io.IOException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashSet;import java.util.logging.Logger;/** * Configuration for a bean's field */public class CompositeId extends Id {  private static final L10N L = new L10N(CompositeId.class);  private static final Logger log    = Logger.getLogger(CompositeId.class.getName());  private Class _tKeyClass;  public CompositeId(EntityType ownerType,                     ArrayList<IdField> keys)  {    super(ownerType, keys);  }  protected CompositeId(EntityType ownerType)  {    super(ownerType);  }  /**   * Sets the foreign key type.   */  public void setKeyClass(Class keyClass)  {    _tKeyClass = keyClass;    getOwnerType().addDependency(keyClass);  }  /**   * Returns the foreign type.   */  @Override  public String getForeignTypeName()  {    if (_tKeyClass != null)      return _tKeyClass.getName();    else if (isEmbeddedId())      return getEmbeddedIdField().getJavaTypeName();    else      return getOwnerType().getName();  }  /**   * Returns the foreign type.   */  public String getForeignMakeKeyName()  {    return getOwnerType().getName().replace('.', '_').replace('/', '_');  }  /**   * Generates any prologue.   */  @Override  public void generatePrologue(JavaWriter out, HashSet<Object> completedSet)    throws IOException  {    super.generatePrologue(out, completedSet);    generatePrologue(out, completedSet, getForeignMakeKeyName());  }  /**   * Generates any prologue.   */  @Override  public void generatePrologue(JavaWriter out,                               HashSet<Object> completedSet,                               String name)    throws IOException  {    // jpa/0u21    out.println();    out.println("private transient " + getForeignTypeName() + " __caucho_compound_key = new " + getForeignTypeName() + "();");          generatePrologueMake(out, completedSet);    generatePrologueLoad(out, completedSet);  }  /**   * Generates any prologue.   */  public void generatePrologueMake(JavaWriter out,                                   HashSet<Object> completedSet)    throws IOException  {    String makeName = "__caucho_make_key_" + getForeignMakeKeyName();    if (completedSet.contains(makeName))      return;    completedSet.add(makeName);    out.println();    out.print("private static ");    out.print(getForeignTypeName() + " " + makeName);    out.print("(");    if (! isEmbeddedId()) {      ArrayList<IdField> keys = getKeys();      for (int i = 0; i < keys.size(); i++) {        if (i != 0)          out.print(", ");        IdField key = keys.get(i);        out.print(key.getJavaTypeName() + " a" + i);      }    }    else {      EmbeddableType embeddable = (EmbeddableType) getEmbeddedIdField().getType();      ArrayList<AmberField> fields = embeddable.getFields();      for (int i = 0; i < fields.size(); i++) {        if (i != 0)          out.print(", ");        AmberField field = fields.get(i);        out.print(field.getJavaTypeName() + " a" + i);      }    }    out.println(")");    out.println("{");    out.pushDepth();    out.println();    out.println(getForeignTypeName() + " key = new " + getForeignTypeName() + "();");    if (getOwnerType().getPersistenceUnit().isJPA() && ! isEmbeddedId()) {      String args = "";      ArrayList<IdField> keys = getKeys();      for (int i = 0; i < keys.size(); i++) {        KeyPropertyField key = (KeyPropertyField) keys.get(i);        String name = key.getName();        char ch = Character.toUpperCase(name.charAt(0));        if (name.length() == 1)          name = "get" + ch;        else          name = "get" + ch + key.getName().substring(1);        Method method = BeanType.getGetter(_tKeyClass, name);        if (key.isKeyField() || (method != null)) {          out.println(key.generateSetKeyProperty("key", "a" + i) + ";");        }        else {          // Arg. constructor jpa/0u21          if (i != 0)            args += ", ";          args += " a" + i;          out.println("if (a" + i + " == null)");          out.println("  return new " + getForeignTypeName() + "();");          if (i + 1 == keys.size())            out.print("key = new " + getForeignTypeName() + "(" + args + ");");        }      }    }    else {      ArrayList fields;      if (getEmbeddedIdField() == null) {        // ejb/06x2        fields = getKeys();      }      else {        EmbeddableType embeddable          = (EmbeddableType) getEmbeddedIdField().getType();        fields = embeddable.getFields();      }      for (int i = 0; i < fields.size(); i++) {        AmberField field = (AmberField) fields.get(i);        if (getOwnerType().isFieldAccess())          out.println(field.generateSet("key", "a" + i) + ";");        else {          String setter = field.getName();          if (getOwnerType().getPersistenceUnit().isJPA()) {            setter = "set" + Character.toUpperCase(setter.charAt(0)) +              (setter.length() == 1 ? "" : setter.substring(1));            out.println("key." + setter + "(a" + i + ");");          }          else // XXX: ejb/06x2, ejb/06if            out.println("key." + setter + " = a" + i + ";");        }      }    }    out.println("return key;");    out.popDepth();    out.println("}");  }  /**   * Generates any prologue.   */  public void generatePrologueLoad(JavaWriter out,                                   HashSet<Object> completedSet)    throws IOException  {    String loadName = "__caucho_load_key_" + getForeignMakeKeyName();    if (completedSet.contains(loadName))      return;    completedSet.add(loadName);    out.println();    out.print("private static ");    out.print(getForeignTypeName() + " " + loadName);    out.println("(com.caucho.amber.manager.AmberConnection aConn, java.sql.ResultSet rs, int index)");    out.println("  throws java.sql.SQLException");    out.println("{");    out.pushDepth();    int index = 0;    ArrayList<IdField> keys = getKeys();    for (int i = 0; i < keys.size(); i++) {      IdField key = keys.get(i);      String javaType = key.getJavaTypeName();      out.print(javaType + " a" + i + " = (" + javaType + ") ");      index = key.getType().generateLoad(out, "rs", "index", index);      out.println(";");      out.println("if (rs.wasNull())");      out.println("  return null;");    }    out.print(getForeignTypeName() + " key = new " + getForeignTypeName() + "(");    if (isEmbeddedId() || ! getOwnerType().getPersistenceUnit().isJPA()) {      out.println(");");      // ejb/06x2      for (int i = 0; i < keys.size(); i++) {        out.println(keys.get(i).generateSetKeyProperty("key", "a" + i) + ";");      }    }    else {      for (int i = 0; i < keys.size(); i++) {        KeyPropertyField key = (KeyPropertyField) keys.get(i);        String name = key.getName();        char ch = Character.toUpperCase(name.charAt(0));        if (name.length() == 1)          name = "get" + ch;        else          name = "get" + ch + key.getName().substring(1);        Method method = BeanType.getGetter(_tKeyClass, name);        if (key.isKeyField() || (method != null)) {          if (i == 0)            out.println(");");          out.println(key.generateSetKeyProperty("key", "a" + i) + ";");        }        else {          // Arg. constructor jpa/0u21          if (i != 0)            out.print(", ");          out.print(" a" + i);          if (i + 1 == keys.size())            out.println(");");        }      }    }    out.println("return key;");    out.popDepth();    out.println("}");  }  /**   * Returns the foreign type.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?