comparison src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngine.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 package edu.harvard.iq.dataverse;
2
3 import edu.harvard.iq.dataverse.actionlogging.ActionLogRecord;
4 import edu.harvard.iq.dataverse.actionlogging.ActionLogServiceBean;
5 import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
6 import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean;
7 import edu.harvard.iq.dataverse.engine.DataverseEngine;
8 import edu.harvard.iq.dataverse.authorization.Permission;
9 import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroupServiceBean;
10 import edu.harvard.iq.dataverse.authorization.users.User;
11 import edu.harvard.iq.dataverse.engine.command.Command;
12 import edu.harvard.iq.dataverse.engine.command.CommandContext;
13 import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
14 import edu.harvard.iq.dataverse.engine.command.exception.PermissionException;
15 import java.util.Map;
16 import java.util.Set;
17 import javax.ejb.EJB;
18 import javax.ejb.Stateless;
19 import javax.inject.Named;
20
21 import edu.harvard.iq.dataverse.search.SolrIndexServiceBean;
22 import edu.harvard.iq.dataverse.search.savedsearch.SavedSearchServiceBean;
23 import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
24 import java.util.EnumSet;
25 import java.util.logging.Level;
26 import java.util.logging.Logger;
27 import javax.ejb.EJBException;
28 import javax.ejb.TransactionAttribute;
29 import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
30 import javax.persistence.EntityManager;
31 import javax.persistence.PersistenceContext;
32 import javax.validation.ConstraintViolation;
33 import javax.validation.ConstraintViolationException;
34
35 /**
36 * An EJB capable of executing {@link Command}s in a JEE environment.
37 *
38 * @author michael
39 */
40 @Stateless
41 @Named
42 public class EjbDataverseEngine {
43 private static final Logger logger = Logger.getLogger(EjbDataverseEngine.class.getCanonicalName());
44
45 @EJB
46 DatasetServiceBean datasetService;
47
48 @EJB
49 DataverseServiceBean dataverseService;
50
51 @EJB
52 DataverseRoleServiceBean roleService;
53
54 @EJB
55 DataverseRoleServiceBean rolesService;
56
57 @EJB
58 BuiltinUserServiceBean usersService;
59
60 @EJB
61 IndexServiceBean indexService;
62
63 @EJB
64 SolrIndexServiceBean solrIndexService;
65
66 @EJB
67 SearchServiceBean searchService;
68
69 @EJB
70 PermissionServiceBean permissionService;
71
72 @EJB
73 DvObjectServiceBean dvObjectService;
74
75 @EJB
76 DataverseFacetServiceBean dataverseFacetService;
77
78 @EJB
79 FeaturedDataverseServiceBean featuredDataverseService;
80
81 @EJB
82 DataFileServiceBean dataFileService;
83
84 @EJB
85 TemplateServiceBean templateService;
86
87 @EJB
88 SavedSearchServiceBean savedSearchService;
89
90 @EJB
91 DataverseFieldTypeInputLevelServiceBean fieldTypeInputLevels;
92
93 @EJB
94 DOIEZIdServiceBean doiEZId;
95
96 @EJB
97 HandlenetServiceBean handleNet;
98
99 @EJB
100 SettingsServiceBean settings;
101
102 @EJB
103 GuestbookServiceBean guestbookService;
104
105 @EJB
106 GuestbookResponseServiceBean responses;
107
108 @EJB
109 DataverseLinkingServiceBean dvLinking;
110
111 @EJB
112 DatasetLinkingServiceBean dsLinking;
113
114 @EJB
115 ExplicitGroupServiceBean explicitGroups;
116
117 @EJB
118 RoleAssigneeServiceBean roleAssignees;
119
120 @EJB
121 UserNotificationServiceBean userNotificationService;
122
123 @EJB
124 AuthenticationServiceBean authentication;
125
126 @PersistenceContext(unitName = "VDCNet-ejbPU")
127 private EntityManager em;
128
129 @EJB
130 ActionLogServiceBean logSvc;
131
132 private CommandContext ctxt;
133
134 @TransactionAttribute(REQUIRES_NEW)
135 public <R> R submitInNewTransaction(Command<R> aCommand) throws CommandException {
136 return submit(aCommand);
137 }
138
139 public <R> R submit(Command<R> aCommand) throws CommandException {
140
141 final ActionLogRecord logRec = new ActionLogRecord(ActionLogRecord.ActionType.Command, aCommand.getClass().getCanonicalName());
142
143 try {
144 logRec.setUserIdentifier( aCommand.getUser().getIdentifier() );
145
146 // Check permissions - or throw an exception
147 Map<String, ? extends Set<Permission>> requiredMap = aCommand.getRequiredPermissions();
148 if (requiredMap == null) {
149 throw new RuntimeException("Command " + aCommand + " does not define required permissions.");
150 }
151
152 User user = aCommand.getUser();
153
154 Map<String, DvObject> affectedDvObjects = aCommand.getAffectedDvObjects();
155 logRec.setInfo( describe(affectedDvObjects) );
156 for (Map.Entry<String, ? extends Set<Permission>> pair : requiredMap.entrySet()) {
157 String dvName = pair.getKey();
158 if (!affectedDvObjects.containsKey(dvName)) {
159 throw new RuntimeException("Command instance " + aCommand + " does not have a DvObject named '" + dvName + "'");
160 }
161 DvObject dvo = affectedDvObjects.get(dvName);
162
163 Set<Permission> granted = (dvo != null) ? permissionService.permissionsFor(user, dvo)
164 : EnumSet.allOf(Permission.class);
165 Set<Permission> required = requiredMap.get(dvName);
166 if (!granted.containsAll(required)) {
167 required.removeAll(granted);
168 logRec.setActionResult(ActionLogRecord.Result.PermissionError);
169 throw new PermissionException("Can't execute command " + aCommand
170 + ", because user " + aCommand.getUser()
171 + " is missing permissions " + required
172 + " on Object " + dvo.accept(DvObject.NamePrinter),
173 aCommand,
174 required, dvo);
175 }
176 }
177 try {
178 return aCommand.execute(getContext());
179
180 } catch ( EJBException ejbe ) {
181 logRec.setActionResult(ActionLogRecord.Result.InternalError);
182 throw new CommandException("Command " + aCommand.toString() + " failed: " + ejbe.getMessage(), ejbe.getCausedByException(), aCommand);
183 }
184
185 } catch ( RuntimeException re ) {
186 logRec.setActionResult(ActionLogRecord.Result.InternalError);
187 logRec.setInfo( re.getMessage() );
188
189 Throwable cause = re;
190 while (cause != null) {
191 if (cause instanceof ConstraintViolationException) {
192 StringBuilder sb = new StringBuilder();
193 sb.append("Unexpected bean validation constraint exception:");
194 ConstraintViolationException constraintViolationException = (ConstraintViolationException) cause;
195 for (ConstraintViolation<?> violation : constraintViolationException.getConstraintViolations()) {
196 sb.append(" Invalid value: <<<").append(violation.getInvalidValue()).append(">>> for ").append(violation.getPropertyPath()).append(" at ").append(violation.getLeafBean()).append(" - ").append(violation.getMessage());
197 }
198 logger.log(Level.SEVERE, sb.toString());
199 // set this more detailed info in action log
200 logRec.setInfo( sb.toString() );
201 }
202 cause = cause.getCause();
203 }
204
205 throw re;
206
207 } finally {
208 if ( logRec.getActionResult() == null ) {
209 logRec.setActionResult( ActionLogRecord.Result.OK );
210 }
211 logRec.setEndTime( new java.util.Date() );
212 logSvc.log(logRec);
213 }
214 }
215
216 public CommandContext getContext() {
217 if (ctxt == null) {
218 ctxt = new CommandContext() {
219
220 @Override
221 public DatasetServiceBean datasets() {
222 return datasetService;
223 }
224
225 @Override
226 public DataverseServiceBean dataverses() {
227 return dataverseService;
228 }
229
230 @Override
231 public DataverseRoleServiceBean roles() {
232 return rolesService;
233 }
234
235 @Override
236 public BuiltinUserServiceBean builtinUsers() {
237 return usersService;
238 }
239
240 @Override
241 public IndexServiceBean index() {
242 return indexService;
243 }
244
245 @Override
246 public SolrIndexServiceBean solrIndex() {
247 return solrIndexService;
248 }
249
250 @Override
251 public SearchServiceBean search() {
252 return searchService;
253 }
254
255 @Override
256 public PermissionServiceBean permissions() {
257 return permissionService;
258 }
259
260 @Override
261 public DvObjectServiceBean dvObjects() {
262 return dvObjectService;
263 }
264
265 @Override
266 public DataFileServiceBean files() {
267 return dataFileService;
268 }
269
270 @Override
271 public EntityManager em() {
272 return em;
273 }
274
275 @Override
276 public DataverseFacetServiceBean facets() {
277 return dataverseFacetService;
278 }
279
280 @Override
281 public FeaturedDataverseServiceBean featuredDataverses() {
282 return featuredDataverseService;
283 }
284
285 @Override
286 public TemplateServiceBean templates() {
287 return templateService;
288 }
289
290 @Override
291 public SavedSearchServiceBean savedSearches() {
292 return savedSearchService;
293 }
294
295 @Override
296 public DataverseFieldTypeInputLevelServiceBean fieldTypeInputLevels() {
297 return fieldTypeInputLevels;
298 }
299
300 @Override
301 public DOIEZIdServiceBean doiEZId() {
302 return doiEZId;
303 }
304
305 @Override
306 public HandlenetServiceBean handleNet() {
307 return handleNet;
308 }
309
310 @Override
311 public SettingsServiceBean settings() {
312 return settings;
313 }
314
315 @Override
316 public GuestbookServiceBean guestbooks() {
317 return guestbookService;
318 }
319
320 @Override
321 public GuestbookResponseServiceBean responses() {
322 return responses;
323 }
324
325 @Override
326 public DataverseLinkingServiceBean dvLinking() {
327 return dvLinking;
328 }
329
330 @Override
331 public DatasetLinkingServiceBean dsLinking() {
332 return dsLinking;
333 }
334 @Override
335 public DataverseEngine engine() {
336 return new DataverseEngine() {
337 @Override
338 public <R> R submit(Command<R> aCommand) throws CommandException {
339 return EjbDataverseEngine.this.submit(aCommand);
340 }
341 };
342 }
343
344 @Override
345 public ExplicitGroupServiceBean explicitGroups() {
346 return explicitGroups;
347 }
348
349 @Override
350 public RoleAssigneeServiceBean roleAssignees() {
351 return roleAssignees;
352 }
353
354 @Override
355 public UserNotificationServiceBean notifications() {
356 return userNotificationService;
357 }
358
359 @Override
360 public AuthenticationServiceBean authentication() {
361 return authentication;
362 }
363
364 };
365 }
366
367 return ctxt;
368 }
369
370
371 private String describe( Map<String, DvObject> dvObjMap ) {
372 StringBuilder sb = new StringBuilder();
373 for ( Map.Entry<String, DvObject> ent : dvObjMap.entrySet() ) {
374 DvObject value = ent.getValue();
375 sb.append(ent.getKey()).append(":");
376 sb.append( (value!=null) ? value.accept(DvObject.NameIdPrinter) : "<null>");
377 sb.append(" ");
378 }
379 return sb.toString();
380 }
381 }