package fi.otavanopisto.pyramus.util.dataimport; import java.util.Date; import java.util.HashMap; import java.util.Map; import fi.internetix.smvc.SmvcRuntimeException; import fi.otavanopisto.pyramus.dao.DAOFactory; import fi.otavanopisto.pyramus.dao.base.PersonDAO; import fi.otavanopisto.pyramus.dao.base.StudyProgrammeDAO; import fi.otavanopisto.pyramus.domainmodel.base.Address; import fi.otavanopisto.pyramus.domainmodel.base.ContactInfo; import fi.otavanopisto.pyramus.domainmodel.base.Email; import fi.otavanopisto.pyramus.domainmodel.base.Person; import fi.otavanopisto.pyramus.domainmodel.base.PhoneNumber; import fi.otavanopisto.pyramus.domainmodel.base.StudyProgramme; import fi.otavanopisto.pyramus.domainmodel.courses.Course; import fi.otavanopisto.pyramus.domainmodel.courses.CourseStudent; import fi.otavanopisto.pyramus.domainmodel.modules.Module; import fi.otavanopisto.pyramus.domainmodel.students.Student; import fi.otavanopisto.pyramus.domainmodel.users.User; import fi.otavanopisto.pyramus.framework.PyramusStatusCode; public class DataImportStrategyProvider { protected DataImportStrategyProvider() { } public static DataImportStrategyProvider instance() { return _instance; } public void registerFieldHandler(EntityImportStrategy entityStrategy, String fieldName, FieldHandlingStrategy strategy) { EntityFieldHandlerProvider entityHandler = getEntityFieldHandlerProvider(entityStrategy); if (entityHandler == null) { entityHandler = new EntityFieldHandlerProvider(); registerEntityFieldHandler(entityStrategy, entityHandler); } entityHandler.registerFieldHandler(fieldName, strategy); } public FieldHandlingStrategy getFieldHandler(EntityImportStrategy entityStrategy, String fieldName) { EntityFieldHandlerProvider entityHandler = getEntityFieldHandlerProvider(entityStrategy); if (entityHandler != null) { FieldHandlingStrategy fieldHandlingStrategy = entityHandler.getFieldHandlingStrategy(fieldName); return fieldHandlingStrategy; } else { return null; } } private EntityFieldHandlerProvider getEntityFieldHandlerProvider(EntityImportStrategy entityStrategy) { return entityFieldHandlers.get(entityStrategy); } public EntityHandlingStrategy getEntityHandler(EntityImportStrategy strategy) { return entityHandlers.get(strategy); } public void registerEntityHandler(EntityImportStrategy strategy, EntityHandlingStrategy entityHandler) { entityHandlers.put(strategy, entityHandler); } private void registerEntityFieldHandler(EntityImportStrategy entityStrategy, EntityFieldHandlerProvider prov) { entityFieldHandlers.put(entityStrategy, prov); } private Map<EntityImportStrategy, EntityFieldHandlerProvider> entityFieldHandlers = new HashMap<>(); private Map<EntityImportStrategy, EntityHandlingStrategy> entityHandlers = new HashMap<>(); private static DataImportStrategyProvider _instance; static { _instance = new DataImportStrategyProvider(); EntityImportStrategy entityStrategy; Class<?> subClass; entityStrategy = EntityImportStrategy.STUDENT; subClass = Student.class; instance().registerEntityHandler(entityStrategy, new DefaultEntityHandlingStrategy(Student.class, entityStrategy) { @Override public void initializeContext(DataImportContext context) { super.initializeContext(context); PersonDAO personDAO = DAOFactory.getInstance().getPersonDAO(); if (context.hasField("socialSecurityNumber")) { String ssn = context.getFieldValue("socialSecurityNumber"); if (ssn != null) { Person person = personDAO.findBySSN(ssn); context.addEntity(Person.class, person); } } } @Override protected void bindEntities(DataImportContext context) { super.bindEntities(context); // Bind Address, Email, Phone, Person etc. to Student or create new ones where needed Student student = (Student) context.getEntity(Student.class); Person person = (Person) context.getEntity(Person.class); if (person == null) { person = new Person(); context.addEntity(Person.class, person); } person.addUser(student); // Adress Address address = (Address) context.getEntity(Address.class); if (address != null) { ContactInfo contactInfo = getStudentContactInfo(student); contactInfo.addAddress(address); } // Email Email email = (Email) context.getEntity(Email.class); if (email != null) { ContactInfo contactInfo = getStudentContactInfo(student); contactInfo.addEmail(email); } // PhoneNumber PhoneNumber phone = (PhoneNumber) context.getEntity(PhoneNumber.class); if (phone != null) { ContactInfo contactInfo = getStudentContactInfo(student); contactInfo.addPhoneNumber(phone); } } private ContactInfo getStudentContactInfo(Student student) { ContactInfo result = student.getContactInfo(); if (result == null) { result = new ContactInfo(); student.setContactInfo(result); } return result; } }); instance().registerFieldHandler(entityStrategy, "firstName", new DefaultFieldHandingStrategy(subClass)); instance().registerFieldHandler(entityStrategy, "lastName", new DefaultFieldHandingStrategy(subClass)); instance().registerFieldHandler(entityStrategy, "studyProgrammeName", new DefaultFieldHandingStrategy(subClass) { @Override public void handleField(String fieldName, Object fieldValue, DataImportContext context) throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException { StudyProgrammeDAO studyProgrammeDAO = DAOFactory.getInstance().getStudyProgrammeDAO(); Student student = (Student) getEntity(Student.class, context); StudyProgramme studyProgramme = studyProgrammeDAO.findByName((String) fieldValue); if (studyProgramme != null) { DataImportUtils.setFieldValue(student, DataImportUtils.getField(student, "studyProgramme"), studyProgramme); } else { throw new SmvcRuntimeException(PyramusStatusCode.VALIDATION_FAILURE, "StudyProgramme not found with name: " + fieldValue); } } }); // Address subClass = Address.class; instance().registerFieldHandler(entityStrategy, "city", new DefaultFieldHandingStrategy(subClass)); instance().registerFieldHandler(entityStrategy, "country", new DefaultFieldHandingStrategy(subClass)); instance().registerFieldHandler(entityStrategy, "postalCode", new DefaultFieldHandingStrategy(subClass)); instance().registerFieldHandler(entityStrategy, "streetAddress", new DefaultFieldHandingStrategy(subClass)); // Email subClass = Email.class; instance().registerFieldHandler(entityStrategy, "email", new DefaultFieldHandingStrategy(subClass, "address")); // Phone subClass = PhoneNumber.class; instance().registerFieldHandler(entityStrategy, "phoneNumber", new DefaultFieldHandingStrategy(subClass, "number")); // Person subClass = Person.class; instance().registerFieldHandler(entityStrategy, "birthday", new DefaultFieldHandingStrategy(subClass)); instance().registerFieldHandler(entityStrategy, "socialSecurityNumber", new DefaultFieldHandingStrategy(subClass));// new SocialSecurityNumberHandlingStrategy(subClass, true)); instance().registerFieldHandler(entityStrategy, "sex", new DefaultFieldHandingStrategy(subClass)); // Course entityStrategy = EntityImportStrategy.COURSE; subClass = Course.class; instance().registerEntityHandler(entityStrategy, new DefaultEntityHandlingStrategy(Course.class, entityStrategy) { @Override protected void bindEntities(DataImportContext context) { super.bindEntities(context); Date now = new Date(); User user = context.getLoggedUser(); Course course = (Course) context.getEntity(Course.class); course.setCreated(now); course.setLastModified(now); course.setCreator(user); course.setLastModifier(user); Module module = new Module(); module.setName(course.getName()); module.setDescription(course.getDescription()); module.setCreated(course.getCreated()); module.setLastModified(course.getLastModified()); module.setCreator(course.getCreator()); module.setLastModifier(course.getLastModifier()); course.setModule(module); context.addEntity(Module.class, module); } }); instance().registerFieldHandler(entityStrategy, "name", new DefaultFieldHandingStrategy(subClass)); instance().registerFieldHandler(entityStrategy, "description", new DefaultFieldHandingStrategy(subClass)); instance().registerFieldHandler(entityStrategy, "beginDate", new DefaultFieldHandingStrategy(subClass)); instance().registerFieldHandler(entityStrategy, "endDate", new DefaultFieldHandingStrategy(subClass)); // CourseStudent entityStrategy = EntityImportStrategy.COURSESTUDENT; subClass = CourseStudent.class; instance().registerEntityHandler(entityStrategy, new DefaultEntityHandlingStrategy(CourseStudent.class, entityStrategy) { @Override protected void bindEntities(DataImportContext context) { super.bindEntities(context); CourseStudent courseStudent = (CourseStudent) context.getEntity(CourseStudent.class); courseStudent.setEnrolmentTime(new Date()); } }); instance().registerFieldHandler(entityStrategy, "student", new ReferenceFieldHandlingStrategy(subClass, "student", Student.class)); instance().registerFieldHandler(entityStrategy, "course", new ReferenceFieldHandlingStrategy(subClass, "course", Course.class)); } }