Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateCDOPackageHandler.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateCDOPackageHandler.java293
1 files changed, 293 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateCDOPackageHandler.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateCDOPackageHandler.java
new file mode 100644
index 0000000000..ac262fd4f2
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateCDOPackageHandler.java
@@ -0,0 +1,293 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2008 Eike Stepper, 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:
+ * Eike Stepper - initial API and implementation
+ * Martin Taal - moved code from HibernateStore to this class
+ **************************************************************************/
+package org.eclipse.emf.cdo.server.internal.hibernate;
+
+import org.eclipse.emf.cdo.internal.protocol.model.CDOClassImpl;
+import org.eclipse.emf.cdo.internal.protocol.model.CDOFeatureImpl;
+import org.eclipse.emf.cdo.internal.protocol.model.CDOPackageImpl;
+import org.eclipse.emf.cdo.protocol.model.CDOClass;
+import org.eclipse.emf.cdo.protocol.model.CDOFeature;
+import org.eclipse.emf.cdo.protocol.model.CDOPackage;
+import org.eclipse.emf.cdo.protocol.model.CDOPackageInfo;
+import org.eclipse.emf.cdo.server.internal.hibernate.bundle.OM;
+
+import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
+import org.eclipse.net4j.util.WrappedException;
+import org.eclipse.net4j.util.io.IOUtil;
+
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.tool.hbm2ddl.SchemaUpdate;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * Delegate which stores and retrieves cdo packages.
+ *
+ * @author Eike Stepper
+ * @author Martin Taal
+ */
+public class HibernateCDOPackageHandler
+{
+ private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, HibernateStoreWriter.class);
+
+ private static final ContextTracer WARNING = new ContextTracer(OM.WARNING, HibernateStoreWriter.class);
+
+ private Configuration configuration;
+
+ private SessionFactory sessionFactory;
+
+ private int nextPackageID;
+
+ private int nextClassID;
+
+ private int nextFeatureID;
+
+ private Properties properties;
+
+ private Collection<CDOPackageInfo> cdoPackageInfos = null;
+
+ private Collection<CDOPackage> cdoPackages = null;
+
+ private HibernateStore hibernateStore;
+
+ public HibernateCDOPackageHandler(Properties props, HibernateStore hibernateStore)
+ {
+ properties = props;
+ this.hibernateStore = hibernateStore;
+ TRACER.trace("Created " + this.getClass().getName() + " with properties:");
+ for (Object keyObject : props.keySet())
+ {
+ TRACER.trace("Property: " + keyObject + ": " + props.get(keyObject));
+ }
+ }
+
+ public void writePackages(CDOPackage... cdoPackages)
+ {
+ TRACER.trace("Persisting new CDOPackages");
+ final Session session = getSessionFactory().openSession();
+ final Transaction tx = session.beginTransaction();
+ boolean err = true;
+ try
+ {
+ for (CDOPackage cdoPackage : cdoPackages)
+ {
+ if (null != getCDOPackage(cdoPackage.getPackageURI()))
+ {
+ WARNING.trace("CDOPackage " + cdoPackage.getPackageURI() + " already exists not persisting it again!");
+ continue;
+ }
+ TRACER.trace("Persisting CDOPackage " + cdoPackage.getPackageURI());
+ session.saveOrUpdate(cdoPackage);
+ }
+ tx.commit();
+ err = false;
+ }
+ finally
+ {
+ if (err)
+ {
+ tx.rollback();
+ }
+ session.close();
+ }
+ reset();
+ hibernateStore.reInitialize();
+ }
+
+ public void writePackage(CDOPackage cdoPackage)
+ {
+ if (null != getCDOPackage(cdoPackage.getPackageURI()))
+ {
+ WARNING.trace("CDOPackage " + cdoPackage.getPackageURI() + " already exists not persisting it again!");
+ return;
+ }
+ final Session session = getSessionFactory().openSession();
+ final Transaction tx = session.beginTransaction();
+ boolean err = true;
+ try
+ {
+ TRACER.trace("Persisting CDOPackage " + cdoPackage.getPackageURI());
+ session.saveOrUpdate(cdoPackage);
+ tx.commit();
+ err = false;
+ }
+ finally
+ {
+ if (err)
+ {
+ tx.rollback();
+ }
+ session.close();
+ }
+ reset();
+ hibernateStore.reInitialize();
+ }
+
+ public CDOPackage getCDOPackage(String uri)
+ {
+ TRACER.trace("Getting CDOPackage using uri: " + uri);
+ for (CDOPackage cdoPackage : cdoPackages)
+ {
+ if (cdoPackage.getPackageURI().compareTo(uri) == 0)
+ {
+ TRACER.trace("CDOPackage found");
+ return cdoPackage;
+ }
+ }
+ TRACER.trace("CDOPackage NOT found");
+ return null;
+ }
+
+ public Collection<CDOPackageInfo> getCDOPackageInfos()
+ {
+ readPackages();
+ return cdoPackageInfos;
+ }
+
+ public Collection<CDOPackage> getCDOPackages()
+ {
+ readPackages();
+ return cdoPackages;
+ }
+
+ protected void readPackages()
+ {
+ if (cdoPackageInfos == null)
+ {
+ TRACER.trace("Reading CDOPackages from db");
+ Collection<CDOPackageInfo> result = new ArrayList<CDOPackageInfo>();
+ Collection<CDOPackage> resultPackages = new ArrayList<CDOPackage>();
+ Session session = getSessionFactory().openSession();
+ try
+ {
+ Criteria criteria = session.createCriteria(CDOPackageImpl.class);
+ List<?> list = criteria.list();
+ TRACER.trace("Found " + list.size() + " CDOPackages in DB");
+ for (Object object : list)
+ {
+ CDOPackageImpl cdoPackage = (CDOPackageImpl)object;
+ TRACER.trace("Read CDOPackage: " + cdoPackage.getName());
+ result.add(new CDOPackageInfo(cdoPackage.getPackageURI(), cdoPackage.isDynamic(), null));
+ cdoPackage.setPackageManager(hibernateStore.getRepository().getPackageManager());
+ resultPackages.add(cdoPackage);
+
+ // repair something
+ // TODO: set this in the mapping with a bi-directional relation
+ for (CDOClass cdoClass : cdoPackage.getClasses())
+ {
+ ((CDOClassImpl)cdoClass).setContainingPackage(cdoPackage);
+ for (CDOFeature cdoFeature : cdoClass.getFeatures())
+ {
+ ((CDOFeatureImpl)cdoFeature).setContainingClass(cdoClass);
+ }
+ }
+ }
+ cdoPackages = resultPackages;
+ cdoPackageInfos = result;
+ }
+ finally
+ {
+ session.close();
+ }
+ }
+ TRACER.trace("Finished reading CDOPackages");
+ }
+
+ public synchronized SessionFactory getSessionFactory()
+ {
+ if (sessionFactory == null)
+ {
+ sessionFactory = configuration.buildSessionFactory();
+ }
+
+ return sessionFactory;
+ }
+
+ public synchronized int getNextPackageID()
+ {
+ // TODO Better synchronization
+ return nextPackageID++;
+ }
+
+ public synchronized int getNextClassID()
+ {
+ // TODO Better synchronization
+ return nextClassID++;
+ }
+
+ public synchronized int getNextFeatureID()
+ {
+ // TODO Better synchronization
+ return nextFeatureID++;
+ }
+
+ public void reset()
+ {
+ cdoPackageInfos = null;
+ cdoPackages = null;
+ }
+
+ protected void doActivate()
+ {
+ TRACER.trace("Activating CDOPackageHandler");
+
+ initConfiguration();
+ initSchema();
+ }
+
+ protected void doDeactivate() throws Exception
+ {
+ TRACER.trace("De-Activating CDOPackageHandler");
+
+ if (sessionFactory != null)
+ {
+ sessionFactory.close();
+ sessionFactory = null;
+ }
+ }
+
+ protected void initConfiguration()
+ {
+ TRACER.trace("Initializing datastore for CDO metadata");
+ InputStream in = null;
+
+ try
+ {
+ in = OM.BUNDLE.getInputStream("mappings/meta.hbm.xml");
+ configuration = new Configuration();
+ configuration.addInputStream(in);
+ configuration.setProperties(properties);
+ }
+ catch (Exception ex)
+ {
+ throw WrappedException.wrap(ex);
+ }
+ finally
+ {
+ IOUtil.close(in);
+ }
+ }
+
+ protected void initSchema()
+ {
+ TRACER.trace("Updating db schema for Hibernate PackageHandler");
+ new SchemaUpdate(configuration).execute(true, true);
+ }
+}

Back to the top