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 }