package fi.otavanopisto.muikku.schooldata; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.enterprise.inject.Any; import javax.enterprise.inject.Instance; import javax.inject.Inject; import fi.otavanopisto.muikku.dao.base.SchoolDataSourceDAO; import fi.otavanopisto.muikku.model.base.SchoolDataSource; 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; public class CourseMetaController { // TODO: Caching // TODO: Events @Inject private Logger logger; @Inject @Any private Instance<CourseMetaSchoolDataBridge> courseMetaBridges; @Inject private SchoolDataSourceDAO schoolDataSourceDAO; /* Subjects */ public Subject findSubject(String schoolDataSource, String identifier) { SchoolDataSource dataSource = schoolDataSourceDAO.findByIdentifier(schoolDataSource); if (dataSource != null) { return findSubject(dataSource, identifier); } else { logger.log(Level.SEVERE, "School Data Source could not be found by identifier: " + schoolDataSource); } return null; } public Subject findSubject(SchoolDataSource schoolDataSource, String identifier) { CourseMetaSchoolDataBridge schoolDataBridge = getCourseMetaBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findSubject(identifier); } else { logger.log(Level.SEVERE, "School Data Bridge could not be found for data source: " + schoolDataSource.getIdentifier()); } return null; } public List<Subject> listSubjects() { List<Subject> result = new ArrayList<>(); for (CourseMetaSchoolDataBridge courseMetaBridge : getCourseMetaBridges()) { try { result.addAll(courseMetaBridge.listSubjects()); } catch (SchoolDataBridgeInternalException e) { logger.log(Level.SEVERE, "School Data Bridge reported a problem while listing subjects", e); } } return result; } /* EducationType */ public EducationType findEducationType(SchoolDataIdentifier identifier) { return findEducationType(identifier.getDataSource(), identifier.getIdentifier()); } public EducationType findEducationType(String schoolDataSource, String identifier) { SchoolDataSource dataSource = schoolDataSourceDAO.findByIdentifier(schoolDataSource); if (dataSource != null) { return findEducationType(dataSource, identifier); } else { logger.log(Level.SEVERE, "School Data Source could not be found by identifier: " + schoolDataSource); } return null; } public EducationType findEducationType(SchoolDataSource schoolDataSource, String identifier) { CourseMetaSchoolDataBridge schoolDataBridge = getCourseMetaBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findEducationType(identifier); } else { logger.log(Level.SEVERE, "School Data Bridge could not be found for data source: " + schoolDataSource.getIdentifier()); } return null; } public List<EducationType> listEducationTypes() { List<EducationType> result = new ArrayList<>(); for (CourseMetaSchoolDataBridge courseMetaBridge : getCourseMetaBridges()) { result.addAll(courseMetaBridge.listEducationTypes()); } return result; } /* CourseLenthUnit */ public CourseLengthUnit findCourseLengthUnit(String schoolDataSource, String identifier) { SchoolDataSource dataSource = schoolDataSourceDAO.findByIdentifier(schoolDataSource); if (dataSource != null) { return findCourseLengthUnit(dataSource, identifier); } else { logger.log(Level.SEVERE, "School Data Source could not be found by identifier: " + schoolDataSource); } return null; } public CourseLengthUnit findCourseLengthUnit(SchoolDataSource schoolDataSource, String identifier) { CourseMetaSchoolDataBridge schoolDataBridge = getCourseMetaBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findCourseLengthUnit(identifier); } else { logger.log(Level.SEVERE, "School Data Bridge could not be found for data source: " + schoolDataSource.getIdentifier()); } return null; } /* CourseIdentifier */ public CourseIdentifier findCourseIdentifier(SchoolDataSource schoolDataSource, String identifier) { CourseMetaSchoolDataBridge schoolDataBridge = getCourseMetaBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findCourseIdentifier(identifier); } else { logger.log(Level.SEVERE, "School Data Bridge could not be found for data source: " + schoolDataSource.getIdentifier()); } return null; } public CourseIdentifier findCourseIdentifier(String schoolDataSource, String identifier) { SchoolDataSource dataSource = schoolDataSourceDAO.findByIdentifier(schoolDataSource); if (dataSource != null) { return findCourseIdentifier(dataSource, identifier); } else { logger.log(Level.SEVERE, "School Data Source could not be found by identifier: " + schoolDataSource); } return null; } public List<CourseIdentifier> listCourseIdentifiers() { List<CourseIdentifier> result = new ArrayList<>(); for (CourseMetaSchoolDataBridge courseMetaBridge : getCourseMetaBridges()) { try { result.addAll(courseMetaBridge.listCourseIdentifiers()); } catch (SchoolDataBridgeInternalException e) { logger.log(Level.SEVERE, "School Data Bridge reported a problem while listing course identifiers", e); } } return result; } public List<CourseIdentifier> listCourseIdentifiersBySubject(Subject subject) { SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(subject.getSchoolDataSource()); if (schoolDataSource != null) { CourseMetaSchoolDataBridge schoolDataBridge = getCourseMetaBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.listCourseIdentifiersBySubject(subject.getIdentifier()); } else { logger.log(Level.SEVERE, "School Data Bridge not found: " + schoolDataSource.getIdentifier()); } } return null; } private List<CourseMetaSchoolDataBridge> getCourseMetaBridges() { List<CourseMetaSchoolDataBridge> result = new ArrayList<>(); Iterator<CourseMetaSchoolDataBridge> iterator = courseMetaBridges.iterator(); while (iterator.hasNext()) { result.add(iterator.next()); } return Collections.unmodifiableList(result); } private CourseMetaSchoolDataBridge getCourseMetaBridge(SchoolDataSource schoolDataSource) { Iterator<CourseMetaSchoolDataBridge> iterator = courseMetaBridges.iterator(); while (iterator.hasNext()) { CourseMetaSchoolDataBridge schoolDataBridge = iterator.next(); if (schoolDataBridge.getSchoolDataSource().equals(schoolDataSource.getIdentifier())) { return schoolDataBridge; } } return null; } /* Curriculum */ public Curriculum findCurriculum(SchoolDataIdentifier identifier) { return findCurriculum(identifier.getDataSource(), identifier.getIdentifier()); } public Curriculum findCurriculum(String schoolDataSource, String identifier) { SchoolDataSource dataSource = schoolDataSourceDAO.findByIdentifier(schoolDataSource); if (dataSource != null) { return findCurriculum(dataSource, identifier); } else { logger.log(Level.SEVERE, "School Data Source could not be found by identifier: " + schoolDataSource); } return null; } public Curriculum findCurriculum(SchoolDataSource schoolDataSource, String identifier) { CourseMetaSchoolDataBridge schoolDataBridge = getCourseMetaBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findCurriculum(identifier); } else { logger.log(Level.SEVERE, "School Data Bridge could not be found for data source: " + schoolDataSource.getIdentifier()); } return null; } public List<Curriculum> listCurriculums() { List<Curriculum> result = new ArrayList<>(); for (CourseMetaSchoolDataBridge courseMetaBridge : getCourseMetaBridges()) { result.addAll(courseMetaBridge.listCurriculums()); } return result; } }