Mercurial > hg > LGDataverses
comparison src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.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 |
comparison
equal
deleted
inserted
replaced
| 9:5926d6419569 | 10:a50cf11e5178 |
|---|---|
| 1 /* | |
| 2 * To change this license header, choose License Headers in Project Properties. | |
| 3 * To change this template file, choose Tools | Templates | |
| 4 * and open the template in the editor. | |
| 5 */ | |
| 6 package edu.harvard.iq.dataverse; | |
| 7 | |
| 8 import edu.harvard.iq.dataverse.authorization.users.User; | |
| 9 import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; | |
| 10 import java.io.File; | |
| 11 import java.sql.Timestamp; | |
| 12 import java.util.ArrayList; | |
| 13 import java.util.Date; | |
| 14 import java.util.List; | |
| 15 import java.util.logging.Logger; | |
| 16 import java.util.ResourceBundle; | |
| 17 import java.util.MissingResourceException; | |
| 18 import java.util.Properties; | |
| 19 import java.util.concurrent.Future; | |
| 20 import javax.ejb.EJB; | |
| 21 import javax.ejb.Stateless; | |
| 22 import javax.inject.Inject; | |
| 23 import javax.inject.Named; | |
| 24 import javax.persistence.EntityManager; | |
| 25 import javax.persistence.NoResultException; | |
| 26 import javax.persistence.NonUniqueResultException; | |
| 27 import javax.persistence.PersistenceContext; | |
| 28 import javax.persistence.Query; | |
| 29 import javax.persistence.TypedQuery; | |
| 30 | |
| 31 /** | |
| 32 * | |
| 33 * @author gdurand | |
| 34 */ | |
| 35 @Stateless | |
| 36 @Named | |
| 37 public class DataverseServiceBean implements java.io.Serializable { | |
| 38 | |
| 39 private static final Logger logger = Logger.getLogger(DataverseServiceBean.class.getCanonicalName()); | |
| 40 @EJB | |
| 41 IndexServiceBean indexService; | |
| 42 | |
| 43 @EJB | |
| 44 DatasetServiceBean datasetService; | |
| 45 | |
| 46 @EJB | |
| 47 DataverseLinkingServiceBean dataverseLinkingService; | |
| 48 | |
| 49 @EJB | |
| 50 DatasetLinkingServiceBean datasetLinkingService; | |
| 51 | |
| 52 @Inject | |
| 53 DataverseSession session; | |
| 54 | |
| 55 @PersistenceContext(unitName = "VDCNet-ejbPU") | |
| 56 private EntityManager em; | |
| 57 | |
| 58 public Dataverse save(Dataverse dataverse) { | |
| 59 | |
| 60 dataverse.setModificationTime(new Timestamp(new Date().getTime())); | |
| 61 Dataverse savedDataverse = em.merge(dataverse); | |
| 62 /** | |
| 63 * @todo check the result to see if indexing was successful or not | |
| 64 */ | |
| 65 Future<String> indexingResult = indexService.indexDataverse(savedDataverse); | |
| 66 // logger.log(Level.INFO, "during dataverse save, indexing result was: {0}", indexingResult); | |
| 67 return savedDataverse; | |
| 68 } | |
| 69 | |
| 70 public Dataverse find(Object pk) { | |
| 71 return (Dataverse) em.find(Dataverse.class, pk); | |
| 72 } | |
| 73 | |
| 74 public List<Dataverse> findAll() { | |
| 75 return em.createQuery("select object(o) from Dataverse as o order by o.name").getResultList(); | |
| 76 } | |
| 77 | |
| 78 /** | |
| 79 * @param numPartitions The number of partitions you intend to split the | |
| 80 * indexing job into. Perhaps you have three Glassfish servers and you'd | |
| 81 * like each one to operate on a subset of dataverses. | |
| 82 * | |
| 83 * @param partitionId Maybe "partitionId" is the wrong term but it's what we | |
| 84 * call in the (text) UI. If you've specified three partitions the three | |
| 85 * partitionIds are 0, 1, and 2. We do `dataverseId % numPartitions = | |
| 86 * partitionId` to figure out which partition the dataverseId falls into. | |
| 87 * | |
| 88 * @param skipIndexed If true, will skip any dvObjects that have a indexTime set | |
| 89 * | |
| 90 * @return All dataverses if you say numPartitions=1 and partitionId=0. | |
| 91 * Otherwise, a subset of dataverses. | |
| 92 */ | |
| 93 public List<Dataverse> findAllOrSubset(long numPartitions, long partitionId, boolean skipIndexed) { | |
| 94 if (numPartitions < 1) { | |
| 95 long saneNumPartitions = 1; | |
| 96 numPartitions = saneNumPartitions; | |
| 97 } | |
| 98 String skipClause = skipIndexed ? "AND o.indexTime is null " : ""; | |
| 99 TypedQuery<Dataverse> typedQuery = em.createQuery("SELECT OBJECT(o) FROM Dataverse AS o WHERE MOD( o.id, :numPartitions) = :partitionId " + | |
| 100 skipClause + | |
| 101 "ORDER BY o.id", Dataverse.class); | |
| 102 typedQuery.setParameter("numPartitions", numPartitions); | |
| 103 typedQuery.setParameter("partitionId", partitionId); | |
| 104 return typedQuery.getResultList(); | |
| 105 } | |
| 106 | |
| 107 public List<Dataverse> findByOwnerId(Long ownerId) { | |
| 108 Query query = em.createQuery("select object(o) from Dataverse as o where o.owner.id =:ownerId order by o.name"); | |
| 109 query.setParameter("ownerId", ownerId); | |
| 110 return query.getResultList(); | |
| 111 } | |
| 112 | |
| 113 public List<Dataverse> findPublishedByOwnerId(Long ownerId) { | |
| 114 Query query = em.createQuery("select object(o) from Dataverse as o where o.owner.id =:ownerId and o.publicationDate is not null order by o.name"); | |
| 115 query.setParameter("ownerId", ownerId); | |
| 116 return query.getResultList(); | |
| 117 } | |
| 118 | |
| 119 /** | |
| 120 * @todo Do we really want this method to sometimes throw a | |
| 121 * NoResultException which is a RuntimeException? | |
| 122 */ | |
| 123 public Dataverse findRootDataverse() { | |
| 124 return (Dataverse) em.createQuery("select object(o) from Dataverse as o where o.owner.id = null").getSingleResult(); | |
| 125 } | |
| 126 | |
| 127 public List<Dataverse> findAllPublishedByOwnerId(Long ownerId) { | |
| 128 List<Dataverse> retVal = new ArrayList(); | |
| 129 List<Dataverse> previousLevel = findPublishedByOwnerId(ownerId); | |
| 130 | |
| 131 retVal.addAll(previousLevel); | |
| 132 /* | |
| 133 if (!previousLevel.isEmpty()) { | |
| 134 for (Dataverse dv : previousLevel) { | |
| 135 retVal.addAll(findPublishedByOwnerId(dv.getId())); | |
| 136 } | |
| 137 }*/ | |
| 138 return retVal; | |
| 139 } | |
| 140 | |
| 141 public Dataverse findByAlias(String anAlias) { | |
| 142 try { | |
| 143 return (anAlias.toLowerCase().equals(":root")) | |
| 144 ? findRootDataverse() | |
| 145 : em.createQuery("select d from Dataverse d WHERE lower(d.alias)=:alias", Dataverse.class) | |
| 146 .setParameter("alias", anAlias.toLowerCase()) | |
| 147 .getSingleResult(); | |
| 148 } catch ( NoResultException|NonUniqueResultException ex ) { | |
| 149 return null; | |
| 150 } | |
| 151 } | |
| 152 | |
| 153 public boolean hasData( Dataverse dv ) { | |
| 154 TypedQuery<Long> amountQry = em.createNamedQuery("Dataverse.ownedObjectsById", Long.class) | |
| 155 .setParameter("id", dv.getId()); | |
| 156 | |
| 157 return (amountQry.getSingleResult()>0); | |
| 158 } | |
| 159 | |
| 160 public boolean isRootDataverseExists() { | |
| 161 long count = em.createQuery("SELECT count(dv) FROM Dataverse dv WHERE dv.owner.id=null", Long.class).getSingleResult(); | |
| 162 return (count == 1); | |
| 163 } | |
| 164 | |
| 165 public String determineDataversePath(Dataverse dataverse) { | |
| 166 List<String> dataversePathSegments = new ArrayList(); | |
| 167 indexService.findPathSegments(dataverse, dataversePathSegments); | |
| 168 StringBuilder dataversePath = new StringBuilder(); | |
| 169 for (String segment : dataversePathSegments) { | |
| 170 dataversePath.append("/").append(segment); | |
| 171 } | |
| 172 return dataversePath.toString(); | |
| 173 } | |
| 174 | |
| 175 public MetadataBlock findMDB(Long id) { | |
| 176 return (MetadataBlock) em.find(MetadataBlock.class, id); | |
| 177 } | |
| 178 | |
| 179 public MetadataBlock findMDBByName(String name) { | |
| 180 return em.createQuery("select m from MetadataBlock m WHERE m.name=:name", MetadataBlock.class) | |
| 181 .setParameter("name", name) | |
| 182 .getSingleResult(); | |
| 183 } | |
| 184 | |
| 185 public List<MetadataBlock> findAllMetadataBlocks() { | |
| 186 return em.createQuery("select object(o) from MetadataBlock as o order by o.id").getResultList(); | |
| 187 } | |
| 188 | |
| 189 public List<MetadataBlock> findSystemMetadataBlocks(){ | |
| 190 return em.createQuery("select object(o) from MetadataBlock as o where o.owner.id=null order by o.id").getResultList(); | |
| 191 } | |
| 192 | |
| 193 public List<MetadataBlock> findMetadataBlocksByDataverseId(Long dataverse_id) { | |
| 194 return em.createQuery("select object(o) from MetadataBlock as o where o.owner.id=:dataverse_id order by o.id") | |
| 195 .setParameter("dataverse_id", dataverse_id).getResultList(); | |
| 196 } | |
| 197 | |
| 198 public DataverseFacet findFacet(Long id) { | |
| 199 return (DataverseFacet) em.find(DataverseFacet.class, id); | |
| 200 } | |
| 201 | |
| 202 public List<DataverseFacet> findAllDataverseFacets() { | |
| 203 return em.createQuery("select object(o) from DataverseFacet as o order by o.display").getResultList(); | |
| 204 } | |
| 205 | |
| 206 private String appVersionString; | |
| 207 | |
| 208 /** | |
| 209 * @todo Move this method to SystemConfig.java and reconcile with the | |
| 210 * getVersion method you find there. | |
| 211 */ | |
| 212 public String getApplicationVersion() { | |
| 213 if (appVersionString == null) { | |
| 214 | |
| 215 try { | |
| 216 appVersionString = ResourceBundle.getBundle("VersionNumber").getString("version.number"); | |
| 217 } catch (MissingResourceException ex) { | |
| 218 appVersionString = "4.0"; | |
| 219 } | |
| 220 | |
| 221 String buildNumber; | |
| 222 | |
| 223 try { | |
| 224 buildNumber = ResourceBundle.getBundle("BuildNumber").getString("build.number"); | |
| 225 } catch (MissingResourceException ex) { | |
| 226 buildNumber = null; | |
| 227 } | |
| 228 | |
| 229 if (buildNumber != null && !buildNumber.equals("")) { | |
| 230 appVersionString = appVersionString + " build " + buildNumber; | |
| 231 } | |
| 232 } | |
| 233 | |
| 234 return appVersionString; | |
| 235 } | |
| 236 | |
| 237 public boolean isDataverseCardImageAvailable(Dataverse dataverse, User user) { | |
| 238 if (dataverse == null) { | |
| 239 return false; | |
| 240 } | |
| 241 | |
| 242 String imageThumbFileName = null; | |
| 243 | |
| 244 // First, check if the dataverse has a defined logo: | |
| 245 | |
| 246 if (dataverse.getDataverseTheme() != null && dataverse.getDataverseTheme().getLogo() != null && !dataverse.getDataverseTheme().getLogo().equals("")) { | |
| 247 File dataverseLogoFile = getLogo(dataverse); | |
| 248 if (dataverseLogoFile != null) { | |
| 249 String logoThumbNailPath = null; | |
| 250 | |
| 251 if (dataverseLogoFile.exists()) { | |
| 252 logoThumbNailPath = ImageThumbConverter.generateImageThumb(dataverseLogoFile.getAbsolutePath(), 48); | |
| 253 if (logoThumbNailPath != null) { | |
| 254 return true; | |
| 255 } | |
| 256 } | |
| 257 } | |
| 258 } | |
| 259 | |
| 260 // If there's no uploaded logo for this dataverse, go through its | |
| 261 // [released] datasets and see if any of them have card images: | |
| 262 // | |
| 263 // TODO: | |
| 264 // Discuss/Decide if we really want to do this - i.e., go through every | |
| 265 // file in every dataset below... | |
| 266 // -- L.A. 4.0 beta14 | |
| 267 | |
| 268 for (Dataset dataset : datasetService.findPublishedByOwnerId(dataverse.getId())) { | |
| 269 if (dataset != null) { | |
| 270 DatasetVersion releasedVersion = dataset.getReleasedVersion(); | |
| 271 | |
| 272 if (releasedVersion != null) { | |
| 273 if (datasetService.isDatasetCardImageAvailable(releasedVersion, user)) { | |
| 274 return true; | |
| 275 } | |
| 276 } | |
| 277 } | |
| 278 } | |
| 279 | |
| 280 return false; | |
| 281 } | |
| 282 | |
| 283 private File getLogo(Dataverse dataverse) { | |
| 284 if (dataverse.getId() == null) { | |
| 285 return null; | |
| 286 } | |
| 287 | |
| 288 DataverseTheme theme = dataverse.getDataverseTheme(); | |
| 289 if (theme != null && theme.getLogo() != null && !theme.getLogo().equals("")) { | |
| 290 Properties p = System.getProperties(); | |
| 291 String domainRoot = p.getProperty("com.sun.aas.instanceRoot"); | |
| 292 | |
| 293 if (domainRoot != null && !"".equals(domainRoot)) { | |
| 294 return new File (domainRoot + File.separator + | |
| 295 "docroot" + File.separator + | |
| 296 "logos" + File.separator + | |
| 297 dataverse.getLogoOwnerId() + File.separator + | |
| 298 theme.getLogo()); | |
| 299 } | |
| 300 } | |
| 301 | |
| 302 return null; | |
| 303 } | |
| 304 | |
| 305 public List<Dataverse> findDataversesThisIdHasLinkedTo(long dataverseId) { | |
| 306 return dataverseLinkingService.findLinkedDataverses(dataverseId); | |
| 307 } | |
| 308 | |
| 309 public List<Dataverse> findDataversesThatLinkToThisDvId(long dataverseId) { | |
| 310 return dataverseLinkingService.findLinkingDataverses(dataverseId); | |
| 311 } | |
| 312 | |
| 313 public List<Dataset> findDatasetsThisIdHasLinkedTo(long dataverseId) { | |
| 314 return datasetLinkingService.findDatasetsThisDataverseIdHasLinkedTo(dataverseId); | |
| 315 } | |
| 316 | |
| 317 public List<Dataverse> findDataversesThatLinkToThisDatasetId(long datasetId) { | |
| 318 return datasetLinkingService.findLinkingDataverses(datasetId); | |
| 319 } | |
| 320 | |
| 321 } |
