| /* |
| * Copyright (c) 2009-2012, 2015 Eike Stepper (Berlin, Germany) 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 - initial api |
| * Eike Stepper - maintenance |
| */ |
| package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; |
| |
| import org.eclipse.emf.cdo.server.internal.hibernate.HibernateCommitContext; |
| import org.eclipse.emf.cdo.server.internal.hibernate.HibernateThreadContext; |
| import org.eclipse.emf.cdo.server.internal.hibernate.HibernateUtil; |
| import org.eclipse.emf.cdo.spi.common.revision.CDOFeatureMapEntry; |
| |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.EPackage; |
| import org.eclipse.emf.ecore.EStructuralFeature; |
| |
| import org.hibernate.HibernateException; |
| import org.hibernate.PropertyNotFoundException; |
| import org.hibernate.engine.spi.SessionFactoryImplementor; |
| import org.hibernate.engine.spi.SessionImplementor; |
| import org.hibernate.property.Getter; |
| import org.hibernate.property.PropertyAccessor; |
| import org.hibernate.property.Setter; |
| |
| import java.lang.reflect.Member; |
| import java.lang.reflect.Method; |
| import java.util.Map; |
| |
| /** |
| * Handles the string representation of the feature of the feature map entry in the database. |
| * |
| * @see CDOFeatureMapEntry#setEStructuralFeature(EStructuralFeature) |
| * @author <a href="mailto:mtaal@elver.org">Martin Taal</a> |
| */ |
| public class FeatureMapEntryFeatureURIPropertyHandler implements PropertyAccessor, Getter, Setter |
| { |
| private static final String EFEATURE_SEPARATOR = "#"; //$NON-NLS-1$ |
| |
| private static final long serialVersionUID = 1L; |
| |
| @SuppressWarnings("rawtypes") |
| public Getter getGetter(Class theClass, String propertyName) throws PropertyNotFoundException |
| { |
| return this; |
| } |
| |
| @SuppressWarnings("rawtypes") |
| public Setter getSetter(Class theClass, String propertyName) throws PropertyNotFoundException |
| { |
| return this; |
| } |
| |
| public Member getMember() |
| { |
| return null; |
| } |
| |
| public Object get(Object owner) throws HibernateException |
| { |
| final CDOFeatureMapEntry cdoFeatureMapEntry = (CDOFeatureMapEntry)owner; |
| if (cdoFeatureMapEntry.getEStructuralFeature() == null) |
| { |
| return null; |
| } |
| return getEStructuralFeatureAsString(cdoFeatureMapEntry); |
| } |
| |
| @SuppressWarnings("rawtypes") |
| public Object getForInsert(Object owner, Map mergeMap, SessionImplementor session) throws HibernateException |
| { |
| return get(owner); |
| } |
| |
| public Method getMethod() |
| { |
| return null; |
| } |
| |
| public String getMethodName() |
| { |
| return null; |
| } |
| |
| @SuppressWarnings("rawtypes") |
| public Class getReturnType() |
| { |
| return String.class; |
| } |
| |
| public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException |
| { |
| final CDOFeatureMapEntry cdoFeatureMapEntry = (CDOFeatureMapEntry)target; |
| setEStructuralFeatureFromString(cdoFeatureMapEntry, (String)value); |
| } |
| |
| /** |
| * Set the EStructuralFeature (see {@link #setEStructuralFeature(EStructuralFeature)}) from its String representation. |
| * |
| * @param eFeatureURI |
| * a String representation, must be created by the {@link #getEStructuralFeatureAsString()} method |
| * @see #getEStructuralFeatureAsString() |
| */ |
| private void setEStructuralFeatureFromString(CDOFeatureMapEntry fmEntry, String eFeatureURI) |
| { |
| final int firstSeparator = eFeatureURI.indexOf(EFEATURE_SEPARATOR); |
| final int lastSeparator = eFeatureURI.lastIndexOf(EFEATURE_SEPARATOR); |
| if (firstSeparator == -1 || lastSeparator == -1 || firstSeparator == lastSeparator) |
| { |
| throw new IllegalArgumentException("EFeature URI " + eFeatureURI + " has an illegal format"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| final String ePackageURI = eFeatureURI.substring(0, firstSeparator); |
| final String eClassName = eFeatureURI.substring(1 + firstSeparator, lastSeparator); |
| final String eFeatureName = eFeatureURI.substring(1 + lastSeparator); |
| |
| final EPackage ePackage; |
| if (HibernateThreadContext.isCommitContextSet()) |
| { |
| final HibernateCommitContext hbCommitContext = HibernateThreadContext.getCommitContext(); |
| ePackage = hbCommitContext.getCommitContext().getPackageRegistry().getEPackage(ePackageURI); |
| } |
| else |
| { |
| ePackage = HibernateUtil.getInstance().getPackageRegistry().getEPackage(ePackageURI); |
| } |
| if (ePackage == null) |
| { |
| throw new IllegalArgumentException( |
| "EPackage not found using " + eFeatureURI + " and EPackageURI: " + ePackageURI); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| final EClass eClass = (EClass)ePackage.getEClassifier(eClassName); |
| if (eClass == null) |
| { |
| throw new IllegalArgumentException("EClass not found using " + eFeatureURI + " and EClass name " + eClassName); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| final EStructuralFeature eFeature = eClass.getEStructuralFeature(eFeatureName); |
| if (eFeature == null) |
| { |
| throw new IllegalArgumentException("EClass not found using " + eFeatureURI + ", EClass name " + eClassName //$NON-NLS-1$ //$NON-NLS-2$ |
| + " and EFeature name " + eFeatureName); //$NON-NLS-1$ |
| } |
| |
| fmEntry.setEStructuralFeature(eFeature); |
| } |
| |
| /** |
| * @return a unique String version for an EStructuralFeature |
| */ |
| private String getEStructuralFeatureAsString(CDOFeatureMapEntry fmEntry) |
| { |
| final EStructuralFeature eFeature = fmEntry.getEStructuralFeature(); |
| final EClass eClass = eFeature.getEContainingClass(); |
| return eClass.getEPackage().getNsURI() + EFEATURE_SEPARATOR + eClass.getName() + EFEATURE_SEPARATOR |
| + eFeature.getName(); |
| } |
| } |