package fi.otavanopisto.muikku.plugins.schooldatapyramus.entities; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import java.time.OffsetDateTime; import fi.otavanopisto.muikku.controller.PluginSettingsController; import fi.otavanopisto.muikku.model.users.EnvironmentRoleArchetype; import fi.otavanopisto.muikku.plugins.schooldatapyramus.PyramusIdentifierMapper; import fi.otavanopisto.muikku.plugins.schooldatapyramus.SchoolDataPyramusPluginDescriptor; import fi.otavanopisto.muikku.schooldata.SchoolDataIdentifier; import fi.otavanopisto.muikku.schooldata.entity.CompositeAssessmentRequest; import fi.otavanopisto.muikku.schooldata.entity.CourseLengthUnit; import fi.otavanopisto.muikku.schooldata.entity.EnvironmentRole; import fi.otavanopisto.muikku.schooldata.entity.GroupUser; import fi.otavanopisto.muikku.schooldata.entity.TransferCredit; import fi.otavanopisto.muikku.schooldata.entity.User; import fi.otavanopisto.muikku.schooldata.entity.UserAddress; import fi.otavanopisto.muikku.schooldata.entity.UserEmail; import fi.otavanopisto.muikku.schooldata.entity.UserGroup; import fi.otavanopisto.muikku.schooldata.entity.UserPhoneNumber; import fi.otavanopisto.muikku.schooldata.entity.Workspace; import fi.otavanopisto.muikku.schooldata.entity.WorkspaceAssessment; import fi.otavanopisto.muikku.schooldata.entity.WorkspaceAssessmentRequest; import fi.otavanopisto.muikku.schooldata.entity.WorkspaceRole; import fi.otavanopisto.muikku.schooldata.entity.WorkspaceRoleArchetype; import fi.otavanopisto.muikku.schooldata.entity.WorkspaceType; import fi.otavanopisto.muikku.schooldata.entity.WorkspaceUser; import fi.otavanopisto.pyramus.rest.model.Address; import fi.otavanopisto.pyramus.rest.model.ContactType; import fi.otavanopisto.pyramus.rest.model.Course; import fi.otavanopisto.pyramus.rest.model.CourseAssessment; import fi.otavanopisto.pyramus.rest.model.CourseAssessmentRequest; import fi.otavanopisto.pyramus.rest.model.CourseStaffMember; import fi.otavanopisto.pyramus.rest.model.CourseStaffMemberRole; import fi.otavanopisto.pyramus.rest.model.CourseStudent; import fi.otavanopisto.pyramus.rest.model.CourseType; import fi.otavanopisto.pyramus.rest.model.EducationalTimeUnit; import fi.otavanopisto.pyramus.rest.model.Email; import fi.otavanopisto.pyramus.rest.model.PhoneNumber; import fi.otavanopisto.pyramus.rest.model.StudentGroup; import fi.otavanopisto.pyramus.rest.model.StudentGroupStudent; import fi.otavanopisto.pyramus.rest.model.StudentGroupUser; import fi.otavanopisto.pyramus.rest.model.UserRole; @ApplicationScoped public class PyramusSchoolDataEntityFactory { @Inject private Logger logger; @Inject private PyramusIdentifierMapper identifierMapper; @Inject private PluginSettingsController pluginSettingsController; @PostConstruct public void init() { pyramusHost = pluginSettingsController.getPluginSetting(SchoolDataPyramusPluginDescriptor.PLUGIN_NAME, "pyramusHost"); teacherRoleSetting = pluginSettingsController.getPluginSetting(SchoolDataPyramusPluginDescriptor.PLUGIN_NAME, "roles.workspace.TEACHER"); } public WorkspaceRole createCourseStudentRoleEntity() { // TODO: Localize return new PyramusWorkspaceRole(identifierMapper.getWorkspaceStudentRoleIdentifier(), "Course Student", WorkspaceRoleArchetype.STUDENT); } public User createEntity(fi.otavanopisto.pyramus.rest.model.StaffMember staffMember) { String displayName = staffMember.getFirstName() + " " + staffMember.getLastName(); boolean hidden = false; return new PyramusUser( identifierMapper.getStaffIdentifier(staffMember.getId()), staffMember.getFirstName(), staffMember.getLastName(), null, displayName, null, null, null, null, null, null, null, null, null, false, hidden); } public List<User> createEntity(fi.otavanopisto.pyramus.rest.model.StaffMember... staffMembers) { List<User> result = new ArrayList<>(); for (fi.otavanopisto.pyramus.rest.model.StaffMember staffMember : staffMembers) { result.add(createEntity(staffMember)); } return result; } public User createEntity(fi.otavanopisto.pyramus.rest.model.Student student, fi.otavanopisto.pyramus.rest.model.StudyProgramme studyProgramme, String nationality, String language, String municipality, String school, OffsetDateTime studyStartDate, OffsetDateTime studyEndDate, OffsetDateTime studyTimeEnd, boolean evaluationFees, boolean hidden, String curriculumIdentifer) { StringBuilder displayName = new StringBuilder(); displayName.append(student.getFirstName()).append(' ').append(student.getLastName()); String studyProgrammeName = studyProgramme != null ? studyProgramme.getName() : null; if (studyProgrammeName != null) { displayName.append(String.format(" (%s)", studyProgrammeName)); } return new PyramusUser( identifierMapper.getStudentIdentifier(student.getId()), student.getFirstName(), student.getLastName(), student.getNickname(), displayName.toString(), studyProgrammeName, nationality, language, municipality, school, curriculumIdentifer, studyStartDate, studyEndDate, studyTimeEnd, evaluationFees, hidden); } public EnvironmentRole createEntity(fi.otavanopisto.pyramus.rest.model.UserRole role) { if (role == null) { return null; } EnvironmentRoleArchetype archetype = getEnvironmentRoleArchetype(role); return new PyramusEnvironmentRole("ENV-" + role.name(), archetype, role.name()); } public EnvironmentRole createStudentEnvironmentRoleEntity() { // TODO: Localize EnvironmentRoleArchetype archetype = EnvironmentRoleArchetype.STUDENT; return new PyramusEnvironmentRole("ENV-STUDENT", archetype, "Student"); } public List<EnvironmentRole> createEntity(fi.otavanopisto.pyramus.rest.model.UserRole... roles) { List<EnvironmentRole> result = new ArrayList<>(); for (fi.otavanopisto.pyramus.rest.model.UserRole role : roles) { result.add(createEntity(role)); } return result; } public WorkspaceRole createEntity(CourseStaffMemberRole staffMemberRole) { if (staffMemberRole == null) { return null; } WorkspaceRoleArchetype archetype = getWorkspaceRoleArchetype(staffMemberRole.getId()); return new PyramusWorkspaceRole(identifierMapper.getWorkspaceStaffRoleIdentifier(staffMemberRole.getId()), staffMemberRole.getName(), archetype); } public List<WorkspaceRole> createEntity(CourseStaffMemberRole[] staffMemberRoles) { List<WorkspaceRole> result = new ArrayList<>(); for (fi.otavanopisto.pyramus.rest.model.CourseStaffMemberRole staffMemberRole : staffMemberRoles) { result.add(createEntity(staffMemberRole)); } return result; } public WorkspaceUser createEntity(CourseStaffMember staffMember) { if (staffMember == null) { return null; } SchoolDataIdentifier identifier = toIdentifier(identifierMapper.getWorkspaceStaffIdentifier(staffMember.getId())); SchoolDataIdentifier userIdentifier = toIdentifier(identifierMapper.getStaffIdentifier(staffMember.getStaffMemberId())); SchoolDataIdentifier workspaceIdentifier = toIdentifier(identifierMapper.getWorkspaceIdentifier(staffMember.getCourseId())); SchoolDataIdentifier roleIdentifier = toIdentifier(identifierMapper.getWorkspaceStaffRoleIdentifier(staffMember.getRoleId())); return new PyramusWorkspaceUser( identifier, userIdentifier, workspaceIdentifier, roleIdentifier, null ); } private SchoolDataIdentifier toIdentifier(String identifier) { return new SchoolDataIdentifier(identifier, SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE); } public List<WorkspaceUser> createEntity(CourseStaffMember... staffMembers) { List<WorkspaceUser> result = new ArrayList<>(); if (staffMembers != null) { for (CourseStaffMember staffMember : staffMembers) { result.add(createEntity(staffMember)); } } return result; } public WorkspaceUser createEntity(CourseStudent courseStudent) { if (courseStudent == null) { return null; } SchoolDataIdentifier identifier = toIdentifier(identifierMapper.getWorkspaceStudentIdentifier(courseStudent.getId())); SchoolDataIdentifier userIdentifier = toIdentifier(identifierMapper.getStudentIdentifier(courseStudent.getStudentId())); SchoolDataIdentifier workspaceIdentifier = toIdentifier(identifierMapper.getWorkspaceIdentifier(courseStudent.getCourseId())); SchoolDataIdentifier roleIdentifier = toIdentifier(createCourseStudentRoleEntity().getIdentifier()); return new PyramusWorkspaceUser( identifier, userIdentifier, workspaceIdentifier, roleIdentifier, courseStudent.getEnrolmentTime() ); } public List<WorkspaceUser> createEntity(CourseStudent... courseStudents) { List<WorkspaceUser> result = new ArrayList<>(); if (courseStudents != null) { for (CourseStudent courseStudent : courseStudents) { result.add(createEntity(courseStudent)); } } return result; } public Workspace createEntity( Course course, SchoolDataIdentifier educationTypeIdentifier, Map<String, List<String>> educationTypeCodeMap ) { if (course == null) { return null; } OffsetDateTime modified = course.getLastModified(); if (modified == null) { modified = course.getCreated(); } boolean courseFeeApplicable = true; for (Map.Entry<String, List<String>> typeCodeEntry : educationTypeCodeMap.entrySet()) { String educationTypeCode = typeCodeEntry.getKey(); for (String educationSubtypeCode : typeCodeEntry.getValue()) { if ((Objects.equals(educationTypeCode, "lukio") && Objects.equals(educationSubtypeCode, "pakollinen")) || (Objects.equals(educationTypeCode, "lukio") && Objects.equals(educationSubtypeCode, "valtakunnallinensyventava")) || (Objects.equals(educationTypeCode, "peruskoulu") && Objects.equals(educationSubtypeCode, "pakollinen")) || (Objects.equals(educationTypeCode, "peruskoulu") && Objects.equals(educationSubtypeCode, "valinnainen"))) { courseFeeApplicable = false; break; } } } String viewLink = String.format("https://%s/courses/viewcourse.page?course=%d", pyramusHost, course.getId()); Set<SchoolDataIdentifier> curriculumIdentifiers = new HashSet<>(); if (course.getCurriculumIds() != null) { for (Long curriculumId : course.getCurriculumIds()) { curriculumIdentifiers.add(identifierMapper.getCurriculumIdentifier(curriculumId)); } } return new PyramusWorkspace( identifierMapper.getWorkspaceIdentifier(course.getId()), course.getName(), course.getNameExtension(), viewLink, identifierMapper.getWorkspaceTypeIdentifier(course.getTypeId()), identifierMapper.getWorkspaceCourseIdentifier(course.getSubjectId(), course.getCourseNumber()), course.getDescription(), identifierMapper.getSubjectIdentifier(course.getSubjectId()), educationTypeIdentifier, modified != null ? Date.from(modified.toInstant()) : null, course.getLength(), identifierMapper.getCourseLengthUnitIdentifier(course.getLengthUnitId()), course.getBeginDate(), course.getEndDate(), course.getArchived(), courseFeeApplicable, curriculumIdentifiers); } public WorkspaceType createEntity(CourseType courseType) { if (courseType == null) { return null; } return new PyramusWorkspaceType(identifierMapper.getWorkspaceTypeIdentifier(courseType.getId()), courseType.getName()); } public WorkspaceAssessment createEntity(CourseAssessment courseAssessment) { if (courseAssessment == null) { logger.severe("Attempted to translate null course assessment into school data entity"); return null; } SchoolDataIdentifier gradeIdentifier = identifierMapper.getGradeIdentifier(courseAssessment.getGradeId()); SchoolDataIdentifier gradingScaleIdentifier = identifierMapper.getGradingScaleIdentifier(courseAssessment.getGradingScaleId()); Date courseAssessmentDate = null; if (courseAssessment.getDate() != null) { courseAssessmentDate = Date.from(courseAssessment.getDate().toInstant()); } return new PyramusWorkspaceAssessment(courseAssessment.getId().toString(), identifierMapper.getWorkspaceStudentIdentifier(courseAssessment.getCourseStudentId()), identifierMapper.getStaffIdentifier(courseAssessment.getAssessorId()), gradeIdentifier.getIdentifier(), gradingScaleIdentifier.getIdentifier(), courseAssessment.getVerbalAssessment(), courseAssessmentDate, courseAssessment.getPassing()); } public List<WorkspaceAssessment> createEntity(CourseAssessment... courseAssessments) { List<WorkspaceAssessment> result = new ArrayList<>(); if (courseAssessments != null) { for (CourseAssessment courseAssessment : courseAssessments) { result.add(createEntity(courseAssessment)); } } return result; } public List<CompositeAssessmentRequest> createEntity(fi.otavanopisto.pyramus.rest.model.composite.CompositeAssessmentRequest... assessmentRequests) { List<CompositeAssessmentRequest> result = new ArrayList<>(); if (assessmentRequests != null) { for (fi.otavanopisto.pyramus.rest.model.composite.CompositeAssessmentRequest assessmentRequest : assessmentRequests) { result.add(createEntity(assessmentRequest)); } } return result; } public CompositeAssessmentRequest createEntity(fi.otavanopisto.pyramus.rest.model.composite.CompositeAssessmentRequest assessmentRequest) { if (assessmentRequest == null) { logger.severe("Attempted to translate null assessment request into school data entity"); return null; } return new PyramusCompositeAssessmentRequest( identifierMapper.getWorkspaceStudentIdentifier(assessmentRequest.getCourseStudentId()), assessmentRequest.getUserId() == null ? null : identifierMapper.getStudentIdentifier(assessmentRequest.getUserId()), assessmentRequest.getFirstName(), assessmentRequest.getLastName(), assessmentRequest.getStudyProgramme(), assessmentRequest.getCourseId() == null ? null : identifierMapper.getWorkspaceIdentifier(assessmentRequest.getCourseId()), assessmentRequest.getCourseName(), assessmentRequest.getCourseNameExtension(), assessmentRequest.getCourseEnrollmentDate(), assessmentRequest.getAssessmentRequestDate(), assessmentRequest.getEvaluationDate(), assessmentRequest.getPassing()); } public WorkspaceAssessmentRequest createEntity(CourseAssessmentRequest courseAssessmentRequest) { if (courseAssessmentRequest == null) { logger.severe("Attempted to translate null course assessment request into school data entity"); return null; } Date created = null; if (courseAssessmentRequest.getCreated() != null) { created = Date.from(courseAssessmentRequest.getCreated().toInstant()); } return new PyramusWorkspaceAssessmentRequest(courseAssessmentRequest.getId().toString(), identifierMapper.getWorkspaceStudentIdentifier(courseAssessmentRequest.getCourseStudentId()), courseAssessmentRequest.getRequestText(), created, courseAssessmentRequest.getArchived(), courseAssessmentRequest.getHandled()); } public List<WorkspaceAssessmentRequest> createEntity(CourseAssessmentRequest... courseAssessmentRequests) { List<WorkspaceAssessmentRequest> result = new ArrayList<>(); if (courseAssessmentRequests != null) { for (CourseAssessmentRequest courseAssessment : courseAssessmentRequests) { result.add(createEntity(courseAssessment)); } } return result; } public UserGroup createEntity(StudentGroup studentGroup) { return new PyramusUserGroup(identifierMapper.getStudentGroupIdentifier(studentGroup.getId()), studentGroup.getName(), studentGroup.getGuidanceGroup()); } public List<UserGroup> createEntities(StudentGroup... studentGroups) { List<UserGroup> result = new ArrayList<>(); for (StudentGroup studentGroup : studentGroups) { result.add(createEntity(studentGroup)); } return result; } public GroupUser createEntity(StudentGroupStudent studentGroupStudent) { return new PyramusGroupUser(identifierMapper.getStudentGroupStudentIdentifier(studentGroupStudent.getId()), identifierMapper.getStudentIdentifier(studentGroupStudent.getStudentId())); } public GroupUser createEntity(StudentGroupUser studentGroupUser) { return new PyramusGroupUser(identifierMapper.getStudentGroupStaffMemberIdentifier(studentGroupUser.getId()), identifierMapper.getStaffIdentifier(studentGroupUser.getStaffMemberId())); } public List<GroupUser> createEntities(StudentGroupStudent... studentGroupStudents) { List<GroupUser> results = new ArrayList<>(); if (studentGroupStudents != null) { for (StudentGroupStudent studentGroupStudent : studentGroupStudents) { results.add(createEntity(studentGroupStudent)); } } return results; } public List<GroupUser> createEntities(StudentGroupUser... studentGroupUsers) { List<GroupUser> results = new ArrayList<>(); if (studentGroupUsers != null) { for (StudentGroupUser studentGroupUser : studentGroupUsers) { results.add(createEntity(studentGroupUser)); } } return results; } public List<WorkspaceType> createEntities(CourseType... courseTypes) { List<WorkspaceType> result = new ArrayList<>(); if (courseTypes != null) { for (CourseType courseType : courseTypes) { result.add(createEntity(courseType)); } } return result; } public CourseLengthUnit getCourseLengthUnit(EducationalTimeUnit educationalTimeUnit) { if (educationalTimeUnit == null) { return null; } return new PyramusCourseLengthUnit(identifierMapper.getCourseLengthUnitIdentifier(educationalTimeUnit.getId()), educationalTimeUnit.getSymbol(), educationalTimeUnit.getName()); } private EnvironmentRoleArchetype getEnvironmentRoleArchetype(UserRole role) { switch (role) { case ADMINISTRATOR: return EnvironmentRoleArchetype.ADMINISTRATOR; case MANAGER: return EnvironmentRoleArchetype.MANAGER; case STUDENT: return EnvironmentRoleArchetype.STUDENT; case TEACHER: return EnvironmentRoleArchetype.TEACHER; case STUDY_GUIDER: return EnvironmentRoleArchetype.STUDY_GUIDER; case STUDY_PROGRAMME_LEADER: return EnvironmentRoleArchetype.STUDY_PROGRAMME_LEADER; default: return EnvironmentRoleArchetype.CUSTOM; } } private WorkspaceRoleArchetype getWorkspaceRoleArchetype(Long staffMemberRoleId) { if (StringUtils.isNumeric(teacherRoleSetting)) { if (staffMemberRoleId.equals(NumberUtils.createLong(teacherRoleSetting))) { return WorkspaceRoleArchetype.TEACHER; } } return WorkspaceRoleArchetype.CUSTOM; } public UserAddress createEntity(SchoolDataIdentifier userIdentifier, Address address, ContactType contactType) { return new PyramusUserAddress( identifierMapper.getAddressIdentifier(address.getId()), userIdentifier, address.getStreetAddress(), address.getPostalCode(), address.getCity(), null, address.getCountry(), contactType != null ? contactType.getName() : null, address.getDefaultAddress()); } public UserPhoneNumber createEntity(SchoolDataIdentifier userIdentifier, PhoneNumber phoneNumber, ContactType contactType) { if (phoneNumber != null) { return new PyramusUserPhoneNumber(userIdentifier, phoneNumber.getNumber(), contactType != null ? contactType.getName() : null, phoneNumber.getDefaultNumber()); } return null; } public UserEmail createEntity(SchoolDataIdentifier userIdentifier, Email email, ContactType contactType) { return new PyramusUserEmail(toIdentifier(identifierMapper.getEmailIdentifier(email.getId())), userIdentifier, email.getAddress(), contactType != null ? contactType.getName() : null, email.getDefaultAddress()); } public TransferCredit createEntity(fi.otavanopisto.pyramus.rest.model.TransferCredit transferCredit) { SchoolDataIdentifier identifier = identifierMapper.getTransferCreditIdentifier(transferCredit.getId()); SchoolDataIdentifier studentIdentifier = transferCredit.getStudentId() != null ? toIdentifier(identifierMapper.getStudentIdentifier(transferCredit.getStudentId())) : null; SchoolDataIdentifier gradeIdentifier = transferCredit.getGradeId() != null ? identifierMapper.getGradeIdentifier(transferCredit.getGradeId()) : null; SchoolDataIdentifier gradingScaleIdentifier = transferCredit.getGradingScaleId() != null ? identifierMapper.getGradingScaleIdentifier(transferCredit.getGradingScaleId()) : null; SchoolDataIdentifier assessorIdentifier = transferCredit.getAssessorId() != null ? toIdentifier(identifierMapper.getStaffIdentifier(transferCredit.getAssessorId())) : null; SchoolDataIdentifier lengthUnitIdentifier = transferCredit.getLengthUnitId() != null ? toIdentifier(identifierMapper.getCourseLengthUnitIdentifier(transferCredit.getLengthUnitId())) : null; SchoolDataIdentifier subjectIdentifier = transferCredit.getSubjectId() != null ? toIdentifier(identifierMapper.getSubjectIdentifier(transferCredit.getSubjectId())) : null; SchoolDataIdentifier schoolIdentifier = transferCredit.getSchoolId() != null ? identifierMapper.getSchoolIdentifier(transferCredit.getSchoolId()) : null; SchoolDataIdentifier curriculumIdentifier = transferCredit.getCurriculumId() != null ? identifierMapper.getCurriculumIdentifier(transferCredit.getCurriculumId()) : null; return new PyramusTransferCredit(identifier, studentIdentifier, transferCredit.getDate(), gradeIdentifier, gradingScaleIdentifier, transferCredit.getVerbalAssessment(), assessorIdentifier, transferCredit.getCourseName(), transferCredit.getCourseNumber(), transferCredit.getLength(), lengthUnitIdentifier, schoolIdentifier, subjectIdentifier, curriculumIdentifier); } private String pyramusHost; private String teacherRoleSetting; }