package fi.pyramus.services.entities; import java.lang.reflect.Array; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import fi.otavanopisto.pyramus.domainmodel.base.AcademicTerm; import fi.otavanopisto.pyramus.domainmodel.base.Address; import fi.otavanopisto.pyramus.domainmodel.base.CourseEducationSubtype; import fi.otavanopisto.pyramus.domainmodel.base.CourseEducationType; import fi.otavanopisto.pyramus.domainmodel.base.EducationSubtype; import fi.otavanopisto.pyramus.domainmodel.base.EducationType; import fi.otavanopisto.pyramus.domainmodel.base.EducationalTimeUnit; import fi.otavanopisto.pyramus.domainmodel.base.Language; import fi.otavanopisto.pyramus.domainmodel.base.Municipality; import fi.otavanopisto.pyramus.domainmodel.base.Nationality; import fi.otavanopisto.pyramus.domainmodel.base.Person; import fi.otavanopisto.pyramus.domainmodel.base.School; import fi.otavanopisto.pyramus.domainmodel.base.StudyProgramme; import fi.otavanopisto.pyramus.domainmodel.base.StudyProgrammeCategory; import fi.otavanopisto.pyramus.domainmodel.base.Subject; import fi.otavanopisto.pyramus.domainmodel.courses.Course; import fi.otavanopisto.pyramus.domainmodel.courses.CourseComponent; import fi.otavanopisto.pyramus.domainmodel.courses.CourseDescription; import fi.otavanopisto.pyramus.domainmodel.courses.CourseDescriptionCategory; import fi.otavanopisto.pyramus.domainmodel.courses.CourseEnrolmentType; import fi.otavanopisto.pyramus.domainmodel.courses.CourseParticipationType; import fi.otavanopisto.pyramus.domainmodel.courses.CourseStaffMember; import fi.otavanopisto.pyramus.domainmodel.courses.CourseStaffMemberRole; import fi.otavanopisto.pyramus.domainmodel.courses.CourseStudent; import fi.otavanopisto.pyramus.domainmodel.grading.CourseAssessment; import fi.otavanopisto.pyramus.domainmodel.grading.CourseAssessmentRequest; import fi.otavanopisto.pyramus.domainmodel.grading.Credit; import fi.otavanopisto.pyramus.domainmodel.grading.Grade; import fi.otavanopisto.pyramus.domainmodel.grading.GradingScale; import fi.otavanopisto.pyramus.domainmodel.grading.TransferCredit; import fi.otavanopisto.pyramus.domainmodel.modules.Module; import fi.otavanopisto.pyramus.domainmodel.modules.ModuleComponent; import fi.otavanopisto.pyramus.domainmodel.students.Student; import fi.otavanopisto.pyramus.domainmodel.users.StaffMember; import fi.pyramus.services.entities.base.AcademicTermEntity; import fi.pyramus.services.entities.base.AcademicTermEntityFactory; import fi.pyramus.services.entities.base.AddressEntity; import fi.pyramus.services.entities.base.AddressEntityFactory; import fi.pyramus.services.entities.base.EducationSubtypeEntity; import fi.pyramus.services.entities.base.EducationSubtypeEntityFactory; import fi.pyramus.services.entities.base.EducationTypeEntity; import fi.pyramus.services.entities.base.EducationTypeEntityFactory; import fi.pyramus.services.entities.base.EducationalTimeUnitEntity; import fi.pyramus.services.entities.base.EducationalTimeUnitEntityFactory; import fi.pyramus.services.entities.base.LanguageEntity; import fi.pyramus.services.entities.base.LanguageEntityFactory; import fi.pyramus.services.entities.base.MunicipalityEntity; import fi.pyramus.services.entities.base.MunicipalityEntityFactory; import fi.pyramus.services.entities.base.NationalityEntity; import fi.pyramus.services.entities.base.NationalityEntityFactory; import fi.pyramus.services.entities.base.SchoolEntity; import fi.pyramus.services.entities.base.SchoolEntityFactory; import fi.pyramus.services.entities.base.StudyProgrammeCategoryEntity; import fi.pyramus.services.entities.base.StudyProgrammeCategoryEntityFactory; import fi.pyramus.services.entities.base.StudyProgrammeEntity; import fi.pyramus.services.entities.base.StudyProgrammeEntityFactory; import fi.pyramus.services.entities.base.SubjectEntity; import fi.pyramus.services.entities.base.SubjectEntityFactory; import fi.pyramus.services.entities.courses.CourseComponentEntity; import fi.pyramus.services.entities.courses.CourseComponentEntityFactory; import fi.pyramus.services.entities.courses.CourseDescriptionCategoryEntity; import fi.pyramus.services.entities.courses.CourseDescriptionCategoryEntityFactory; import fi.pyramus.services.entities.courses.CourseDescriptionEntity; import fi.pyramus.services.entities.courses.CourseDescriptionEntityFactory; import fi.pyramus.services.entities.courses.CourseEducationSubtypeEntity; import fi.pyramus.services.entities.courses.CourseEducationSubtypeEntityFactory; import fi.pyramus.services.entities.courses.CourseEducationTypeEntity; import fi.pyramus.services.entities.courses.CourseEducationTypeEntityFactory; import fi.pyramus.services.entities.courses.CourseEnrolmentTypeEntity; import fi.pyramus.services.entities.courses.CourseEnrolmentTypeEntityFactory; import fi.pyramus.services.entities.courses.CourseEntity; import fi.pyramus.services.entities.courses.CourseEntityFactory; import fi.pyramus.services.entities.courses.CourseParticipationTypeEntity; import fi.pyramus.services.entities.courses.CourseParticipationTypeEntityFactory; import fi.pyramus.services.entities.courses.CourseStudentEntity; import fi.pyramus.services.entities.courses.CourseStudentEntityFactory; import fi.pyramus.services.entities.courses.CourseUserEntity; import fi.pyramus.services.entities.courses.CourseUserEntityFactory; import fi.pyramus.services.entities.courses.CourseUserRoleEntity; import fi.pyramus.services.entities.courses.CourseUserRoleEntityFactory; import fi.pyramus.services.entities.grading.CourseAssessmentEntity; import fi.pyramus.services.entities.grading.CourseAssessmentEntityFactory; import fi.pyramus.services.entities.grading.CourseAssessmentRequestEntity; import fi.pyramus.services.entities.grading.CourseAssessmentRequestEntityFactory; import fi.pyramus.services.entities.grading.CreditEntity; import fi.pyramus.services.entities.grading.CreditEntityFactory; import fi.pyramus.services.entities.grading.GradeEntity; import fi.pyramus.services.entities.grading.GradeEntityFactory; import fi.pyramus.services.entities.grading.GradingScaleEntity; import fi.pyramus.services.entities.grading.GradingScaleEntityFactory; import fi.pyramus.services.entities.grading.TransferCreditEntity; import fi.pyramus.services.entities.grading.TransferCreditEntityFactory; import fi.pyramus.services.entities.modules.ModuleComponentEntity; import fi.pyramus.services.entities.modules.ModuleComponentEntityFactory; import fi.pyramus.services.entities.modules.ModuleEntity; import fi.pyramus.services.entities.modules.ModuleEntityFactory; import fi.pyramus.services.entities.students.AbstractStudentEntity; import fi.pyramus.services.entities.students.AbstractStudentEntityFactory; import fi.pyramus.services.entities.students.StudentEntity; import fi.pyramus.services.entities.students.StudentEntityFactory; import fi.pyramus.services.entities.users.UserEntity; import fi.pyramus.services.entities.users.UserEntityFactory; public class EntityFactoryVault { public static TransferCreditEntity buildFromDomainObject(TransferCredit transferCredit) { return (TransferCreditEntity) getEntityFactory(TransferCreditEntity.class).buildFromDomainObject(transferCredit); } public static CourseAssessmentEntity buildFromDomainObject(CourseAssessment courseAssessment) { return (CourseAssessmentEntity) getEntityFactory(CourseAssessmentEntity.class).buildFromDomainObject(courseAssessment); } public static CreditEntity buildFromDomainObject(Credit credit) { return (CreditEntity) getEntityFactory(CreditEntity.class).buildFromDomainObject(credit); } public static GradeEntity buildFromDomainObject(Grade grade) { return (GradeEntity) getEntityFactory(GradeEntity.class).buildFromDomainObject(grade); } public static GradingScaleEntity buildFromDomainObject(GradingScale gradingScale) { return (GradingScaleEntity) getEntityFactory(GradingScaleEntity.class).buildFromDomainObject(gradingScale); } public static AbstractStudentEntity buildFromDomainObject(Person person) { return (AbstractStudentEntity) EntityFactoryVault.getEntityFactory(AbstractStudentEntity.class).buildFromDomainObject(person); } public static StudentEntity buildFromDomainObject(Student student) { return (StudentEntity) EntityFactoryVault.getEntityFactory(StudentEntity.class).buildFromDomainObject(student); } public static NationalityEntity buildFromDomainObject(Nationality nationality) { return (NationalityEntity) EntityFactoryVault.getEntityFactory(NationalityEntity.class).buildFromDomainObject(nationality); } public static UserEntity buildFromDomainObject(StaffMember staffMember) { return (UserEntity) EntityFactoryVault.getEntityFactory(UserEntity.class).buildFromDomainObject(staffMember); } public static AddressEntity buildFromDomainObject(Address address) { return (AddressEntity) EntityFactoryVault.getEntityFactory(AddressEntity.class).buildFromDomainObject(address); } public static LanguageEntity buildFromDomainObject(Language language) { return (LanguageEntity) EntityFactoryVault.getEntityFactory(LanguageEntity.class).buildFromDomainObject(language); } public static MunicipalityEntity buildFromDomainObject(Municipality municipality) { return (MunicipalityEntity) EntityFactoryVault.getEntityFactory(MunicipalityEntity.class).buildFromDomainObject(municipality); } public static SchoolEntity buildFromDomainObject(School school) { return (SchoolEntity) EntityFactoryVault.getEntityFactory(SchoolEntity.class).buildFromDomainObject(school); } public static EducationalTimeUnitEntity buildFromDomainObject(EducationalTimeUnit educationalTimeUnit) { return (EducationalTimeUnitEntity) EntityFactoryVault.getEntityFactory(EducationalTimeUnitEntity.class).buildFromDomainObject(educationalTimeUnit); } public static AcademicTermEntity buildFromDomainObject(AcademicTerm academicTerm) { return (AcademicTermEntity) EntityFactoryVault.getEntityFactory(AcademicTermEntity.class).buildFromDomainObject(academicTerm); } public static EducationTypeEntity buildFromDomainObject(EducationType educationType) { return (EducationTypeEntity) EntityFactoryVault.getEntityFactory(EducationTypeEntity.class).buildFromDomainObject(educationType); } public static EducationSubtypeEntity buildFromDomainObject(EducationSubtype educationSubtype) { return (EducationSubtypeEntity) EntityFactoryVault.getEntityFactory(EducationSubtypeEntity.class).buildFromDomainObject(educationSubtype); } public static SubjectEntity buildFromDomainObject(Subject subject) { return (SubjectEntity) EntityFactoryVault.getEntityFactory(SubjectEntity.class).buildFromDomainObject(subject); } public static CourseComponentEntity buildFromDomainObject(CourseComponent courseComponent) { return (CourseComponentEntity) EntityFactoryVault.getEntityFactory(CourseComponentEntity.class).buildFromDomainObject(courseComponent); } public static CourseEnrolmentTypeEntity buildFromDomainObject(CourseEnrolmentType courseEnrolmentType) { return (CourseEnrolmentTypeEntity) EntityFactoryVault.getEntityFactory(CourseEnrolmentTypeEntity.class).buildFromDomainObject(courseEnrolmentType); } public static CourseParticipationTypeEntity buildFromDomainObject(CourseParticipationType courseParticipationType) { return (CourseParticipationTypeEntity) EntityFactoryVault.getEntityFactory(CourseParticipationTypeEntity.class).buildFromDomainObject(courseParticipationType); } public static CourseStudentEntity buildFromDomainObject(CourseStudent courseStudent) { return (CourseStudentEntity) EntityFactoryVault.getEntityFactory(CourseStudentEntity.class).buildFromDomainObject(courseStudent); } public static CourseUserEntity buildFromDomainObject(CourseStaffMember courseUser) { return (CourseUserEntity) EntityFactoryVault.getEntityFactory(CourseUserEntity.class).buildFromDomainObject(courseUser); } public static CourseUserRoleEntity buildFromDomainObject(CourseStaffMemberRole courseUserRole) { return (CourseUserRoleEntity) EntityFactoryVault.getEntityFactory(CourseUserRoleEntity.class).buildFromDomainObject(courseUserRole); } public static CourseEducationTypeEntity buildFromDomainObject(CourseEducationType courseEducationType) { return (CourseEducationTypeEntity) EntityFactoryVault.getEntityFactory(CourseEducationTypeEntity.class).buildFromDomainObject(courseEducationType); } public static CourseEducationSubtypeEntity buildFromDomainObject(CourseEducationSubtype courseEducationSubtype) { return (CourseEducationSubtypeEntity) EntityFactoryVault.getEntityFactory(CourseEducationSubtypeEntity.class).buildFromDomainObject(courseEducationSubtype); } public static CourseEntity buildFromDomainObject(Course course) { return (CourseEntity) EntityFactoryVault.getEntityFactory(CourseEntity.class).buildFromDomainObject(course); } public static CourseDescriptionEntity buildFromDomainObject(CourseDescription courseDescription) { return (CourseDescriptionEntity) EntityFactoryVault.getEntityFactory(CourseDescriptionEntity.class).buildFromDomainObject(courseDescription); } public static CourseDescriptionCategoryEntity buildFromDomainObject(CourseDescriptionCategory category) { return (CourseDescriptionCategoryEntity) EntityFactoryVault.getEntityFactory(CourseDescriptionCategoryEntity.class).buildFromDomainObject(category); } public static ModuleEntity buildFromDomainObject(Module module) { return (ModuleEntity) EntityFactoryVault.getEntityFactory(ModuleEntity.class).buildFromDomainObject(module); } public static ModuleComponentEntity buildFromDomainObject(ModuleComponent moduleComponent) { return (ModuleComponentEntity) EntityFactoryVault.getEntityFactory(ModuleComponentEntity.class).buildFromDomainObject(moduleComponent); } public static StudyProgrammeEntity buildFromDomainObject(StudyProgramme studyProgramme) { return (StudyProgrammeEntity) EntityFactoryVault.getEntityFactory(StudyProgrammeEntity.class).buildFromDomainObject(studyProgramme); } public static StudyProgrammeCategoryEntity buildFromDomainObject(StudyProgrammeCategory studyProgrammeCategory) { return (StudyProgrammeCategoryEntity) EntityFactoryVault.getEntityFactory(StudyProgrammeCategoryEntity.class).buildFromDomainObject(studyProgrammeCategory); } public static CourseAssessmentRequestEntity buildFromDomainObject(CourseAssessmentRequest courseAssessmentRequest) { return (CourseAssessmentRequestEntity) EntityFactoryVault.getEntityFactory(CourseAssessmentRequestEntity.class).buildFromDomainObject(courseAssessmentRequest); } public static Object[] buildFromDomainObjects(Collection<?> entities) { Class<?> listClass; if (!entities.isEmpty()) { if (entities instanceof List) { listClass = ((List<?>) entities).get(0).getClass(); } else { listClass = entities.iterator().next().getClass(); } return buildCollection(getEntityClassForPojoClass(listClass), entities); } else { return null; } } private static Object[] buildCollection(Class<?> entityClass, Collection<?> objects) { Object[] entities = (Object[]) Array.newInstance(entityClass, objects.size()); int i = 0; for (Object domainObject : objects) { entities[i++] = getEntityFactory(entityClass).buildFromDomainObject(domainObject); } return entities; } private static EntityFactory<?> getEntityFactory(Class<?> entityClass) { return factories.get(entityClass); } private static void registerEntityFactory(Class<?> pojoClass, Class<?> entityClass, EntityFactory<?> entityFactory) { factories.put(entityClass, entityFactory); pojoEntityClassMap.put(pojoClass, entityClass); } private static Class<?> getEntityClassForPojoClass(Class<?> pojoClass) { return pojoEntityClassMap.get(pojoClass); } private static Map<Class<?>, EntityFactory<?>> factories = new HashMap<>(); private static Map<Class<?>, Class<?>> pojoEntityClassMap = new HashMap<>(); static { /* Base */ registerEntityFactory(Address.class, AddressEntity.class, new AddressEntityFactory()); registerEntityFactory(School.class, SchoolEntity.class, new SchoolEntityFactory()); registerEntityFactory(Nationality.class, NationalityEntity.class, new NationalityEntityFactory()); registerEntityFactory(School.class, SchoolEntity.class, new SchoolEntityFactory()); registerEntityFactory(Nationality.class, NationalityEntity.class, new NationalityEntityFactory()); registerEntityFactory(Municipality.class, MunicipalityEntity.class, new MunicipalityEntityFactory()); registerEntityFactory(Language.class, LanguageEntity.class, new LanguageEntityFactory()); registerEntityFactory(EducationalTimeUnit.class, EducationalTimeUnitEntity.class, new EducationalTimeUnitEntityFactory()); registerEntityFactory(AcademicTerm.class, AcademicTermEntity.class, new AcademicTermEntityFactory()); registerEntityFactory(EducationType.class, EducationTypeEntity.class, new EducationTypeEntityFactory()); registerEntityFactory(EducationSubtype.class, EducationSubtypeEntity.class, new EducationSubtypeEntityFactory()); registerEntityFactory(Subject.class, SubjectEntity.class, new SubjectEntityFactory()); registerEntityFactory(StudyProgramme.class, StudyProgrammeEntity.class, new StudyProgrammeEntityFactory()); registerEntityFactory(StudyProgrammeCategory.class, StudyProgrammeCategoryEntity.class, new StudyProgrammeCategoryEntityFactory()); registerEntityFactory(Person.class ,AbstractStudentEntity.class, new AbstractStudentEntityFactory()); /* Users */ registerEntityFactory(StaffMember.class, UserEntity.class, new UserEntityFactory()); /* Students */ registerEntityFactory(Student.class, StudentEntity.class, new StudentEntityFactory()); /* Courses */ registerEntityFactory(Course.class, CourseEntity.class, new CourseEntityFactory()); registerEntityFactory(CourseComponent.class, CourseComponentEntity.class, new CourseComponentEntityFactory()); registerEntityFactory(CourseEnrolmentType.class, CourseEnrolmentTypeEntity.class, new CourseEnrolmentTypeEntityFactory()); registerEntityFactory(CourseParticipationType.class, CourseParticipationTypeEntity.class, new CourseParticipationTypeEntityFactory()); registerEntityFactory(CourseStudent.class, CourseStudentEntity.class, new CourseStudentEntityFactory()); registerEntityFactory(CourseEducationType.class, CourseEducationTypeEntity.class, new CourseEducationTypeEntityFactory()); registerEntityFactory(CourseEducationSubtype.class, CourseEducationSubtypeEntity.class, new CourseEducationSubtypeEntityFactory()); registerEntityFactory(CourseStaffMember.class, CourseUserEntity.class, new CourseUserEntityFactory()); registerEntityFactory(CourseStaffMemberRole.class, CourseUserRoleEntity.class, new CourseUserRoleEntityFactory()); registerEntityFactory(CourseDescriptionCategory.class, CourseDescriptionCategoryEntity.class, new CourseDescriptionCategoryEntityFactory()); registerEntityFactory(CourseDescription.class, CourseDescriptionEntity.class, new CourseDescriptionEntityFactory()); /* Grading */ registerEntityFactory(CourseAssessment.class, CourseAssessmentEntity.class, new CourseAssessmentEntityFactory()); registerEntityFactory(Credit.class, CreditEntity.class, new CreditEntityFactory()); registerEntityFactory(Grade.class, GradeEntity.class, new GradeEntityFactory()); registerEntityFactory(GradingScale.class, GradingScaleEntity.class, new GradingScaleEntityFactory()); registerEntityFactory(TransferCredit.class, TransferCreditEntity.class, new TransferCreditEntityFactory()); registerEntityFactory(CourseAssessmentRequest.class, CourseAssessmentRequestEntity.class, new CourseAssessmentRequestEntityFactory()); /* Modules */ registerEntityFactory(Module.class, ModuleEntity.class, new ModuleEntityFactory()); registerEntityFactory(ModuleComponent.class, ModuleComponentEntity.class, new ModuleComponentEntityFactory()); } }