package com.cosylab.cdb.jdal;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Map;
import java.util.logging.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.omg.CORBA.NO_RESOURCES;
import org.omg.PortableServer.POA;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import alma.acs.logging.AcsLogLevel;
import alma.cdbErrType.CDBFieldDoesNotExistEx;
import alma.cdbErrType.CDBFieldIsReadOnlyEx;
import alma.cdbErrType.WrongCDBDataTypeEx;
import alma.cdbErrType.wrappers.AcsJCDBFieldDoesNotExistEx;
import alma.cdbErrType.wrappers.AcsJCDBFieldIsReadOnlyEx;
import alma.cdbErrType.wrappers.AcsJWrongCDBDataTypeEx;
import com.cosylab.CDB.WDAOOperations;
import com.cosylab.cdb.jdal.hibernate.ConvertToPrimitiveFeature;
import com.cosylab.cdb.jdal.hibernate.DOMJavaClassIntrospector;
import com.cosylab.cdb.jdal.hibernate.DOMJavaClassIntrospector.NodeAndMutator;
/*******************************************************************************
* ALMA - Atacama Large Millimiter Array
* (c) European Southern Observatory, 2002
* Copyright by ESO (in the framework of the ALMA collaboration)
* and Cosylab 2002, All rights reserved
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* @author msekoranja
*/
public class HibernateWDAOImpl implements WDAOOperations {
private final Session m_session;
private final String m_name;
private volatile Object m_rootNode;
private final POA m_poa;
private final boolean m_silent;
private final Logger m_logger;
private final boolean m_autoCommit;
public void setRootNode(Object mRootNode) {
m_rootNode = mRootNode;
}
public HibernateWDAOImpl(Session session, String name, Object rootNode, POA poa, Logger logger) {
this(session, name, rootNode, poa, logger, false, true);
}
public HibernateWDAOImpl(Session session, String name, Object rootNode, POA poa, Logger logger, boolean silent, boolean autoCommit) {
m_session = session;
m_name = name;
m_rootNode = rootNode;
m_poa = poa;
m_silent = silent;
m_logger = logger;
m_autoCommit = autoCommit;
}
private org.omg.PortableServer.Servant servant;
public void setSetvant(org.omg.PortableServer.Servant servant) {
this.servant = servant;
}
public void destroy() {
try {
if (m_poa != null && servant != null) {
// TODO now destroy is disabled, why:
// destroy should also remove this instance from cache (daoMap, wdaoMap, etc.)
// reference counting is needed, since we have multiple clients
/*
byte[] thisId = m_poa.servant_to_id(servant);
m_poa.deactivate_object(thisId);
*/
}
} catch (Exception e) {
if (!m_silent) {
m_logger.log(AcsLogLevel.NOTICE,"Exception destroying object "+ this +" : " + e);
e.printStackTrace();
}
}
}
public Object getField(String path)
throws AcsJCDBFieldDoesNotExistEx
{
// backward compatibility
final String CHARACTERISTICS_KEY = "_characteristics";
final String ATTRIBUTES_KEY = "_attributes";
final String ELEMENTS_KEY = "_elements";
final String SUBNODES_KEY = "_subnodes";
boolean subnodesRequest = false;
boolean elementsRequest = false;
boolean attributesRequest = false;
if (path.endsWith(CHARACTERISTICS_KEY))
{
path = path.substring(0, path.length() - CHARACTERISTICS_KEY.length());
attributesRequest = elementsRequest = subnodesRequest = true;
}
else if (path.endsWith(ATTRIBUTES_KEY))
{
path = path.substring(0, path.length() - ATTRIBUTES_KEY.length());
attributesRequest = true;
}
else if (path.endsWith(ELEMENTS_KEY))
{
path = path.substring(0, path.length() - ELEMENTS_KEY.length());
elementsRequest = true;
}
else if (path.endsWith(SUBNODES_KEY))
{
path = path.substring(0, path.length() - SUBNODES_KEY.length());
subnodesRequest = true;
}
Object field = DOMJavaClassIntrospector.getNode(path, m_rootNode);
if (field == null)
{
AcsJCDBFieldDoesNotExistEx e2 = new AcsJCDBFieldDoesNotExistEx();
e2.setFieldName(path);
throw e2;
}
// request for elements/attibutes (empty name)
if (path.length() == 0 || path.charAt(path.length() - 1) == '/')
{
// JDAL return attributes and subnodes
String[] attributes = attributesRequest ? DOMJavaClassIntrospector.getFields(field) : new String[0];
String[] elements = elementsRequest ? DOMJavaClassIntrospector.getElements(field) : new String[0];
String[] subnodes = subnodesRequest ? DOMJavaClassIntrospector.getSubnodes(field) : new String[0];
String[] concat = new String[attributes.length + elements.length + subnodes.length];
System.arraycopy(attributes, 0, concat, 0, attributes.length);
System.arraycopy(elements, 0, concat, attributes.length, elements.length);
System.arraycopy(subnodes, 0, concat, attributes.length + elements.length, subnodes.length);
field = concat;
}
// automatic conversion
if (field instanceof ConvertToPrimitiveFeature)
field = ((ConvertToPrimitiveFeature)field).convert();
// array support
if (field instanceof Element)
{
NodeList childList = ((Element)field).getChildNodes();
int childCount = childList.getLength();
StringBuffer strignifiedArray = new StringBuffer();
for (int i = 0; i < childCount; i++)
{
Node childNode = childList.item(i);
if (childNode instanceof Element && childNode.getAttributes().getLength() > 0)
{
if (strignifiedArray.length() > 0) strignifiedArray.append(',');
strignifiedArray.append(childNode.getAttributes().item(0).getTextContent());
}
}
field = strignifiedArray.toString();
}
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "DAO: '" + m_name + "' returned '" + path + "' = '" +
(field.getClass().isArray() ? DOMJavaClassIntrospector.stringifyArray(field) : field) + "'");
return field;
}
public int get_long(String propertyName)
throws WrongCDBDataTypeEx, CDBFieldDoesNotExistEx {
Object objectValue;
try{
objectValue = getField(propertyName);
}catch(AcsJCDBFieldDoesNotExistEx e){
throw e.toCDBFieldDoesNotExistEx();
}
try {
if (objectValue instanceof String)
return Integer.parseInt((String)objectValue);
else
return ((Number)objectValue).intValue();
} catch (ClassCastException nfe) {
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to cast '" + objectValue + "' to long: " + nfe);
AcsJWrongCDBDataTypeEx e2 = new AcsJWrongCDBDataTypeEx(nfe);
e2.setValue(objectValue.toString());
e2.setDataType("long");
throw e2.toWrongCDBDataTypeEx();
}
}
public double get_double(String propertyName)
throws WrongCDBDataTypeEx, CDBFieldDoesNotExistEx {
Object objectValue;
try{
objectValue = getField(propertyName);
}catch(AcsJCDBFieldDoesNotExistEx e){
throw e.toCDBFieldDoesNotExistEx();
}
try {
if (objectValue instanceof String)
return Double.parseDouble((String)objectValue);
else
return ((Number)objectValue).doubleValue();
} catch (ClassCastException nfe) {
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to cast '" + objectValue + "' to double: " + nfe);
AcsJWrongCDBDataTypeEx e2 = new AcsJWrongCDBDataTypeEx(nfe);
e2.setValue(objectValue.toString());
e2.setDataType("double");
throw e2.toWrongCDBDataTypeEx();
}
}
@SuppressWarnings("unchecked")
public String get_string(String propertyName)
throws WrongCDBDataTypeEx, CDBFieldDoesNotExistEx {
Object objectValue;
try{
objectValue = getField(propertyName);
}catch(AcsJCDBFieldDoesNotExistEx e){
throw e.toCDBFieldDoesNotExistEx();
}
try {
if (objectValue.getClass().isArray())
return DOMJavaClassIntrospector.stringifyArray(objectValue);
if (objectValue instanceof Map)
{
Object[] arr = ((Map)objectValue).keySet().toArray();
StringBuilder sb = new StringBuilder();
boolean first = true;
for (Object a : arr)
{
if (first) first = false; else sb.append(',');
sb.append((String)a);
}
return sb.toString();
}
Class<? extends Object> valueType = objectValue.getClass();
if (!DOMJavaClassIntrospector.isPrimitive(valueType))
throw new ClassCastException(valueType + " not a primitive/string/array");
objectValue = DOMJavaClassIntrospector.handleInfinity(objectValue);
return objectValue.toString();
} catch (ClassCastException nfe) {
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to cast '" + objectValue + "' to string: " + nfe);
AcsJWrongCDBDataTypeEx e2 = new AcsJWrongCDBDataTypeEx(nfe);
e2.setValue(objectValue.toString());
e2.setDataType("string");
throw e2.toWrongCDBDataTypeEx();
}
}
public String get_field_data(String propertyName)
throws WrongCDBDataTypeEx, CDBFieldDoesNotExistEx {
return get_string(propertyName);
}
@SuppressWarnings("unchecked")
public String[] get_string_seq(String propertyName)
throws WrongCDBDataTypeEx, CDBFieldDoesNotExistEx {
Object objectValue;
try{
objectValue = getField(propertyName);
}catch(AcsJCDBFieldDoesNotExistEx e){
throw e.toCDBFieldDoesNotExistEx();
}
// no conversion needed
if (objectValue instanceof String[])
return (String[])objectValue;
// Map keys
if (objectValue instanceof Map)
{
Map map = (Map)objectValue;
String[] retVal = new String[map.size()]; int i = 0;
for (Object obj : map.keySet())
retVal[i++] = (String)obj;
return retVal;
}
Class<? extends Object> type = objectValue.getClass();
if (objectValue instanceof String)
{
String[] tokens = ((String)objectValue).split(",");
for (int i = 0; i < tokens.length; i++)
tokens[i] = tokens[i].trim();
return tokens;
}
else if (!type.isArray() || !DOMJavaClassIntrospector.isPrimitive(type.getComponentType()))
{
if (!m_silent) {
// TODO take out the dummy exception. Now needed for debugging an OMC/TMCDB issue.
m_logger.log(AcsLogLevel.NOTICE, "DAO '" + m_name + "' failed to cast to String[] the property '" + propertyName
+ "' of type '" + type.toString() + "' with value "+ objectValue + "'.", new Exception("just for stack trace"));
}
AcsJWrongCDBDataTypeEx e2 = new AcsJWrongCDBDataTypeEx();
e2.setValue(objectValue.getClass().toString());
e2.setDataType("String[]");
throw e2.toWrongCDBDataTypeEx();
}
// do fancy conversion
int len = Array.getLength(objectValue);
String[] seq = new String[len];
for (int i = 0; i < len; i++)
seq[i] = DOMJavaClassIntrospector.handleInfinity(Array.get(objectValue, i)).toString();
return seq;
}
public int[] get_long_seq(String propertyName)
throws WrongCDBDataTypeEx, CDBFieldDoesNotExistEx {
Object objectValue;
try{
objectValue = getField(propertyName);
}catch(AcsJCDBFieldDoesNotExistEx e){
throw e.toCDBFieldDoesNotExistEx();
}
// no conversion needed
if (objectValue instanceof int[])
return (int[])objectValue;
Class<? extends Object> type = objectValue.getClass();
if (objectValue instanceof String)
{
String[] tokens = ((String)objectValue).split(",");
int[] retVal = new int[tokens.length];
try
{
for (int i = 0; i < tokens.length; i++)
retVal[i] = Integer.parseInt(tokens[i].trim());
return retVal;
} catch (NullPointerException npe) {
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to cast '" + objectValue + "' to long[].");
AcsJWrongCDBDataTypeEx e2 = new AcsJWrongCDBDataTypeEx();
e2.setValue(objectValue.getClass().toString());
e2.setDataType("long[]");
throw e2.toWrongCDBDataTypeEx();
}
}
else if (!type.isArray() || !type.getComponentType().isAssignableFrom(Number.class))
{
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to cast '" + objectValue + "' to long[].");
AcsJWrongCDBDataTypeEx e2 = new AcsJWrongCDBDataTypeEx();
e2.setValue(objectValue.getClass().toString());
e2.setDataType("long[]");
throw e2.toWrongCDBDataTypeEx();
}
// do fancy conversion
int len = Array.getLength(objectValue);
int[] seq = new int[len];
for (int i = 0; i < len; i++)
seq[i] = ((Number) Array.get(objectValue, i)).intValue();
return seq;
}
public double[] get_double_seq(String propertyName)
throws WrongCDBDataTypeEx, CDBFieldDoesNotExistEx {
Object objectValue;
try{
objectValue = getField(propertyName);
}catch(AcsJCDBFieldDoesNotExistEx e){
throw e.toCDBFieldDoesNotExistEx();
}
// no conversion needed
if (objectValue instanceof double[])
return (double[])objectValue;
Class<? extends Object> type = objectValue.getClass();
if (objectValue instanceof String)
{
String[] tokens = ((String)objectValue).split(",");
double[] retVal = new double[tokens.length];
try
{
for (int i = 0; i < tokens.length; i++)
retVal[i] = Double.parseDouble(tokens[i].trim());
return retVal;
} catch (NullPointerException npe) {
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to cast '" + objectValue + "' to dluble[].");
AcsJWrongCDBDataTypeEx e2 = new AcsJWrongCDBDataTypeEx();
e2.setValue(objectValue.getClass().toString());
e2.setDataType("double[]");
throw e2.toWrongCDBDataTypeEx();
}
}
else if (!type.isArray() || !type.getComponentType().isAssignableFrom(Number.class))
{
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to cast '" + objectValue + "' to double[].");
AcsJWrongCDBDataTypeEx e2 = new AcsJWrongCDBDataTypeEx();
e2.setValue(objectValue.getClass().toString());
e2.setDataType("double[]");
throw e2.toWrongCDBDataTypeEx();
}
// do fancy conversion
int len = Array.getLength(objectValue);
double[] seq = new double[len];
for (int i = 0; i < len; i++)
seq[i] = ((Number) Array.get(objectValue, i)).doubleValue();
return seq;
}
/* (non-Javadoc)
* @see com.cosylab.CDB.WDAOOperations#set_long(java.lang.String, int)
*/
@SuppressWarnings("unchecked")
public void set_long(String propertyName, int value)
throws CDBFieldIsReadOnlyEx, CDBFieldDoesNotExistEx {
NodeAndMutator nodeAndMutator = DOMJavaClassIntrospector.getRecursiveMutatorMethod(propertyName, m_rootNode);
if (nodeAndMutator == null) {
AcsJCDBFieldDoesNotExistEx ex = new AcsJCDBFieldDoesNotExistEx();
ex.setFieldName(propertyName);
throw ex.toCDBFieldDoesNotExistEx();
}
Transaction tr = null;
try
{
if (nodeAndMutator.mutator.getParameterTypes().length != 1) {
AcsJCDBFieldIsReadOnlyEx acsex = new AcsJCDBFieldIsReadOnlyEx();
acsex.setFieldName(propertyName);
throw acsex.toCDBFieldIsReadOnlyEx();
}
Object toSet;
Class parameterClass = nodeAndMutator.mutator.getParameterTypes()[0];
if (parameterClass.isAssignableFrom(String.class))
toSet = String.valueOf(value);
else if (parameterClass.isAssignableFrom(Integer.class)
|| parameterClass.isAssignableFrom(int.class))
toSet = Integer.valueOf(value);
else if (parameterClass.isAssignableFrom(Long.class)
|| parameterClass.isAssignableFrom(long.class))
toSet = Long.valueOf(value);
else if (parameterClass.isAssignableFrom(Byte.class)
|| parameterClass.isAssignableFrom(byte.class))
toSet = Byte.valueOf((byte)value);
else if (parameterClass.isAssignableFrom(Short.class)
|| parameterClass.isAssignableFrom(short.class))
toSet = Short.valueOf((short)value);
else if (parameterClass.isAssignableFrom(Double.class)
|| parameterClass.isAssignableFrom(double.class))
toSet = Double.valueOf(value);
else if (parameterClass.isAssignableFrom(Float.class)
|| parameterClass.isAssignableFrom(float.class))
toSet = Float.valueOf(value);
else if (parameterClass.isAssignableFrom(Boolean.class)
|| parameterClass.isAssignableFrom(boolean.class))
toSet = (value != 0);
else
throw new NO_RESOURCES("cannot convert value");
if (m_autoCommit) tr = m_session.beginTransaction();
nodeAndMutator.mutator.invoke(nodeAndMutator.node, new Object[] { toSet });
if (tr != null) tr.commit();
} catch (Throwable th) {
if (tr != null)
tr.rollback();
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to set '" + value + "' to : " + (this.m_name + "/" + propertyName), th);
throw new NO_RESOURCES(th.getMessage());
}
}
/*
* (non-Javadoc)
*
* @see com.cosylab.CDB.WDAOOperations#set_string(java.lang.String,
* java.lang.String)
*/
@SuppressWarnings("unchecked")
public void set_string(String propertyName, String value)
throws CDBFieldIsReadOnlyEx, CDBFieldDoesNotExistEx {
NodeAndMutator nodeAndMutator = DOMJavaClassIntrospector.getRecursiveMutatorMethod(propertyName, m_rootNode);
if (nodeAndMutator == null) {
AcsJCDBFieldDoesNotExistEx ex = new AcsJCDBFieldDoesNotExistEx();
ex.setFieldName(propertyName);
throw ex.toCDBFieldDoesNotExistEx();
}
Transaction tr = null;
try
{
if (nodeAndMutator.mutator.getParameterTypes().length != 1) {
AcsJCDBFieldIsReadOnlyEx acsex = new AcsJCDBFieldIsReadOnlyEx();
acsex.setFieldName(propertyName);
throw acsex.toCDBFieldIsReadOnlyEx();
}
Object toSet;
Class parameterClass = nodeAndMutator.mutator.getParameterTypes()[0];
if (parameterClass.isAssignableFrom(String.class))
toSet = String.valueOf(value);
else if (parameterClass.isAssignableFrom(Integer.class)
|| parameterClass.isAssignableFrom(int.class))
toSet = Integer.valueOf(value);
else if (parameterClass.isAssignableFrom(Long.class)
|| parameterClass.isAssignableFrom(long.class))
toSet = Long.valueOf(value);
else if (parameterClass.isAssignableFrom(Byte.class)
|| parameterClass.isAssignableFrom(byte.class))
toSet = Byte.valueOf(value);
else if (parameterClass.isAssignableFrom(Short.class)
|| parameterClass.isAssignableFrom(short.class))
toSet = Short.valueOf(value);
else if (parameterClass.isAssignableFrom(Double.class)
|| parameterClass.isAssignableFrom(double.class))
toSet = Double.valueOf(value);
else if (parameterClass.isAssignableFrom(Float.class)
|| parameterClass.isAssignableFrom(float.class))
toSet = Float.valueOf(value);
else if (parameterClass.isAssignableFrom(Boolean.class)
|| parameterClass.isAssignableFrom(boolean.class))
toSet = Boolean.valueOf(value);
else
throw new NO_RESOURCES("cannot convert value");
if (m_autoCommit) tr = m_session.beginTransaction();
nodeAndMutator.mutator.invoke(nodeAndMutator.node, new Object[] { toSet });
if (tr != null) tr.commit();
} catch (Throwable th) {
if (tr != null)
tr.rollback();
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to set '" + value + "' to : " + (this.m_name + "/" + propertyName), th);
throw new NO_RESOURCES(th.getMessage());
}
}
/* (non-Javadoc)
* @see com.cosylab.CDB.WDAOOperations#set_double(java.lang.String, double)
*/
@SuppressWarnings("unchecked")
public void set_double(String propertyName, double value)
throws CDBFieldIsReadOnlyEx, CDBFieldDoesNotExistEx {
NodeAndMutator nodeAndMutator = DOMJavaClassIntrospector.getRecursiveMutatorMethod(propertyName, m_rootNode);
if (nodeAndMutator == null) {
AcsJCDBFieldDoesNotExistEx ex = new AcsJCDBFieldDoesNotExistEx();
ex.setFieldName(propertyName);
throw ex.toCDBFieldDoesNotExistEx();
}
Transaction tr = null;
try
{
if (nodeAndMutator.mutator.getParameterTypes().length != 1) {
AcsJCDBFieldIsReadOnlyEx acsex = new AcsJCDBFieldIsReadOnlyEx();
acsex.setFieldName(propertyName);
throw acsex.toCDBFieldIsReadOnlyEx();
}
Object toSet;
Class parameterClass = nodeAndMutator.mutator.getParameterTypes()[0];
if (parameterClass.isAssignableFrom(String.class))
toSet = String.valueOf(value);
else if (parameterClass.isAssignableFrom(Integer.class)
|| parameterClass.isAssignableFrom(int.class))
toSet = Integer.valueOf((int)value);
else if (parameterClass.isAssignableFrom(Long.class)
|| parameterClass.isAssignableFrom(long.class))
toSet = Long.valueOf((long)value);
else if (parameterClass.isAssignableFrom(Byte.class)
|| parameterClass.isAssignableFrom(byte.class))
toSet = Byte.valueOf((byte)value);
else if (parameterClass.isAssignableFrom(Short.class)
|| parameterClass.isAssignableFrom(short.class))
toSet = Short.valueOf((short)value);
else if (parameterClass.isAssignableFrom(Double.class)
|| parameterClass.isAssignableFrom(double.class))
toSet = Double.valueOf(value);
else if (parameterClass.isAssignableFrom(Float.class)
|| parameterClass.isAssignableFrom(float.class))
toSet = Float.valueOf((float)value);
else if (parameterClass.isAssignableFrom(Boolean.class)
|| parameterClass.isAssignableFrom(boolean.class))
toSet = (value != 0);
else
throw new NO_RESOURCES("cannot convert value");
if (m_autoCommit) tr = m_session.beginTransaction();
nodeAndMutator.mutator.invoke(nodeAndMutator.node, new Object[] { toSet });
if (tr != null) tr.commit();
} catch (Throwable th) {
if (tr != null)
tr.rollback();
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to set '" + value + "' to : " + (this.m_name + "/" + propertyName), th);
throw new NO_RESOURCES(th.getMessage());
}
}
/* (non-Javadoc)
* @see com.cosylab.CDB.WDAOOperations#set_field_data(java.lang.String, java.lang.String)
*/
public void set_field_data(String propertyName, String value)
throws CDBFieldIsReadOnlyEx, CDBFieldDoesNotExistEx,
WrongCDBDataTypeEx {
set_string(propertyName, value);
}
/* (non-Javadoc)
* @see com.cosylab.CDB.WDAOOperations#set_string_seq(java.lang.String, java.lang.String[])
*/
@SuppressWarnings("unchecked")
public void set_string_seq(String propertyName, String[] value)
throws CDBFieldIsReadOnlyEx, CDBFieldDoesNotExistEx {
NodeAndMutator nodeAndMutator = DOMJavaClassIntrospector.getRecursiveMutatorMethod(propertyName, m_rootNode);
if (nodeAndMutator == null) {
AcsJCDBFieldDoesNotExistEx ex = new AcsJCDBFieldDoesNotExistEx();
ex.setFieldName(propertyName);
throw ex.toCDBFieldDoesNotExistEx();
}
Transaction tr = null;
try
{
if (nodeAndMutator.mutator.getParameterTypes().length != 1) {
AcsJCDBFieldIsReadOnlyEx acsex = new AcsJCDBFieldIsReadOnlyEx();
acsex.setFieldName(propertyName);
throw acsex.toCDBFieldIsReadOnlyEx();
}
Object toSet;
Class parameterClass = nodeAndMutator.mutator.getParameterTypes()[0];
if (parameterClass.isAssignableFrom(String.class))
{
StringBuilder strValue = new StringBuilder(64);
if (value.length > 0)
{
for (int i = 0; i < value.length-1; i++) {
strValue.append(value[i]).append(',');
}
strValue.append(value[value.length-1]);
}
toSet = strValue.toString();
}
else if (parameterClass.isAssignableFrom(String[].class))
{
toSet = value;
}
else if (parameterClass.isAssignableFrom(int[].class))
{
int[] arr = new int[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = Integer.valueOf(value[i]);
toSet = arr;
}
else if (parameterClass.isAssignableFrom(long[].class))
{
long[] arr = new long[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = Long.valueOf(value[i]);
toSet = arr;
}
else if (parameterClass.isAssignableFrom(byte[].class))
{
byte[] arr = new byte[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = Byte.valueOf(value[i]);
toSet = arr;
}
else if (parameterClass.isAssignableFrom(short[].class))
{
short[] arr = new short[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = Short.valueOf(value[i]);
toSet = arr;
}
else if (parameterClass.isAssignableFrom(double[].class))
{
double[] arr = new double[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = Double.valueOf(value[i]);
toSet = arr;
}
else if (parameterClass.isAssignableFrom(float[].class))
{
float[] arr = new float[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = Float.valueOf(value[i]);
toSet = arr;
}
else if (parameterClass.isAssignableFrom(boolean[].class))
{
boolean[] arr = new boolean[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = Boolean.valueOf(value[i]);
toSet = arr;
}
else
throw new NO_RESOURCES("cannot convert value");
if (m_autoCommit) tr = m_session.beginTransaction();
nodeAndMutator.mutator.invoke(nodeAndMutator.node, new Object[] { toSet });
if (tr != null) tr.commit();
} catch (Throwable th) {
if (tr != null)
tr.rollback();
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to set '" + Arrays.toString(value) + "' to : " + (this.m_name + "/" + propertyName), th);
throw new NO_RESOURCES(th.getMessage());
}
}
/* (non-Javadoc)
* @see com.cosylab.CDB.WDAOOperations#set_long_seq(java.lang.String, int[])
*/
@SuppressWarnings("unchecked")
public void set_long_seq(String propertyName, int[] value)
throws CDBFieldIsReadOnlyEx, CDBFieldDoesNotExistEx {
NodeAndMutator nodeAndMutator = DOMJavaClassIntrospector.getRecursiveMutatorMethod(propertyName, m_rootNode);
if (nodeAndMutator == null) {
AcsJCDBFieldDoesNotExistEx ex = new AcsJCDBFieldDoesNotExistEx();
ex.setFieldName(propertyName);
throw ex.toCDBFieldDoesNotExistEx();
}
Transaction tr = null;
try
{
if (nodeAndMutator.mutator.getParameterTypes().length != 1) {
AcsJCDBFieldIsReadOnlyEx acsex = new AcsJCDBFieldIsReadOnlyEx();
acsex.setFieldName(propertyName);
throw acsex.toCDBFieldIsReadOnlyEx();
}
Object toSet;
Class parameterClass = nodeAndMutator.mutator.getParameterTypes()[0];
if (parameterClass.isAssignableFrom(String.class))
{
StringBuilder strValue = new StringBuilder(64);
if (value.length > 0)
{
for (int i = 0; i < value.length-1; i++) {
strValue.append(value[i]).append(',');
}
strValue.append(value[value.length-1]);
}
toSet = strValue.toString();
}
else if (parameterClass.isAssignableFrom(String[].class))
{
String[] arr = new String[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = String.valueOf(value[i]);
toSet = arr;
}
else if (parameterClass.isAssignableFrom(int[].class))
{
int[] arr = new int[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (int)value[i];
toSet = arr;
}
else if (parameterClass.isAssignableFrom(long[].class))
{
toSet = value;
}
else if (parameterClass.isAssignableFrom(byte[].class))
{
byte[] arr = new byte[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (byte)value[i];
toSet = arr;
}
else if (parameterClass.isAssignableFrom(short[].class))
{
short[] arr = new short[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (short)value[i];
toSet = arr;
}
else if (parameterClass.isAssignableFrom(double[].class))
{
double[] arr = new double[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (double)value[i];
toSet = arr;
}
else if (parameterClass.isAssignableFrom(float[].class))
{
float[] arr = new float[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (float)value[i];
toSet = arr;
}
else if (parameterClass.isAssignableFrom(boolean[].class))
{
boolean[] arr = new boolean[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (value[i] != 0);
toSet = arr;
}
else
throw new NO_RESOURCES("cannot convert value");
if (m_autoCommit) tr = m_session.beginTransaction();
nodeAndMutator.mutator.invoke(nodeAndMutator.node, new Object[] { toSet });
if (tr != null) tr.commit();
} catch (Throwable th) {
if (tr != null)
tr.rollback();
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to set '" + Arrays.toString(value) + "' to : " + (this.m_name + "/" + propertyName), th);
throw new NO_RESOURCES(th.getMessage());
}
}
/* (non-Javadoc)
* @see com.cosylab.CDB.WDAOOperations#set_double_seq(java.lang.String, double[])
*/
@SuppressWarnings("unchecked")
public void set_double_seq(String propertyName, double[] value)
throws CDBFieldIsReadOnlyEx, CDBFieldDoesNotExistEx {
NodeAndMutator nodeAndMutator = DOMJavaClassIntrospector.getRecursiveMutatorMethod(propertyName, m_rootNode);
if (nodeAndMutator == null) {
AcsJCDBFieldDoesNotExistEx ex = new AcsJCDBFieldDoesNotExistEx();
ex.setFieldName(propertyName);
throw ex.toCDBFieldDoesNotExistEx();
}
Transaction tr = null;
try
{
if (nodeAndMutator.mutator.getParameterTypes().length != 1) {
AcsJCDBFieldIsReadOnlyEx acsex = new AcsJCDBFieldIsReadOnlyEx();
acsex.setFieldName(propertyName);
throw acsex.toCDBFieldIsReadOnlyEx();
}
Object toSet;
Class parameterClass = nodeAndMutator.mutator.getParameterTypes()[0];
if (parameterClass.isAssignableFrom(String.class))
{
StringBuilder strValue = new StringBuilder(64);
if (value.length > 0)
{
for (int i = 0; i < value.length-1; i++) {
strValue.append(value[i]).append(',');
}
strValue.append(value[value.length-1]);
}
toSet = strValue.toString();
}
else if (parameterClass.isAssignableFrom(String[].class))
{
String[] arr = new String[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = String.valueOf(value[i]);
toSet = arr;
}
else if (parameterClass.isAssignableFrom(int[].class))
{
int[] arr = new int[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (int)value[i];
toSet = arr;
}
else if (parameterClass.isAssignableFrom(long[].class))
{
long[] arr = new long[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (long)value[i];
toSet = arr;
}
else if (parameterClass.isAssignableFrom(byte[].class))
{
byte[] arr = new byte[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (byte)value[i];
toSet = arr;
}
else if (parameterClass.isAssignableFrom(short[].class))
{
short[] arr = new short[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (short)value[i];
toSet = arr;
}
else if (parameterClass.isAssignableFrom(double[].class))
{
toSet = value;
}
else if (parameterClass.isAssignableFrom(float[].class))
{
float[] arr = new float[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (float)value[i];
toSet = arr;
}
else if (parameterClass.isAssignableFrom(boolean[].class))
{
boolean[] arr = new boolean[value.length];
for (int i = 0; i < arr.length; i++)
arr[i] = (value[i] != 0);
toSet = arr;
}
else
throw new NO_RESOURCES("cannot convert value");
if (m_autoCommit) tr = m_session.beginTransaction();
nodeAndMutator.mutator.invoke(nodeAndMutator.node, new Object[] { toSet });
if (tr != null) tr.commit();
} catch (Throwable th) {
if (tr != null)
tr.rollback();
if (!m_silent)
m_logger.log(AcsLogLevel.NOTICE, "Failed to set '" + Arrays.toString(value) + "' to : " + (this.m_name + "/" + propertyName), th);
throw new NO_RESOURCES(th.getMessage());
}
}
}