package org.eclipse.emf.teneo.hibernate.mapping;
/**
* <copyright>
*
* Copyright (c) 2009 Springsite BV (The Netherlands) and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Martin Taal
* </copyright>
*
* $Id: EcoreModelElementType.java,v 1.2 2009/03/15 14:49:46 mtaal Exp $
*/
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
/**
* Persists references to EClassifiers and EStructuralFeatures as a varchar
* field.
*
* @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
* @version $Revision: 1.2 $ $Date: 2009/03/15 14:49:46 $
*/
public class EcoreModelElementType implements UserType {
private static final int[] SQL_TYPES = new int[] { Types.VARCHAR };
private static final String SEPARATOR = "_;_";
public Object assemble(Serializable cached, Object owner)
throws HibernateException {
return convertFromString((String) cached);
}
public Object deepCopy(Object value) throws HibernateException {
return value;
}
public Serializable disassemble(Object value) throws HibernateException {
return convertToString(value);
}
public boolean equals(Object x, Object y) throws HibernateException {
if (x == null && y == null) {
return true;
}
if (x == null || y == null) {
return false;
}
if (x.getClass() != y.getClass()) {
return false;
}
return x.equals(y);
}
public int hashCode(Object x) throws HibernateException {
return x.hashCode();
}
public boolean isMutable() {
return false;
}
public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
throws HibernateException, SQLException {
final String value = rs.getString(names[0]);
if (rs.wasNull()) {
return null;
}
return convertFromString(value);
}
private Object convertFromString(String value) {
final String[] values = value.split(SEPARATOR);
final String nsuri = values[0];
final EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(nsuri);
if (values.length == 1) { // EPackage
return ePackage;
} else if (values.length == 2) { // EClassifier
final String eClassifierName = values[1];
final EClassifier eClassifier = ePackage
.getEClassifier(eClassifierName);
return eClassifier;
} else {
final String eClassifierName = values[1];
final EClassifier eClassifier = ePackage
.getEClassifier(eClassifierName);
final EClass eClass = (EClass) eClassifier;
final String eFeatureName = values[2];
return eClass.getEStructuralFeature(eFeatureName);
}
}
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws HibernateException, SQLException {
if (value == null) {
st.setNull(index, Types.VARCHAR);
} else {
st.setString(index, convertToString(value));
}
}
private String convertToString(Object value) {
if (value instanceof EPackage) {
final String uri = ((EPackage) value).getNsURI();
return uri;
} else if (value instanceof EClassifier) {
final EClassifier eClassifier = (EClassifier) value;
final String uri = eClassifier.getEPackage().getNsURI();
final String eClassifierName = eClassifier.getName();
return uri + SEPARATOR + eClassifierName;
} else {
final EStructuralFeature feature = (EStructuralFeature) value;
final String uri = feature.getEContainingClass().getEPackage()
.getNsURI();
final String eClassName = feature.getEContainingClass().getName();
final String eFeatureName = feature.getName();
return uri + SEPARATOR + eClassName + SEPARATOR + eFeatureName;
}
}
public Object replace(Object original, Object target, Object owner)
throws HibernateException {
return original;
}
public Class<?> returnedClass() {
return EStructuralFeature.class;
}
public int[] sqlTypes() {
return SQL_TYPES;
}
}