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 + -
显示快捷键?