Mercurial > hg > LGDataverses
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 } |
