/*
* 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 Scott Ferguson
*/
package com.caucho.amber.field;
import com.caucho.amber.expr.*;
import com.caucho.amber.manager.*;
import com.caucho.amber.query.QueryParser;
import com.caucho.amber.table.AmberColumn;
import com.caucho.amber.table.AmberTable;
import com.caucho.amber.type.*;
import com.caucho.bytecode.JType;
import com.caucho.config.ConfigException;
import com.caucho.java.JavaWriter;
import com.caucho.util.CharBuffer;
import com.caucho.util.L10N;
import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.*;
import java.util.logging.Logger;
/**
* Represents the sub-field of an embedded type.
*/
public class EmbeddedSubField implements AmberField {
private static final L10N L = new L10N(EmbeddedSubField.class);
protected static final Logger log
= Logger.getLogger(EmbeddedSubField.class.getName());
// The owning embedded field in the entity
private EntityEmbeddedField _embeddedField;
// The corresponding field of the embeddable type
private AmberField _embeddableField;
private AmberColumn _column;
private boolean _isInsert;
private boolean _isUpdate;
private int _index;
public EmbeddedSubField(EntityEmbeddedField embeddedField,
AmberField embeddableField,
int index)
throws ConfigException
{
_embeddedField = embeddedField;
_embeddableField = embeddableField;
_index = index;
AmberColumn embeddableColumn;
if (embeddableField instanceof PropertyField) {
embeddableColumn = ((PropertyField) embeddableField).getColumn();
}
else
throw new IllegalStateException(L.l("'{0}' is an unknown field type of @Embeddable bean.",
embeddableField.getClass().getName()));
if (embeddableColumn == null)
throw new IllegalStateException(embeddableField + " column is null");
_column = new AmberColumn(_embeddedField.getTable(),
embeddableColumn.getName(),
embeddableColumn.getType());
}
/**
* Returns the owning entity class.
*/
public BeanType getSourceType()
{
return _embeddedField.getSourceType();
}
/**
* Returns true if and only if this is a LAZY field.
*/
public boolean isLazy()
{
return _embeddedField.isLazy();
}
/**
* Returns the field name.
*/
public String getName()
{
return _embeddableField.getName();
}
/**
* Returns the table containing the value (or null)
*/
public AmberTable getTable()
{
return getColumn().getTable();
}
public AmberColumn getColumn()
{
return _column;
}
/**
* Returns the property index.
*/
public int getIndex()
{
return _embeddedField.getIndex();
}
/**
* Returns the property's group index.
*/
public int getLoadGroupIndex()
{
return _embeddedField.getLoadGroupIndex();
}
/**
* Returns the load group mask.
*/
public long getCreateLoadMask(int group)
{
return _embeddedField.getCreateLoadMask(group);
}
/**
* Returns the type of the field
*/
public JType getJavaType()
{
return _embeddableField.getJavaType();
}
/**
* Returns the type of the field
*/
public Class getJavaClass()
{
return getJavaType().getRawType().getJavaClass();
}
/**
* Returns the name of the java type.
*/
public String getJavaTypeName()
{
return _embeddableField.getJavaTypeName();
}
/**
* Returns true if the methods are abstract.
*/
public boolean isAbstract()
{
return false;
}
/**
* Returns true if the field is cascadable.
*/
public boolean isCascadable()
{
return false;
}
/**
* Returns true for an updateable field.
*/
public boolean isUpdateable()
{
return true;
}
/**
* Links to the target.
*/
public void setIndex(int index)
{
}
//
// getter/setter
//
/**
* Returns the getter method.
*/
public Method getGetterMethod()
{
return _embeddedField.getGetterMethod();
}
/**
* Returns the getter name.
*/
public String getGetterName()
{
return _embeddedField.getGetterName();
}
/**
* Returns the setter method.
*/
public Method getSetterMethod()
{
return _embeddedField.getSetterMethod();
}
/**
* Returns the setter name.
*/
public String getSetterName()
{
return _embeddedField.getSetterName();
}
/**
* Returns the actual data.
*/
public String generateSuperGetter(String objThis)
{
if (! getSourceType().isEmbeddable())
return "__caucho_super_get_" + getName() + "()";
else if (getSourceType().isFieldAccess())
return "__caucho_super_get_" + getName() + "()";
else
return getGetterMethod().getName() + "()";
}
/**
* Sets the actual data.
*/
public String generateSuperSetter(String objThis, String value)
{
/*
if (! getSourceType().isEmbeddable())
return objThis + "." + "__caucho_super_set_" + getName() + "(" + value + ")";
else
*/
if (getSourceType().isFieldAccess())
return objThis + "." + getName() + " = " + value;
else
return objThis + "." + getSetterName() + "(" + value + ")";
}
/**
* Generates loading cache
*/
public void generateSet(JavaWriter out, String objThis, String value)
throws IOException
{
_embeddedField.generateSet(out, objThis, value);
}
/**
* Links to the target.
*/
public void init()
throws ConfigException
{
}
/**
* Generates any prologue.
*/
public void generatePrologue(JavaWriter out, HashSet<Object> completedSet)
throws IOException
{
}
/**
* Generates the post constructor fixup
*/
public void generatePostConstructor(JavaWriter out)
throws IOException
{
}
/**
* Generates loading cache
*/
public void generateUpdate(JavaWriter out, String mask, String pstmt,
String index)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates loading code
*/
public boolean hasLoadGroup(int index)
{
throw new UnsupportedOperationException();
}
/**
* Generates loading code
*/
public int generateLoad(JavaWriter out, String rs,
String indexVar, int loadGroupIndex)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates loading code after the basic fields.
*/
public int generatePostLoadSelect(JavaWriter out, int index)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates loading for a native query
*/
public int generateLoadNative(JavaWriter out, int index)
throws IOException
{
return index;
}
/**
* Generates loading for a native query
*/
public void generateNativeColumnNames(ArrayList<String> names)
{
}
/**
* Generates loading cache
*/
public void generateLoadFromObject(JavaWriter out, String obj)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates loading cache
*/
public void generateUpdateFromObject(JavaWriter out, String obj)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates the field getter.
*
* @param value the non-null value
*/
public void generateGet(JavaWriter out, String value)
throws IOException
{
out.print(generateGet(value));
}
/**
* Generates the field getter.
*
* @param value the non-null value
*/
public String generateGet(String objThis)
{
String fieldType = getColumn().getType().getForeignType().getJavaTypeName();
return ("((" + fieldType + ") "
+ "((Embeddable) "
+ _embeddedField.generateGet(objThis)
+ ").__caucho_get_field(" + _index + "))");
}
/**
* Generates the field setter.
*
* @param value the non-null value
*/
public String generateSet(String obj, String value)
{
throw new UnsupportedOperationException();
}
/**
* Generates the get property.
*/
public void generateGetterMethod(JavaWriter out)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates the set property.
*/
public void generateSetterMethod(JavaWriter out)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates the get property.
*/
public void generateSuperGetterMethod(JavaWriter out)
throws IOException
{
}
/**
* Generates the get property.
*/
public void generateSuperSetterMethod(JavaWriter out)
throws IOException
{
}
/**
* Override the field
*/
public AmberField override(BeanType entityType)
{
throw new UnsupportedOperationException(getClass().getName());
}
/**
* Generates the table create.
*/
public String generateCreateTableSQL(AmberPersistenceUnit manager)
{
throw new UnsupportedOperationException();
}
/**
* Generates the JDBC preparedStatement set clause.
*/
public void generateStatementSet(JavaWriter out, String pstmt, String index)
throws IOException
{
getColumn().generateSet(out, pstmt, index, generateGet("this"));
}
/**
* Generates the set clause for the insert clause.
*/
public void generateInsertSet(JavaWriter out, String pstmt,
String index, String obj)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates the set clause for the insert clause.
*/
public void generateUpdateSet(JavaWriter out, String pstmt,
String index, String obj)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Updates the cached copy.
*/
public void generateCopyUpdateObject(JavaWriter out,
String dst, String src,
int updateIndex)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Updates the cached copy.
*/
public void generateCopyLoadObject(JavaWriter out,
String dst, String src,
int loadIndex)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Updates the cached copy.
*/
public void generateMergeFrom(JavaWriter out,
String dst, String src)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Checks entity-relationships from an object.
*/
public void generateDumpRelationships(JavaWriter out,
int updateIndex)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates the set clause.
*/
public void generateStatementSet(JavaWriter out, String pstmt,
String index, String obj)
throws IOException
{
getColumn().generateSet(out, pstmt, index, generateGet(obj));
}
/**
* Converts to an object.
*/
public String toObject(String value)
{
throw new UnsupportedOperationException();
}
/**
* Links to the target.
*/
public void link()
{
throw new UnsupportedOperationException();
}
/**
* Generates the delete foreign
*/
public void generatePreDelete(JavaWriter out)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates the delete foreign
*/
public void generatePostDelete(JavaWriter out)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates the expire code.
*/
public void generateExpire(JavaWriter out)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Generates code for foreign entity create/delete
*/
public void generateInvalidateForeign(JavaWriter out)
throws IOException
{
throw new UnsupportedOperationException();
}
/**
* Deletes the children
*/
public void childDelete(AmberConnection aConn, Serializable primaryKey)
throws SQLException
{
throw new UnsupportedOperationException();
}
/**
* Generates code to convert to the type from the object.
*/
public String generateCastFromObject(String value)
{
throw new UnsupportedOperationException();
}
/**
* Generates code to test the equals.
*/
public String generateEquals(String leftBase, String value)
{
throw new UnsupportedOperationException();
}
//
// SQL generation
/**
* Generates the select clause for an entity load.
*/
public String generateLoadSelect(AmberTable table, String id)
{
if (getColumn().getTable() == table)
return generateSelect(id);
else
return null;
}
/**
* Generates the select clause.
*/
public String generateSelect(String id)
{
return getColumn().generateSelect(id);
}
/**
* Generates the insert.
*/
public void generateInsertColumns(ArrayList<String> columns)
{
if (_isInsert)
columns.add(getColumn().getName());
}
/**
* Generates the JPA QL select clause.
*/
public String generateJavaSelect(String id)
{
throw new UnsupportedOperationException();
}
/**
* Generates the where clause.
*/
public String generateWhere(String id)
{
return getColumn().generateSelect(id);
}
/**
* Generates the where clause.
*/
public void generateUpdate(CharBuffer sql)
{
if (_isUpdate)
sql.append(getColumn().generateUpdateSet());
}
/**
* Generates any code needed before a persist occurs
*/
public void generatePrePersist(JavaWriter out)
throws IOException
{
}
/**
* Generates any code needed for detachment
*/
public void generateDetach(JavaWriter out)
throws IOException
{
}
//
// Query methods
/**
* Creates the expression for the field.
*/
public AmberExpr createExpr(QueryParser parser, PathExpr parent)
{
throw new UnsupportedOperationException();
}
}