package fi.otavanopisto.muikku.plugins.schooldatapyramus; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import org.apache.commons.lang3.StringUtils; import fi.otavanopisto.muikku.plugins.schooldatapyramus.entities.PyramusCourseIdentifier; import fi.otavanopisto.muikku.plugins.schooldatapyramus.entities.PyramusCurriculum; import fi.otavanopisto.muikku.plugins.schooldatapyramus.entities.PyramusEducationType; import fi.otavanopisto.muikku.plugins.schooldatapyramus.entities.PyramusSchoolDataEntityFactory; import fi.otavanopisto.muikku.plugins.schooldatapyramus.entities.PyramusSubject; import fi.otavanopisto.muikku.plugins.schooldatapyramus.rest.PyramusClient; import fi.otavanopisto.muikku.schooldata.CourseMetaSchoolDataBridge; import fi.otavanopisto.muikku.schooldata.SchoolDataIdentifier; import fi.otavanopisto.muikku.schooldata.SchoolDataBridgeInternalException; import fi.otavanopisto.muikku.schooldata.entity.CourseIdentifier; import fi.otavanopisto.muikku.schooldata.entity.CourseLengthUnit; import fi.otavanopisto.muikku.schooldata.entity.Curriculum; import fi.otavanopisto.muikku.schooldata.entity.EducationType; import fi.otavanopisto.muikku.schooldata.entity.Subject; import fi.otavanopisto.pyramus.rest.model.Course; public class PyramusCourseMetaSchoolDataBridge implements CourseMetaSchoolDataBridge { @Inject private PyramusClient pyramusClient; @Inject private PyramusIdentifierMapper pyramusIdentifierMapper; @Inject private PyramusSchoolDataEntityFactory pyramusSchoolDataEntityFactory; @Override public String getSchoolDataSource() { return SchoolDataPyramusPluginDescriptor.SCHOOL_DATA_SOURCE; } @Override public Subject findSubject(String identifier) { Long subjectId = pyramusIdentifierMapper.getPyramusSubjectId(identifier); return createSubjectEntity(pyramusClient.get("/common/subjects/" + subjectId, fi.otavanopisto.pyramus.rest.model.Subject.class)); } @Override public List<Subject> listSubjects() { fi.otavanopisto.pyramus.rest.model.Subject[] subjects = pyramusClient.get("/common/subjects/", fi.otavanopisto.pyramus.rest.model.Subject[].class); return createSubjectEntities(subjects); } @Override public CourseIdentifier findCourseIdentifier(String identifier) { if (StringUtils.isBlank(identifier)) { return null; } if (identifier.indexOf("/") == -1) throw new SchoolDataBridgeInternalException("Invalid CourseIdentifierId"); String[] idParts = identifier.split("/"); fi.otavanopisto.pyramus.rest.model.Subject subject = pyramusClient.get("/common/subjects/" + idParts[0], fi.otavanopisto.pyramus.rest.model.Subject.class); return new PyramusCourseIdentifier(identifier, subject.getCode() + idParts[1], subject.getId().toString()); } @Override public List<CourseIdentifier> listCourseIdentifiers() { List<CourseIdentifier> result = new ArrayList<>(); fi.otavanopisto.pyramus.rest.model.Subject[] subjects = pyramusClient.get("/common/subjects/", fi.otavanopisto.pyramus.rest.model.Subject[].class); if (subjects != null) { // TODO Ugly workaround to Pyramus Course IDs for (fi.otavanopisto.pyramus.rest.model.Subject subject : subjects) { List<String> courseNumbers = new ArrayList<String>(); String identifier = subject.getId().toString(); Course[] courses = pyramusClient.get("/common/subjects/" + identifier + "/courses", fi.otavanopisto.pyramus.rest.model.Course[].class); if (courses != null) { for (Course course : courses) { String courseNumber = course.getCourseNumber() != null ? course.getCourseNumber().toString() : "null"; if (!courseNumbers.contains(courseNumber)) courseNumbers.add(courseNumber); } for (String cn : courseNumbers) { result.add(new PyramusCourseIdentifier(subject.getId().toString() + "/" + cn, subject.getCode(), subject .getId().toString())); } } } } return result; } @Override public List<CourseIdentifier> listCourseIdentifiersBySubject(String subjectIdentifier) { if (!StringUtils.isNumeric(subjectIdentifier)) { throw new SchoolDataBridgeInternalException("Identifier has to be numeric"); } // TODO Fix workaround fi.otavanopisto.pyramus.rest.model.Subject subject = pyramusClient.get("/common/subjects/" + subjectIdentifier, fi.otavanopisto.pyramus.rest.model.Subject.class); List<CourseIdentifier> result = new ArrayList<>(); List<String> courseNumbers = new ArrayList<String>(); String identifier = subject.getId().toString(); Course[] courses = pyramusClient.get("/common/subjects/" + identifier + "/courses", fi.otavanopisto.pyramus.rest.model.Course[].class); for (Course course : courses) { String courseNumber = course.getCourseNumber() != null ? course.getCourseNumber().toString() : "null"; if (!courseNumbers.contains(courseNumber)) courseNumbers.add(courseNumber); } for (String cn : courseNumbers) { result.add(new PyramusCourseIdentifier(subject.getId().toString() + "/" + cn, subject.getCode(), subject.getId() .toString())); } return result; } private Subject createSubjectEntity(fi.otavanopisto.pyramus.rest.model.Subject s) { if (s == null) { return null; } return new PyramusSubject(s.getId().toString(), s.getName()); } private List<Subject> createSubjectEntities(fi.otavanopisto.pyramus.rest.model.Subject[] subjects) { List<Subject> subs = new ArrayList<Subject>(); if (subjects != null) { for (fi.otavanopisto.pyramus.rest.model.Subject s : subjects) { subs.add(createSubjectEntity(s)); } } return subs; } @Override public EducationType findEducationType(String identifier) { Long educationTypeId = pyramusIdentifierMapper.getPyramusEducationTypeId(identifier); fi.otavanopisto.pyramus.rest.model.EducationType restEducationType = pyramusClient.get("/common/educationTypes/" + educationTypeId, fi.otavanopisto.pyramus.rest.model.EducationType.class); if (restEducationType != null) { return new PyramusEducationType(new SchoolDataIdentifier(identifier, getSchoolDataSource()), restEducationType.getName()); } return null; } @Override public List<EducationType> listEducationTypes() { List<EducationType> result = new ArrayList<>(); fi.otavanopisto.pyramus.rest.model.EducationType[] types = pyramusClient.get("/common/educationTypes", fi.otavanopisto.pyramus.rest.model.EducationType[].class); if (types != null) { for (fi.otavanopisto.pyramus.rest.model.EducationType type : types) { SchoolDataIdentifier identifier = pyramusIdentifierMapper.getEducationTypeIdentifier(type.getId()); result.add(new PyramusEducationType(identifier, type.getName())); } } return result; } @Override public CourseLengthUnit findCourseLengthUnit(String identifier) { Long educationalTimeUnitId = pyramusIdentifierMapper.getPyramusEducationalTimeUnitId(identifier); if (educationalTimeUnitId != null) { return pyramusSchoolDataEntityFactory.getCourseLengthUnit(pyramusClient.get("/common/educationalTimeUnits/" + educationalTimeUnitId, fi.otavanopisto.pyramus.rest.model.EducationalTimeUnit.class)); } return null; } @Override public Curriculum findCurriculum(String identifier) { Long curriculumId = pyramusIdentifierMapper.getPyramusCurriculumId(identifier); fi.otavanopisto.pyramus.rest.model.Curriculum curriculum = pyramusClient.get("/common/curriculums/" + curriculumId, fi.otavanopisto.pyramus.rest.model.Curriculum.class); if (curriculum != null) { return new PyramusCurriculum(new SchoolDataIdentifier(identifier, getSchoolDataSource()), curriculum.getName()); } return null; } @Override public List<Curriculum> listCurriculums() { List<Curriculum> result = new ArrayList<>(); fi.otavanopisto.pyramus.rest.model.Curriculum[] curriculums = pyramusClient.get("/common/curriculums?filterArchived=true", fi.otavanopisto.pyramus.rest.model.Curriculum[].class); if (curriculums != null) { for (fi.otavanopisto.pyramus.rest.model.Curriculum curriculum : curriculums) { SchoolDataIdentifier identifier = pyramusIdentifierMapper.getCurriculumIdentifier(curriculum.getId()); result.add(new PyramusCurriculum(identifier, curriculum.getName())); } } return result; } }