diff --git a/src/main/java/org/olat/admin/user/imp/TransientIdentity.java b/src/main/java/org/olat/admin/user/imp/TransientIdentity.java index f359b30bd7cee95d2e57fc8af1433922140bd46e..fc76b74f707b4d373450edf6c16b986ea3a3c3ed 100644 --- a/src/main/java/org/olat/admin/user/imp/TransientIdentity.java +++ b/src/main/java/org/olat/admin/user/imp/TransientIdentity.java @@ -65,7 +65,6 @@ public class TransientIdentity implements Identity, User { return login; } - @Override public void setName(String name) { this.login = name; } @@ -96,23 +95,11 @@ public class TransientIdentity implements Identity, User { return null; } - @Override - public void setLastLogin(Date loginDate) { - // - } - @Override public Integer getStatus() { return null; } - @Override - public void setStatus(Integer newStatus) { - // - } - - - @Override public boolean equalsByPersistableKey(Persistable persistable) { return super.equals(persistable); diff --git a/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java b/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java index 37984c96d4fc7c9a433734ceef8b762aa1ea2407..412f229b8d2a5dcf5c8addd632614e2b390fe951 100644 --- a/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java +++ b/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java @@ -102,11 +102,6 @@ public class UpdateIdentity implements Identity { return identity.getExternalId(); } - @Override - public void setName(String name) { - // - } - @Override public User getUser() { return userWrapper; @@ -117,20 +112,10 @@ public class UpdateIdentity implements Identity { return identity.getLastLogin(); } - @Override - public void setLastLogin(Date loginDate) { - // - } - @Override public Integer getStatus() { return identity.getStatus(); } - - @Override - public void setStatus(Integer newStatus) { - // - } @Override public int hashCode() { diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java index becb891ca12d6a9d8067db3d9a5ca25044cf2763..a1a4ebdc32e7fbfb906f64aff4232a89e2badb61 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java @@ -1023,7 +1023,7 @@ public class BaseSecurityManager implements BaseSecurity { return Collections.emptyList(); } StringBuilder sb = new StringBuilder(); - sb.append("select ident from ").append(IdentityShort.class.getName()).append(" as ident where ident.name in (:names)"); + sb.append("select ident from bidentityshort as ident where ident.name in (:names)"); TypedQuery<IdentityShort> query = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), IdentityShort.class); @@ -1049,7 +1049,7 @@ public class BaseSecurityManager implements BaseSecurity { return Collections.emptyList(); } StringBuilder sb = new StringBuilder(); - sb.append("select ident from ").append(IdentityShort.class.getName()).append(" as ident where ident.key in (:keys)"); + sb.append("select ident from bidentityshort as ident where ident.key in (:keys)"); TypedQuery<IdentityShort> query = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), IdentityShort.class); @@ -1143,7 +1143,7 @@ public class BaseSecurityManager implements BaseSecurity { String[] attributes = new String[]{ "name", "firstName", "lastName", "email" }; StringBuilder sb = new StringBuilder(); - sb.append("select ident from ").append(IdentityShort.class.getName()).append(" as ident ") + sb.append("select ident from bidentityshort as ident ") .append(" where ident.status<").append(Identity.STATUS_VISIBLE_LIMIT).append(" and ("); boolean start = true; @@ -1181,12 +1181,8 @@ public class BaseSecurityManager implements BaseSecurity { @Override public IdentityShort loadIdentityShortByKey(Long identityKey) { - StringBuilder sb = new StringBuilder(); - sb.append("select identity from ").append(IdentityShort.class.getName()).append(" as identity ") - .append(" where identity.key=:identityKey"); - List<IdentityShort> idents = dbInstance.getCurrentEntityManager() - .createQuery(sb.toString(), IdentityShort.class) + .createNamedQuery("getIdentityShortById", IdentityShort.class) .setParameter("identityKey", identityKey) .getResultList(); if(idents.isEmpty()) { @@ -1201,7 +1197,7 @@ public class BaseSecurityManager implements BaseSecurity { return Collections.emptyList(); } StringBuilder sb = new StringBuilder(); - sb.append("select ident from ").append(IdentityShort.class.getName()).append(" as ident where ident.key in (:keys)"); + sb.append("select ident from bidentityshort as ident where ident.key in (:keys)"); return dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), IdentityShort.class) @@ -1900,7 +1896,7 @@ public class BaseSecurityManager implements BaseSecurity { */ @Override public Identity saveIdentityStatus(Identity identity, Integer status) { - Identity reloadedIdentity = loadForUpdate(identity); + IdentityImpl reloadedIdentity = loadForUpdate(identity); reloadedIdentity.setStatus(status); reloadedIdentity = dbInstance.getCurrentEntityManager().merge(reloadedIdentity); dbInstance.commit(); @@ -1909,7 +1905,7 @@ public class BaseSecurityManager implements BaseSecurity { @Override public Identity setIdentityLastLogin(Identity identity) { - Identity reloadedIdentity = loadForUpdate(identity); + IdentityImpl reloadedIdentity = loadForUpdate(identity); reloadedIdentity.setLastLogin(new Date()); reloadedIdentity = dbInstance.getCurrentEntityManager().merge(reloadedIdentity); dbInstance.commit(); @@ -1918,7 +1914,7 @@ public class BaseSecurityManager implements BaseSecurity { @Override public Identity saveIdentityName(Identity identity, String newName) { - Identity reloadedIdentity = loadForUpdate(identity); + IdentityImpl reloadedIdentity = loadForUpdate(identity); reloadedIdentity.setName(newName); reloadedIdentity = dbInstance.getCurrentEntityManager().merge(reloadedIdentity); dbInstance.commit(); diff --git a/src/main/java/org/olat/basesecurity/IdentityImpl.hbm.xml b/src/main/java/org/olat/basesecurity/IdentityImpl.hbm.xml index 91b997fc5d643891858ed2ff11ccdeccf6bca893..6dc24cf583fb4f1fc9b02d2a7040a32ca8c314e5 100644 --- a/src/main/java/org/olat/basesecurity/IdentityImpl.hbm.xml +++ b/src/main/java/org/olat/basesecurity/IdentityImpl.hbm.xml @@ -23,22 +23,5 @@ <many-to-one name="user" column="fk_user_id" class="org.olat.user.UserImpl" fetch="join" unique="true" cascade="none"/> </class> - - - <class name="org.olat.basesecurity.IdentityShort" table="o_bs_identity_short_v" mutable="false"> - <!-- the default columns --> - <id name="key" column="id_id" type="long" unsaved-value="null"> - <generator class="hilo"/> - </id> - - <property name="userKey" column="us_id" type="long" /> - <property name="lastLogin" column="id_lastlogin" type="timestamp" /> - <property name="name" column="id_name" type="string" /> - <property name="status" column="id_status" type="integer" /> - <property name="firstName" column="first_name" type="string" /> - <property name="lastName" column="last_name" type="string" /> - <property name="email" column="email" type="string" /> - - </class> </hibernate-mapping> \ No newline at end of file diff --git a/src/main/java/org/olat/basesecurity/IdentityImpl.java b/src/main/java/org/olat/basesecurity/IdentityImpl.java index 4abbad5c1952f6088cd8cd2000dc00e9a021838c..3017cb380725516560ea5a85062d81cf2eeb5a9e 100644 --- a/src/main/java/org/olat/basesecurity/IdentityImpl.java +++ b/src/main/java/org/olat/basesecurity/IdentityImpl.java @@ -105,7 +105,6 @@ public class IdentityImpl extends PersistentObject implements Identity, Identity * * @param name The name to set */ - @Override public void setName(String name) { if (name.length() > NAME_MAXLENGTH) throw new AssertException("field name of table o_bs_identity too long"); diff --git a/src/main/java/org/olat/basesecurity/IdentityShort.java b/src/main/java/org/olat/basesecurity/IdentityShort.java index b570a9722ad4d91c17c6241d219d689b8fe587c5..8836293f573d96c5c4a155a7726af99af5ab59f6 100644 --- a/src/main/java/org/olat/basesecurity/IdentityShort.java +++ b/src/main/java/org/olat/basesecurity/IdentityShort.java @@ -21,91 +21,95 @@ package org.olat.basesecurity; import java.util.Date; -import org.olat.core.commons.persistence.PersistentObject; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; +import org.olat.core.id.Persistable; /** * * Description:<br> - * TODO: srosse Class Description for IdentityShort + * This is an immutable version of identity with a limited set of fields. * * <P> * Initial Date: 14 juil. 2011 <br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ -//fxdiff: FXOLAT-219 decrease the load for synching groups -public class IdentityShort extends PersistentObject implements IdentityNames { +@Entity(name="bidentityshort") +@Table(name="o_bs_identity_short_v") +@NamedQueries({ + @NamedQuery(name="selectAllIdentitiesShortUnordered", query="select ident from bidentityshort as ident"), + @NamedQuery(name="getIdentityShortById", query="select identity from bidentityshort as identity where identity.key=:identityKey") + +}) +public class IdentityShort implements Persistable, IdentityNames { private static final long serialVersionUID = -9039644291427632379L; + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "hilo") + @Column(name="id_id", nullable=false, unique=true, insertable=true, updatable=false) + private Long key; + + @Column(name="us_id", nullable=true, unique=false, insertable=false, updatable=false) private Long userKey; - + + @Column(name="id_name", nullable=true, unique=false, insertable=false, updatable=false) private String name; + @Column(name="id_lastlogin", nullable=true, unique=false, insertable=false, updatable=false) private Date lastLogin; + @Column(name="id_status", nullable=true, unique=false, insertable=false, updatable=false) private int status; + @Column(name="first_name", nullable=true, unique=false, insertable=false, updatable=false) private String firstName; + @Column(name="last_name", nullable=true, unique=false, insertable=false, updatable=false) private String lastName; + @Column(name="email", nullable=true, unique=false, insertable=false, updatable=false) private String email; - public IdentityShort() { - // + @Override + public Long getKey() { + return key; } - + public Long getUserKey() { return userKey; } - public void setUserKey(Long userKey) { - this.userKey = userKey; - } - + @Override public String getName() { return name; } - public void setName(String name) { - this.name = name; - } - public Date getLastLogin() { return lastLogin; } - public void setLastLogin(Date lastLogin) { - this.lastLogin = lastLogin; - } - public int getStatus() { return status; } - public void setStatus(int status) { - this.status = status; - } - + @Override public String getFirstName() { return firstName; } - public void setFirstName(String firstName) { - this.firstName = firstName; - } - + @Override public String getLastName() { return lastName; } - public void setLastName(String lastName) { - this.lastName = lastName; - } - public String getEmail() { return email; } - public void setEmail(String email) { - this.email = email; - } - @Override public String toString() { return "IdentityShort[name=" + name + "], " + super.toString(); @@ -127,4 +131,9 @@ public class IdentityShort extends PersistentObject implements IdentityNames { } return false; } + + @Override + public boolean equalsByPersistableKey(Persistable persistable) { + return equals(persistable); + } } diff --git a/src/main/java/org/olat/core/id/Identity.java b/src/main/java/org/olat/core/id/Identity.java index 16bdc2245f378c0c69e4a4daf4ddbfea0feb1dd4..2736699b5841d6fc40ca59c32d646eb0bf339f1c 100644 --- a/src/main/java/org/olat/core/id/Identity.java +++ b/src/main/java/org/olat/core/id/Identity.java @@ -71,23 +71,10 @@ public interface Identity extends CreateInfo, IdentityRef, Persistable { * @return Last date when the user logged in. */ public Date getLastLogin(); - - /** - * Set a new last login date for the user. - * @param loginDate New last-login date. - */ - public void setLastLogin(Date loginDate); /** * @return Current identity status */ public Integer getStatus(); - - /** - * Set new status (aktiv,deleted,permanent) of identity. - * @param newStatus New status - */ - public void setStatus(Integer newStatus); - public void setName(String name); } \ No newline at end of file diff --git a/src/main/java/org/olat/core/util/mail/ui/EMailIdentity.java b/src/main/java/org/olat/core/util/mail/ui/EMailIdentity.java index 8963cadf3f8deac913613e3eead81bb10cc48e4c..09f8807a2570bb62da8b46f0cbbfafe0d049c0ea 100644 --- a/src/main/java/org/olat/core/util/mail/ui/EMailIdentity.java +++ b/src/main/java/org/olat/core/util/mail/ui/EMailIdentity.java @@ -79,24 +79,11 @@ class EMailIdentity implements Identity { return null; } - @Override - public void setLastLogin(Date loginDate) {/**/ - } - @Override public Integer getStatus() { return null; } - @Override - public void setStatus(Integer newStatus) {/**/ - } - - @Override - public void setName(String name) {/**/ - } - - private class EMailUser implements User, ModifiedInfo { private static final long serialVersionUID = 7260225880639460228L; @@ -109,14 +96,17 @@ class EMailIdentity implements Identity { data.put(UserConstants.EMAIL, email); } + @Override public Long getKey() { return null; } + @Override public boolean equalsByPersistableKey(Persistable persistable) { return this == persistable; } + @Override public Date getLastModified() { return null; } @@ -126,29 +116,36 @@ class EMailIdentity implements Identity { // } + @Override public Date getCreationDate() { return null; } + @Override public void setProperty(String propertyName, String propertyValue) { // } + @Override public void setPreferences(Preferences prefs) { // } + @Override public String getProperty(String propertyName, Locale locale) { return data.get(propertyName); } + @Override public void setIdentityEnvironmentAttributes(Map<String, String> identEnvAttribs) {/**/ } + @Override public String getPropertyOrIdentityEnvAttribute(String propertyName, Locale locale) { return data.get(propertyName); } + @Override public Preferences getPreferences() { return prefs; } diff --git a/src/main/java/org/olat/course/assessment/AssessmentToolManager.java b/src/main/java/org/olat/course/assessment/AssessmentToolManager.java index 1085706cf3b50a24deeb2ba5e6237eb8ea1d3ab0..dba89805c63f66484e81dc2b85eadb97491154bd 100644 --- a/src/main/java/org/olat/course/assessment/AssessmentToolManager.java +++ b/src/main/java/org/olat/course/assessment/AssessmentToolManager.java @@ -23,6 +23,7 @@ import java.util.List; import org.olat.basesecurity.IdentityShort; import org.olat.core.id.Identity; +import org.olat.course.assessment.model.AssessmentEntryRow; import org.olat.course.assessment.model.CourseStatistics; import org.olat.course.assessment.model.SearchAssessedIdentityParams; import org.olat.modules.assessment.AssessmentEntry; @@ -44,6 +45,8 @@ public interface AssessmentToolManager { public List<IdentityShort> getShortAssessedIdentities(Identity coach, SearchAssessedIdentityParams params, int maxResults); + public List<AssessmentEntryRow> getAssessmentEntryRows(Identity coach, SearchAssessedIdentityParams params, AssessmentEntryStatus status); + public List<AssessmentEntry> getAssessmentEntries(Identity coach, SearchAssessedIdentityParams params, AssessmentEntryStatus status); diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java index ee439ebb13f304053e7a2182b2f028f3b3f9f983..3597a283c119719c981bd1dcd93cd42182c90d78 100644 --- a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java +++ b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java @@ -19,6 +19,7 @@ */ package org.olat.course.assessment.manager; +import java.util.ArrayList; import java.util.List; import javax.persistence.TypedQuery; @@ -33,6 +34,8 @@ import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.course.assessment.AssessmentToolManager; +import org.olat.course.assessment.model.AssessedIdentity; +import org.olat.course.assessment.model.AssessmentEntryRow; import org.olat.course.assessment.model.CourseStatistics; import org.olat.course.assessment.model.SearchAssessedIdentityParams; import org.olat.course.assessment.model.UserCourseInfosImpl; @@ -58,6 +61,15 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager { @Autowired private DB dbInstance; + public List<AssessedIdentity> getIdentities() { + StringBuilder sf = new StringBuilder(); + sf.append("select ident from asidentity as ident"); + + return dbInstance.getCurrentEntityManager() + .createQuery(sf.toString(), AssessedIdentity.class) + .getResultList(); + } + @Override public CourseStatistics getStatistics(Identity coach, SearchAssessedIdentityParams params) { CourseStatistics entry = new CourseStatistics(); @@ -246,7 +258,7 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager { public List<IdentityShort> getShortAssessedIdentities(Identity coach, SearchAssessedIdentityParams params, int maxResults) { StringBuilder sb = new StringBuilder(); sb.append("select ident") - .append(" from ").append(IdentityShort.class.getName()).append(" as ident ") + .append(" from bidentityshort as ident ") .append(" where "); if(params.isAdmin()) { sb.append(" (ident.key in (select participant.identity.key from repoentrytogroup as rel, bgroupmember as participant") @@ -383,6 +395,90 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager { } } } + + @Override + public List<AssessmentEntryRow> getAssessmentEntryRows(Identity coach, SearchAssessedIdentityParams params, AssessmentEntryStatus status) { + StringBuilder sb = new StringBuilder(); + sb.append("select asident, aentry from asidentity asident"); + if(params.isFailed() || params.isPassed() || (params.getAssessmentStatus() != null && params.getAssessmentStatus().size() > 0)) { + sb.append(" inner join asident.assessmentEntries as aentry "); + } else { + sb.append(" left join asident.assessmentEntries as aentry "); + } + sb.append(" on ( aentry.repositoryEntry.key=:repoEntryKey"); + if(params.getReferenceEntry() != null) { + sb.append(" and aentry.referenceEntry.key=:referenceKey"); + } + if(params.getSubIdent() != null) { + sb.append(" and aentry.subIdent=:subIdent"); + } + sb.append(")"); + + sb.append(" where (asident.key in"); + if(params.isAdmin()) { + sb.append(" (select participant.identity.key from repoentrytogroup as rel, bgroupmember as participant") + .append(" where rel.entry.key=:repoEntryKey and rel.group=participant.group") + .append(" and participant.role='").append(GroupRoles.participant.name()).append("'") + .append(" )"); + if(params.isNonMembers()) { + sb.append(" or asident.key in (select aentry.identity.key from assessmententry aentryInvitee") + .append(" where aentryInvitee.repositoryEntry.key=:repoEntryKey") + .append(" and not exists (select membership.identity from repoentrytogroup as rel, bgroupmember as membership") + .append(" where rel.entry.key=:repoEntryKey and rel.group.key=membership.group.key and membership.identity.key=asident.key)") + .append(" )"); + } + } else if(params.isBusinessGroupCoach() || params.isRepositoryEntryCoach()) { + sb.append(" (select participant.identity.key from repoentrytogroup as rel, bgroupmember as participant, bgroupmember as coach") + .append(" where rel.entry.key=:repoEntryKey") + .append(" and rel.group=coach.group and coach.role='").append(GroupRoles.coach.name()).append("' and coach.identity.key=:identityKey") + .append(" and rel.group=participant.group and participant.role='").append(GroupRoles.participant.name()).append("'") + .append(" )"); + } + sb.append(" )"); + + if(params.isFailed()) { + sb.append(" aentry.passed=false"); + } + if(params.isPassed()) { + sb.append(" aentry.passed=true"); + } + if(params.getAssessmentStatus() != null && params.getAssessmentStatus().size() > 0) { + sb.append(" aentry.status in (:status)"); + } + + sb.append(" order by asident.name"); + + TypedQuery<Object[]> list = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Object[].class) + .setParameter("repoEntryKey", params.getEntry().getKey()); + if(params.getReferenceEntry() != null) { + list.setParameter("referenceKey", params.getReferenceEntry().getKey()); + } + if(params.getSubIdent() != null) { + list.setParameter("subIdent", params.getSubIdent()); + } + if(!params.isAdmin()) { + list.setParameter("identityKey", coach.getKey()); + } + + if(params.getAssessmentStatus() != null && params.getAssessmentStatus().size() > 0) { + List<String> statusList = new ArrayList<>(); + for(AssessmentEntryStatus assessmentStatus:params.getAssessmentStatus()) { + statusList.add(assessmentStatus.name()); + } + list.setParameter("status", statusList); + } + + List<Object[]> objects = list.getResultList(); + List<AssessmentEntryRow> rows = new ArrayList<>(); + for(Object[] object:objects) { + Identity identity = (Identity)object[0]; + AssessmentEntry entry = (AssessmentEntry)object[1]; + rows.add(new AssessmentEntryRow(identity, entry)); + } + + return rows; + } @Override public List<AssessmentEntry> getAssessmentEntries(Identity coach, SearchAssessedIdentityParams params, AssessmentEntryStatus status) { diff --git a/src/main/java/org/olat/course/assessment/model/AssessedIdentity.java b/src/main/java/org/olat/course/assessment/model/AssessedIdentity.java new file mode 100644 index 0000000000000000000000000000000000000000..90c36302a0682bcb6fd8a41f9481fb933e79b452 --- /dev/null +++ b/src/main/java/org/olat/course/assessment/model/AssessedIdentity.java @@ -0,0 +1,143 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.assessment.model; + +import java.util.Date; +import java.util.Set; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.hibernate.annotations.GenericGenerator; +import org.olat.core.id.Identity; +import org.olat.core.id.Persistable; +import org.olat.core.id.User; +import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.model.AssessmentEntryImpl; +import org.olat.user.UserImpl; + +/** + * The instance is immutable + * + * Initial date: 01.12.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Entity(name="asidentity") +@Table(name="o_bs_identity") +public class AssessedIdentity implements Persistable, Identity { + + private static final long serialVersionUID = 5437094042277941568L; + + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "hilo") + @Column(name="id", nullable=false, unique=true, insertable=true, updatable=false) + private Long key; + @Temporal(TemporalType.TIMESTAMP) + @Column(name="creationdate", nullable=false, insertable=false, updatable=false) + protected Date creationDate; + + @Column(name="name", nullable=false, unique=false, insertable=false, updatable=false) + private String name; + @Column(name="lastlogin", nullable=false, unique=false, insertable=false, updatable=false) + private Date lastLogin; + @Column(name="external_id", nullable=false, unique=false, insertable=false, updatable=false) + private String externalId; + @Column(name="status", nullable=false, unique=false, insertable=false, updatable=false) + private Integer status; + + @ManyToOne(targetEntity=UserImpl.class,fetch=FetchType.LAZY, optional=false) + @JoinColumn(name="fk_user_id", nullable=false, insertable=false, updatable=false) + private User user; + + @OneToMany(targetEntity=AssessmentEntryImpl.class, mappedBy="identity") + private Set<AssessmentEntry> assessmentEntries; + + @Override + public Long getKey() { + return key; + } + + @Override + public Date getCreationDate() { + return creationDate; + } + + @Override + public String getName() { + return name; + } + + @Override + public Date getLastLogin() { + return lastLogin; + } + + @Override + public Integer getStatus() { + return status; + } + + @Override + public String getExternalId() { + return externalId; + } + + @Override + public User getUser() { + return user; + } + + public Set<AssessmentEntry> getAssessmentEntries() { + return assessmentEntries; + } + + @Override + public int hashCode() { + return getKey() == null ? 34801 : getKey().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(this == obj) { + return true; + } + if(obj instanceof AssessedIdentity) { + AssessedIdentity id = (AssessedIdentity)obj; + return getKey() != null && getKey().equals(id.getKey()); + } + return false; + } + + @Override + public boolean equalsByPersistableKey(Persistable persistable) { + return equals(persistable); + } +} diff --git a/src/main/java/org/olat/course/assessment/model/AssessmentEntryRow.java b/src/main/java/org/olat/course/assessment/model/AssessmentEntryRow.java new file mode 100644 index 0000000000000000000000000000000000000000..46f2c2c2fe282866995e46e21875dc8d6466b7d7 --- /dev/null +++ b/src/main/java/org/olat/course/assessment/model/AssessmentEntryRow.java @@ -0,0 +1,48 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.assessment.model; + +import org.olat.core.id.Identity; +import org.olat.modules.assessment.AssessmentEntry; + +/** + * + * Initial date: 01.12.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class AssessmentEntryRow { + + private final Identity identity; + private final AssessmentEntry entry; + + public AssessmentEntryRow(Identity identity, AssessmentEntry entry) { + this.identity = identity; + this.entry = entry; + } + + public Identity getIdentity() { + return identity; + } + + public AssessmentEntry getEntry() { + return entry; + } +} diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java index 5525792df03eb3176ea09a31c4ba6de7e3528912..f34d548e23ba26630a076b60e87cdd12c9432b8b 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java @@ -20,9 +20,7 @@ package org.olat.course.assessment.ui.tool; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityModule; @@ -57,6 +55,7 @@ import org.olat.course.ICourse; import org.olat.course.assessment.AssessmentMainController; import org.olat.course.assessment.AssessmentToolManager; import org.olat.course.assessment.bulk.PassedCellRenderer; +import org.olat.course.assessment.model.AssessmentEntryRow; import org.olat.course.assessment.model.SearchAssessedIdentityParams; import org.olat.course.assessment.ui.tool.AssessmentIdentitiesCourseNodeTableModel.IdentityCourseElementCols; import org.olat.course.nodes.AssessableCourseNode; @@ -236,19 +235,16 @@ public class AssessmentIdentitiesCourseNodeController extends FormBasicControlle } params.setBusinessGroupKeys(businessGroupKeys); params.setSearchString(searchString); - - List<Identity> assessedIdentities = assessmentToolManager.getAssessedIdentities(getIdentity(), params); - List<AssessmentEntry> assessmentEntries = assessmentToolManager.getAssessmentEntries(getIdentity(), params, null); - Map<Long,AssessmentEntry> entryMap = new HashMap<>(); - assessmentEntries.forEach((entry) -> entryMap.put(entry.getIdentity().getKey(), entry)); - List<AssessedIdentityCourseElementRow> rows = new ArrayList<>(assessedIdentities.size()); - for(Identity assessedIdentity:assessedIdentities) { - AssessmentEntry entry = entryMap.get(assessedIdentity.getKey()); - if(accept(entry, params)) { - rows.add(new AssessedIdentityCourseElementRow(assessedIdentity, entry, userPropertyHandlers, getLocale())); - } + List<AssessmentEntryRow> quickRows = assessmentToolManager.getAssessmentEntryRows(getIdentity(), params, null); + + List<Identity> assessedIdentities = new ArrayList<>(quickRows.size()); + List<AssessedIdentityCourseElementRow> rows = new ArrayList<>(quickRows.size()); + for(AssessmentEntryRow quickRow:quickRows) { + assessedIdentities.add(quickRow.getIdentity()); + rows.add(new AssessedIdentityCourseElementRow(quickRow.getIdentity(), quickRow.getEntry(), userPropertyHandlers, getLocale())); } + usersTableModel.setObjects(rows); tableEl.reloadData(); @@ -306,17 +302,17 @@ public class AssessmentIdentitiesCourseNodeController extends FormBasicControlle private void fillAlternativeToAssessableIdentityList(AssessmentToolOptions options) { List<Group> baseGroups = new ArrayList<>(); - if((assessmentCallback.canAssessRepositoryEntryMembers() && assessmentCallback.getCoachedGroups().isEmpty()) + if((assessmentCallback.canAssessRepositoryEntryMembers() + && (assessmentCallback.getCoachedGroups() == null || assessmentCallback.getCoachedGroups().isEmpty())) || assessmentCallback.canAssessNonMembers()) { baseGroups.add(repositoryService.getDefaultGroup(courseEntry)); } - if(assessmentCallback.getCoachedGroups().size() > 0) { + if(assessmentCallback.getCoachedGroups() != null && assessmentCallback.getCoachedGroups().size() > 0) { for(BusinessGroup coachedGroup:assessmentCallback.getCoachedGroups()) { baseGroups.add(coachedGroup.getBaseGroup()); } } options.setAlternativeToIdentities(baseGroups, assessmentCallback.canAssessNonMembers()); - } @Override diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java index 3c73424204323aced10518e12a3b19cf049ba1a4..5eaf6b7d3c2316dd96a0da6991250a064e146026 100644 --- a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java +++ b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java @@ -693,7 +693,7 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList } private Identity getPreviewIdentity() { - Identity identity = new TransientIdentity(); + TransientIdentity identity = new TransientIdentity(); identity.setName("username"); List<UserPropertyHandler> userPropertyHandlers = userManager.getAllUserPropertyHandlers(); for(UserPropertyHandler handler:userPropertyHandlers) { diff --git a/src/main/java/org/olat/course/run/preview/PreviewIdentity.java b/src/main/java/org/olat/course/run/preview/PreviewIdentity.java index c0254efa1d88c5e666b82a22ab268cf0f08bf02a..13aea3b48b3f9de2cd472e9f15c7a4e0a15ab4e3 100644 --- a/src/main/java/org/olat/course/run/preview/PreviewIdentity.java +++ b/src/main/java/org/olat/course/run/preview/PreviewIdentity.java @@ -80,11 +80,6 @@ public final class PreviewIdentity implements Identity, User { return "JaneDoe"; } - @Override - public void setName(String loginName) { - // - } - /** * @see org.olat.core.id.Identity#getUser() */ @@ -141,20 +136,10 @@ public final class PreviewIdentity implements Identity, User { return new Date(); } - @Override - public void setLastLogin(Date loginDate) { - // - } - @Override public Integer getStatus() { return Identity.STATUS_ACTIV; } - - @Override - public void setStatus(Integer newStatus) { - // - } /** * @see org.olat.core.commons.persistence.Persistable#equalsByPersistableKey(org.olat.core.commons.persistence.Persistable) diff --git a/src/main/java/org/olat/user/UserDisplayNamePreWarm.java b/src/main/java/org/olat/user/UserDisplayNamePreWarm.java index 0a743052a2582e32d081b638b1feb21ef93c946e..4b6f94c128113bdd169eca9eaa3f783a9673b05a 100644 --- a/src/main/java/org/olat/user/UserDisplayNamePreWarm.java +++ b/src/main/java/org/olat/user/UserDisplayNamePreWarm.java @@ -19,6 +19,7 @@ */ package org.olat.user; +import org.olat.core.configuration.PreWarm; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.CodeHelper; @@ -31,7 +32,7 @@ import org.springframework.stereotype.Service; * */ @Service -public class UserDisplayNamePreWarm implements Runnable { +public class UserDisplayNamePreWarm implements PreWarm { private static final OLog log = Tracing.createLoggerFor(UserDisplayNamePreWarm.class); diff --git a/src/main/java/org/olat/user/UserManagerImpl.java b/src/main/java/org/olat/user/UserManagerImpl.java index 8b0847beb9e827e897851b12f2159d1cce2877c8..ef5e480ecb74488b91a5b41b50cb124a98afc399 100644 --- a/src/main/java/org/olat/user/UserManagerImpl.java +++ b/src/main/java/org/olat/user/UserManagerImpl.java @@ -440,16 +440,14 @@ public class UserManagerImpl extends UserManager { @Override public int warmUp() { - StringBuilder sb = new StringBuilder(); - sb.append("select ident from ").append(IdentityShort.class.getName()).append(" as ident"); - EntityManager em = dbInstance.getCurrentEntityManager(); int batchSize = 5000; - TypedQuery<IdentityShort> query = em.createQuery(sb.toString(), IdentityShort.class) + TypedQuery<IdentityShort> query = em + .createNamedQuery("selectAllIdentitiesShortUnordered", IdentityShort.class) .setMaxResults(batchSize); - int count = 0; + int count = 0; List<IdentityShort> identities; do { identities = query.setFirstResult(count).getResultList(); diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index bf11044036981e555917b7d97eff6316d523d2c2..6aaa5b9633b9e27723689481fcf0e5b8ddbfc602 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -81,6 +81,8 @@ <class>org.olat.upgrade.model.InvitationUpgrade</class> <!-- End upgraders mapping --> + + <class>org.olat.basesecurity.IdentityShort</class> <class>org.olat.basesecurity.model.GroupImpl</class> <class>org.olat.basesecurity.model.GrantImpl</class> <class>org.olat.basesecurity.model.GroupMembershipImpl</class> @@ -96,6 +98,7 @@ <class>org.olat.core.commons.services.taskexecutor.model.PersistentTaskModifier</class> <class>org.olat.core.commons.services.commentAndRating.model.UserRatingImpl</class> <class>org.olat.core.commons.services.commentAndRating.model.UserCommentImpl</class> + <class>org.olat.course.assessment.model.AssessedIdentity</class> <class>org.olat.course.assessment.model.AssessmentModeImpl</class> <class>org.olat.course.assessment.model.AssessmentModeToAreaImpl</class> <class>org.olat.course.assessment.model.AssessmentModeToGroupImpl</class> diff --git a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java index a480287c3118cf1f6e86d42005dba4f638110976..28293e5133895ba2031ea3e389ef5098089c23b0 100644 --- a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java +++ b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java @@ -191,6 +191,26 @@ public class BaseSecurityManagerTest extends OlatTestCase { Assert.assertTrue(foundIds.contains(id2)); } + @Test + public void loadIdentityShortByKey() { + //create a user it + String idName = "find-me-short-1-" + UUID.randomUUID().toString(); + Identity id = JunitTestHelper.createAndPersistIdentityAsUser(idName); + dbInstance.commitAndCloseSession(); + + //find it + IdentityShort foundId = securityManager.loadIdentityShortByKey(id.getKey()); + Assert.assertNotNull(foundId); + Assert.assertEquals(id.getKey(), foundId.getKey()); + Assert.assertEquals(idName, foundId.getName()); + Assert.assertNotNull(foundId.getEmail()); + Assert.assertNotNull(foundId.getFirstName()); + Assert.assertNotNull(foundId.getLastName()); + Assert.assertNotNull(foundId.getLastLogin()); + Assert.assertEquals(id.getUser().getKey(), foundId.getUserKey()); + Assert.assertTrue(foundId.getStatus() < Identity.STATUS_VISIBLE_LIMIT); + } + @Test public void testGetSecurityGroupsForIdentity() { // create diff --git a/src/test/java/org/olat/basesecurity/SecurityManagerTest.java b/src/test/java/org/olat/basesecurity/SecurityManagerTest.java index e73fcd940639c9586528c3a5f07bdc700eaf9774..421c64facbded2eef68e115eeb9abe998b66630b 100644 --- a/src/test/java/org/olat/basesecurity/SecurityManagerTest.java +++ b/src/test/java/org/olat/basesecurity/SecurityManagerTest.java @@ -55,7 +55,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class SecurityManagerTest extends OlatTestCase { - private Identity s1,s2,s3,testAdmin; + private IdentityImpl s1,s2,s3,testAdmin; private static String testLogin = "test-login"; @Autowired @@ -259,9 +259,9 @@ public class SecurityManagerTest extends OlatTestCase { @Before public void setup() throws Exception { - s1 = JunitTestHelper.createAndPersistIdentityAsUser(testLogin); - s2 = JunitTestHelper.createAndPersistIdentityAsUser("coop"); - s3 = JunitTestHelper.createAndPersistIdentityAsAuthor("diesbach"); - testAdmin = JunitTestHelper.createAndPersistIdentityAsAdmin("testAdmin"); + s1 = (IdentityImpl)JunitTestHelper.createAndPersistIdentityAsUser(testLogin); + s2 = (IdentityImpl)JunitTestHelper.createAndPersistIdentityAsUser("coop"); + s3 = (IdentityImpl)JunitTestHelper.createAndPersistIdentityAsAuthor("diesbach"); + testAdmin = (IdentityImpl)JunitTestHelper.createAndPersistIdentityAsAdmin("testAdmin"); } } \ No newline at end of file diff --git a/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java b/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java index c9e86962e585d15f2728d53572a80030b408ddaf..77dc7a129a6f1c06aad8ac3ddfbeb259ed37790b 100644 --- a/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java +++ b/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java @@ -19,12 +19,23 @@ */ package org.olat.course.assessment.manager; +import java.util.List; +import java.util.Set; + import org.junit.Assert; import org.junit.Test; +import org.olat.core.commons.persistence.DB; +import org.olat.core.id.Identity; import org.olat.course.assessment.AssessmentToolManager; +import org.olat.course.assessment.model.AssessedIdentity; +import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.manager.AssessmentEntryDAO; +import org.olat.repository.RepositoryEntry; +import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; import org.springframework.beans.factory.annotation.Autowired; + /** * * Initial date: 23.07.2015<br> @@ -33,13 +44,33 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class AssessmentToolManagerTest extends OlatTestCase { + @Autowired + private DB dbInstance; + @Autowired + private AssessmentEntryDAO courseNodeAssessmentDao; @Autowired private AssessmentToolManager assessmentToolManager; @Test public void getAssessedIdentities() { + Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("as-node-1"); + RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry(); + String subIdent = "39486543874"; + + AssessmentEntry nodeAssessment = courseNodeAssessmentDao + .createCourseNodeAssessment(assessedIdentity, entry, subIdent, entry); + Assert.assertNotNull(nodeAssessment); + dbInstance.commitAndCloseSession(); + - Assert.assertNotNull(assessmentToolManager); + List<AssessedIdentity> ids = ((AssessmentToolManagerImpl)assessmentToolManager).getIdentities(); + Assert.assertNotNull(ids); + for(AssessedIdentity id:ids) { + if(id.getKey().equals(assessedIdentity.getKey())) { + Set<AssessmentEntry> entries = id.getAssessmentEntries(); + System.out.println(entries); + } + } } }