duration = System.currentTimeMillis() - lastTime.getTime();
} else {
duration = currentTime.getTime() - lastTime.getTime();
}
DB db = DBFactory.getInstanceForClosing();
if (db!=null && db.isError()) {
// then we would run into an ERROR when we'd do more with this DB
// hence we just issue a log.info here with the details
//@TODO: lower to log_.info once we checked that it doesn't occur very often (best for 6.4)
log_.warn("log: DB is in Error state therefore the UserActivityLoggerImpl cannot update the simpleDuration of log_id "+lastLogObj.getKey()+" with value "+duration+", loggingObject: "+lastLogObj);
} else {
DBQuery update = DBFactory.getInstance().createQuery(
"update org.olat.core.logging.activity.LoggingObject set simpleDuration = :duration where log_id = :logid");
update.setLong("duration", duration);
update.setLong("logid", lastLogObj.getKey());
// we have to do FlushMode.AUTO (which is the default anyway)
update.executeUpdate(FlushMode.AUTO);
}
}
// store the current logging object in the session - for duration calculation at next log
session_.putEntry(USESS_KEY_USER_ACTIVITY_LOGGING_LAST_LOG, logObj);
if (resourceInfos!=null && resourceInfos.size()!=0) {
// this should be the normal case - we do have LoggingResourceables which we can log
// alongside the log message
// check if we have more than 4 - if we do, issue a log and remove the middle ones
if (resourceInfos.size()>4) {
log_.warn("More than 4 resource infos set on a user activity log. Can only have 4. Having: "+resourceInfos.size());
int diff = resourceInfos.size()-4;
for(int i=0; i<diff; i++) {
resourceInfos.remove(3);
}
}
// get the target resourceable
ILoggingResourceable ri = resourceInfos.get(resourceInfos.size()-1);
logObj.setTargetResourceInfo(ri);
// now set parent - if applicable
if (resourceInfos.size()>1) {
ri = resourceInfos.get(resourceInfos.size()-2);
logObj.setParentResourceInfo(ri);
}
// and set the grand parent - if applicable
if (resourceInfos.size()>2) {
ri = resourceInfos.get(resourceInfos.size()-3);
logObj.setGrandParentResourceInfo(ri);
}
// and set the great grand parent - if applicable
if (resourceInfos.size()>3) {
ri = resourceInfos.get(resourceInfos.size()-4);
logObj.setGreatGrandParentResourceInfo(ri);
}
}
// fill the remaining fields
logObj.setBusinessPath(businessPath_);
logObj.setSourceClass(callingClass.getCanonicalName());
logObj.setSimpleDuration(-1);
logObj.setResourceAdminAction(actionType.equals(ActionType.admin)?true:false);
Locale locale = I18nManager.getInstance().getLocaleOrDefault(identity.getUser().getPreferences().getLanguage());
//prepate the user properties, set them at once
List<String> tmpUserProperties = new ArrayList<String>(12);
for(Iterator<String> iterator = userProperties_.iterator(); iterator.hasNext();) {
tmpUserProperties.add(identity.getUser().getPropertyOrIdentityEnvAttribute(iterator.next(), locale));
}
logObj.setUserProperties(tmpUserProperties);
// and store it
DB db = DBFactory.getInstanceForClosing();
if (db!=null && db.isError()) {
// then we would run into an ERROR when we'd do more with this DB
// hence we just issue a log.info here with the details
//@TODO: lower to log_.info once we checked that it doesn't occur very often (best for 6.4)
log_.warn("log: DB is in Error state therefore the UserActivityLoggerImpl cannot store the following logging action into the loggingtable: "+logObj);
} else {