package org.cagrid.gme.service.impl.dao; import org.cagrid.gme.model.XMLSchema; import org.cagrid.gme.service.impl.domain.XMLSchemaInformation; import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.LockMode; import org.hibernate.Session; import org.springframework.orm.hibernate3.HibernateCallback; import javax.persistence.NonUniqueResultException; import java.net.URI; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class XMLSchemaInformationDao extends AbstractDao<XMLSchemaInformation> { @Override public Class<XMLSchemaInformation> domainClass() { return XMLSchemaInformation.class; } public XMLSchema getMaterializedXMLSchemaByTargetNamespace(URI targetNamespace) { XMLSchemaInformation info = getByTargetNamespace(targetNamespace); if (info == null) { return null; } materializeXMLSchemaInformation(info); return info.getSchema(); } public XMLSchema getXMLSchemaByTargetNamespace(URI targetNamespace) { XMLSchemaInformation info = getByTargetNamespace(targetNamespace); if (info == null) { return null; } return info.getSchema(); } public XMLSchemaInformation getByTargetNamespace(URI targetNamespace) { XMLSchemaInformation s = null; List<XMLSchemaInformation> schemas = getHibernateTemplate().find( "SELECT s FROM " + domainClass().getName() + " s WHERE s.schema.targetNamespace= ?", new Object[]{targetNamespace}); if (schemas.size() > 1) { throw new NonUniqueResultException("Found " + schemas.size() + " " + domainClass().getSimpleName() + " objects for URI '" + targetNamespace + "'"); } else if (schemas.size() == 1) { s = schemas.get(0); } return s; } public Collection<XMLSchemaInformation> getDependingXMLSchemaInformation(URI schemaTargetNamespace) { return getHibernateTemplate().find( "SELECT s FROM " + domainClass().getName() + " s JOIN s.imports as import WHERE import.schema.targetNamespace= ?", schemaTargetNamespace); } public Collection<XMLSchema> getDependingXMLSchemas(URI namespace) { Collection<XMLSchema> schemas = new ArrayList<XMLSchema>(); Collection<XMLSchemaInformation> dependingSchemas = getDependingXMLSchemaInformation(namespace); for (XMLSchemaInformation info : dependingSchemas) { schemas.add(info.getSchema()); } return schemas; } public Collection<URI> getAllNamespaces() { return getHibernateTemplate().find("SELECT s.schema.targetNamespace FROM " + domainClass().getName() + " s"); } // REVISIT: this is necessary unless I leave the session open until // after serialization public void materializeXMLSchemaInformation(final XMLSchemaInformation s) { getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { session.lock(s, LockMode.READ); Hibernate.initialize(s.getSchema()); Hibernate.initialize(s.getImports()); Hibernate.initialize(s.getSchema().getAdditionalDocuments()); return null; } }); } }