diff src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java @ 10:a50cf11e5178

Rewrite LGDataverse completely upgrading to dataverse4.0
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Tue, 08 Sep 2015 17:00:21 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java	Tue Sep 08 17:00:21 2015 +0200
@@ -0,0 +1,171 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package edu.harvard.iq.dataverse;
+
+import java.util.List;
+import javax.ejb.Stateless;
+import javax.inject.Named;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.NonUniqueResultException;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+
+/**
+ *
+ * @author xyang
+ */
+@Stateless
+@Named
+public class DatasetFieldServiceBean implements java.io.Serializable {
+
+    @PersistenceContext(unitName = "VDCNet-ejbPU")
+    private EntityManager em;
+
+    private static final String NAME_QUERY = "SELECT dsfType from DatasetFieldType dsfType where dsfType.name= :fieldName";
+
+    public List<DatasetFieldType> findAllAdvancedSearchFieldTypes() {
+        return em.createQuery("select object(o) from DatasetFieldType as o where o.advancedSearchFieldType = true and o.title != '' order by o.id").getResultList();
+    }
+
+    public List<DatasetFieldType> findAllFacetableFieldTypes() {
+         return em.createNamedQuery("DatasetFieldType.findAllFacetable", DatasetFieldType.class)
+                .getResultList();   
+    }
+
+    public List<DatasetFieldType> findFacetableFieldTypesByMetadataBlock(Long metadataBlockId) {
+        return em.createNamedQuery("DatasetFieldType.findFacetableByMetadaBlock", DatasetFieldType.class)
+                .setParameter("metadataBlockId", metadataBlockId)
+                .getResultList();
+    }
+
+    public List<DatasetFieldType> findAllRequiredFields() {
+        return em.createQuery("select object(o) from DatasetFieldType as o where o.required = true order by o.id").getResultList();
+    }
+
+    public List<DatasetFieldType> findAllOrderedById() {
+        return em.createQuery("select object(o) from DatasetFieldType as o order by o.id").getResultList();
+    }
+
+    public List<DatasetFieldType> findAllOrderedByName() {
+        return em.createQuery("select object(o) from DatasetFieldType as o order by o.name").getResultList();
+    }
+
+    public DatasetFieldType find(Object pk) {
+        return (DatasetFieldType) em.find(DatasetFieldType.class, pk);
+    }
+
+    public DatasetFieldType findByName(String name) {
+        try {
+            return  (DatasetFieldType) em.createQuery(NAME_QUERY).setParameter("fieldName", name).getSingleResult();
+        } catch (NoResultException e) {
+            return null;
+        }
+       
+    }
+
+    /**
+     * Gets the dataset field type, or returns {@code null}. Does not throw
+     * exceptions.
+     *
+     * @param name the name do the field type
+     * @return the field type, or {@code null}
+     * @see #findByName(java.lang.String)
+     */
+    public DatasetFieldType findByNameOpt(String name) {
+        try {
+            return em.createNamedQuery("DatasetFieldType.findByName", DatasetFieldType.class)
+                    .setParameter("name", name)
+                    .getSingleResult();
+        } catch (NoResultException nre) {
+            return null;
+        }
+    }
+
+    /* 
+     * Similar method for looking up foreign metadata field mappings, for metadata
+     * imports. for these the uniquness of names isn't guaranteed (i.e., there 
+     * can be a field "author" in many different formats that we want to support), 
+     * so these have to be looked up by both the field name and the name of the 
+     * foreign format.
+     */
+    public ForeignMetadataFieldMapping findFieldMapping(String formatName, String pathName) {
+        try {
+            return em.createNamedQuery("ForeignMetadataFieldMapping.findByPath", ForeignMetadataFieldMapping.class)
+                    .setParameter("formatName", formatName)
+                    .setParameter("xPath", pathName)
+                    .getSingleResult();
+        } catch (NoResultException nre) {
+            return null;
+        }
+
+        // TODO: cache looked up results.
+    }
+
+    public ControlledVocabularyValue findControlledVocabularyValue(Object pk) {
+        return (ControlledVocabularyValue) em.find(ControlledVocabularyValue.class, pk);
+    }
+
+    /**
+     * @param dsft The DatasetFieldType in which to look up a
+     * ControlledVocabularyValue.
+     * @param strValue String value that may exist in a controlled vocabulary of
+     * the provided DatasetFieldType.
+     * @param lenient should we accept alternate spellings for value from mapping table
+     *
+     * @return The ControlledVocabularyValue found or null.
+     */
+    public ControlledVocabularyValue findControlledVocabularyValueByDatasetFieldTypeAndStrValue(DatasetFieldType dsft, String strValue, boolean lenient) {
+        TypedQuery<ControlledVocabularyValue> typedQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabularyValue AS o WHERE o.strValue = :strvalue AND o.datasetFieldType = :dsft", ControlledVocabularyValue.class);
+        typedQuery.setParameter("strvalue", strValue);
+        typedQuery.setParameter("dsft", dsft);
+        try {
+            ControlledVocabularyValue cvv = typedQuery.getSingleResult();
+            return cvv;
+        } catch (NoResultException | NonUniqueResultException ex) {
+            if (lenient) {
+                // if the value isn't found, check in the list of alternate values for this datasetFieldType
+                TypedQuery<ControlledVocabAlternate> alternateQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabAlternate as o WHERE o.strValue = :strvalue AND o.datasetFieldType = :dsft", ControlledVocabAlternate.class);
+                alternateQuery.setParameter("strvalue", strValue);
+                alternateQuery.setParameter("dsft", dsft);
+                try {
+                    ControlledVocabAlternate alternateValue = alternateQuery.getSingleResult();
+                    return alternateValue.getControlledVocabularyValue();
+                } catch (NoResultException | NonUniqueResultException ex2) {
+                    return null;
+                }
+
+            } else {
+                return null;
+            }
+        }
+    }
+
+    // return singleton NA Controled Vocabulary Value
+    public ControlledVocabularyValue findNAControlledVocabularyValue() {
+        TypedQuery<ControlledVocabularyValue> typedQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabularyValue AS o WHERE o.datasetFieldType is null AND o.strValue = :strvalue", ControlledVocabularyValue.class);
+        typedQuery.setParameter("strvalue", DatasetField.NA_VALUE);
+        return typedQuery.getSingleResult();
+    }
+
+    public DatasetFieldType save(DatasetFieldType dsfType) {
+        return em.merge(dsfType);
+    }
+
+    public MetadataBlock save(MetadataBlock mdb) {
+        return em.merge(mdb);
+    }
+
+    public ControlledVocabularyValue save(ControlledVocabularyValue cvv) {
+        return em.merge(cvv);
+    }
+    
+    public ControlledVocabAlternate save(ControlledVocabAlternate alt) {
+        return em.merge(alt);
+    } 
+
+}