/* * Copyright 2008 Alberto Gimeno <gimenete at gmail.com> * * 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. */ package siena.jdbc; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.lang.reflect.Field; import java.math.BigDecimal; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; import siena.ClassInfo; import siena.Json; import siena.SienaException; import siena.Util; import siena.core.DecimalPrecision; import siena.core.Polymorphic; import siena.embed.Embedded; import siena.embed.JsonSerializer; public class GoogleSqlPersistenceManager extends JdbcPersistenceManager { private static final String DB = "GOOGLESQL"; public GoogleSqlPersistenceManager() { super(); // TODO Auto-generated constructor stub } public GoogleSqlPersistenceManager(ConnectionManager connectionManager, Class<?> listener) { super(connectionManager, listener); // TODO Auto-generated constructor stub } @Override protected int addParameters(Object obj, List<Field> fields, PreparedStatement ps, int i) throws SQLException { for (Field field : fields) { Class<?> type = field.getType(); if(ClassInfo.isModel(type) && ! ClassInfo.isEmbedded(field)) { JdbcClassInfo ci = JdbcClassInfo.getClassInfo(type); Object rel = Util.readField(obj, field); for(Field f : ci.keys) { if(rel != null) { Object value = Util.readField(rel, f); if(value instanceof Json) value = ((Json)value).toString(); setParameter(ps, i++, value, f); } else { setParameter(ps, i++, null, f); } } } else { Object value = Util.readField(obj, field); if(value != null){ if(Json.class.isAssignableFrom(type)){ value = ((Json)value).toString(); } else if(field.getAnnotation(Embedded.class) != null){ value = JsonSerializer.serialize(value).toString(); } else if(field.getAnnotation(Polymorphic.class) != null){ ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out; try { out = new ObjectOutputStream(bos); out.writeObject(value); out.close(); } catch (IOException e) { throw new SienaException(e); } value = bos.toByteArray(); } else if(Enum.class.isAssignableFrom(type)){ value = value.toString(); } else if(BigDecimal.class == type){ DecimalPrecision ann = field.getAnnotation(DecimalPrecision.class); if(ann == null) { value = (BigDecimal)value; }else { switch(ann.storageType()){ case DOUBLE: value = ((BigDecimal)value).doubleValue(); break; case STRING: value = ((BigDecimal)value).toPlainString(); break; case NATIVE: value = (BigDecimal)value; break; } } } } setParameter(ps, i++, value, field); } } return i; } protected void setParameter(PreparedStatement ps, int index, Object value, Field field) throws SQLException { JdbcDBUtils.setObject(ps, index, value, field, DB); } }