diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java index b1ea7aaeef0ce3f55377f7d7763c27b425526d42..1ee2cf14cbceb21ad8f2222dd3373dd17bb05cfd 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java @@ -5,6 +5,7 @@ import unipotsdam.gf.core.database.mysql.VereinfachtesResultSet; import unipotsdam.gf.core.management.group.Group; import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.core.management.project.ProjectConfiguration; +import unipotsdam.gf.core.management.project.ProjectConfigurationDAO; import unipotsdam.gf.core.management.user.User; import unipotsdam.gf.core.management.user.UserInterests; import unipotsdam.gf.core.management.user.UserProfile; @@ -330,6 +331,13 @@ public class ManagementImpl implements Management { @Override public void create(ProjectConfiguration projectConfiguration, Project project) { - // TODO implement + ProjectConfigurationDAO projectConfigurationDAO = new ProjectConfigurationDAO(); + projectConfigurationDAO.persistProjectConfiguration(projectConfiguration,project); + } + + @Override + public ProjectConfiguration getProjectConfiguration(Project project) { + ProjectConfigurationDAO projectConfigurationDAO = new ProjectConfigurationDAO(); + return projectConfigurationDAO.loadProjectConfiguration(project); } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/ProjectConfiguration.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/ProjectConfiguration.java index e7732ac5bfaeb9b8ecf988a34dd4662930998118..cc66f5634f1f05f969fcd423c24ce9134d21a653 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/ProjectConfiguration.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/ProjectConfiguration.java @@ -16,7 +16,8 @@ public class ProjectConfiguration { private HashMap<GroupFormationMechanism, Boolean> groupMechanismSelected; public ProjectConfiguration( - HashMap<ProjectPhase, Boolean> phasesSelected, HashMap<Category, Boolean> criteriaSelected, + HashMap<ProjectPhase, Boolean> phasesSelected, + HashMap<Category, Boolean> criteriaSelected, HashMap<AssessmentMechanism, Boolean> assessmentMechanismSelected, HashMap<GroupFormationMechanism, Boolean> groupMechanismSelected) { this.phasesSelected = phasesSelected; diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/ProjectConfigurationDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/ProjectConfigurationDAO.java new file mode 100644 index 0000000000000000000000000000000000000000..6a9f147857cc89528fa38a08e85c878b8d474cf3 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/ProjectConfigurationDAO.java @@ -0,0 +1,128 @@ +package unipotsdam.gf.core.management.project; + +import unipotsdam.gf.core.database.mysql.MysqlConnect; +import unipotsdam.gf.core.database.mysql.VereinfachtesResultSet; +import unipotsdam.gf.core.management.user.User; +import unipotsdam.gf.core.states.ProjectPhase; +import unipotsdam.gf.modules.assessment.AssessmentMechanism; +import unipotsdam.gf.modules.groupfinding.GroupFormationMechanism; +import unipotsdam.gf.modules.peer2peerfeedback.Category; + +import java.util.ArrayList; +import java.util.HashMap; + +public class ProjectConfigurationDAO { + + /** + * @param projectConfiguration + */ + public void persistProjectConfiguration(ProjectConfiguration projectConfiguration, Project project) { + MysqlConnect connect = new MysqlConnect(); + connect.connect(); + + // persist Criteria + HashMap<Category, Boolean> criteriaSelected = projectConfiguration.getCriteriaSelected(); + for (Category category : criteriaSelected.keySet()) { + Boolean criteriumSelected = criteriaSelected.get(category); + if (criteriumSelected != null && criteriumSelected) { + String projectId = project.getId(); + String categoryName = category.name(); + String mysqlRequest = "insert INTO categoriesSelected (`projectId`,`categorySelected`) VALUES (?,?)"; + connect.issueInsertOrDeleteStatement(mysqlRequest, projectId, categoryName ); + } + } + + // persist Phases + HashMap<ProjectPhase, Boolean> phasesSelected = projectConfiguration.getPhasesSelected(); + for (ProjectPhase phase : phasesSelected.keySet()) { + Boolean projectPhaseSelected = phasesSelected.get(phase); + if (projectPhaseSelected != null && projectPhaseSelected) { + String mysqlRequest = "insert INTO phasesSelected (`projectId`,`phaseSelected`) VALUES (?,?)"; + connect.issueInsertOrDeleteStatement(mysqlRequest, project.getId(), phase.name()); + } + } + + // persist GroupFinding + HashMap<GroupFormationMechanism, Boolean> groupFindingMechanism = + projectConfiguration.getGroupMechanismSelected(); + for (GroupFormationMechanism gfm : groupFindingMechanism.keySet()) { + Boolean groupFindingMechanismSelected = groupFindingMechanism.get(gfm); + if (groupFindingMechanismSelected != null && groupFindingMechanismSelected) { + String mysqlRequest = + "insert INTO groupfindingMechanismSelected (`projectId`,`gfmSelected`) VALUES (?,?)"; + connect.issueInsertOrDeleteStatement(mysqlRequest, project.getId(), gfm.name()); + } + } + + + // persist assessmentMechanismSelected + HashMap<AssessmentMechanism, Boolean> assessmentMechanismsSelected = + projectConfiguration.getAssessmentMechanismSelected(); + for (AssessmentMechanism assessmentMechanism : assessmentMechanismsSelected.keySet()) { + Boolean asmSelected = assessmentMechanismsSelected.get(assessmentMechanism); + if (asmSelected != null && asmSelected) { + String mysqlRequest = + "insert INTO assessmentMechanismSelected (`projectId`,`amSelected`) VALUES (?,?)"; + connect.issueInsertOrDeleteStatement(mysqlRequest, project.getId(), assessmentMechanism.name()); + } + } + connect.close(); + } + + public ProjectConfiguration loadProjectConfiguration(Project project) { + MysqlConnect connect = new MysqlConnect(); + connect.connect(); + + + HashMap<ProjectPhase, Boolean> projectPhasesSelected = + getSelectionFromTable(connect, ProjectPhase.class, project, "phasesSelected"); + + HashMap<Category, Boolean> categorySelected = + getSelectionFromTable(connect, Category.class, project, "categoriesSelected"); + + HashMap<AssessmentMechanism, Boolean> asmSelected = + getSelectionFromTable(connect, AssessmentMechanism.class, project, "assessmentMechanismSelected"); + + + HashMap<GroupFormationMechanism, Boolean> gfmSelected = + getSelectionFromTable(connect, GroupFormationMechanism.class, project, "groupfindingMechanismSelected"); + + connect.close(); + + ProjectConfiguration projectConfiguration = new ProjectConfiguration(projectPhasesSelected, categorySelected, + asmSelected,gfmSelected); + return projectConfiguration; + } + + /** + * this looks like magic but it is just a hack loading all the config tables by taking advantage + * of the fact that they all have two columns with the second being the selected attribute and the first being the + * project id + * + * @param connect + * @param selectionclass + * @param project + * @param table + * @param <T> + * @return + */ + private <T extends Enum<T>> HashMap<T, Boolean> getSelectionFromTable( + MysqlConnect connect, Class<T> selectionclass, Project project, String table) { + // get phasesSelected + String id = project.getId(); + String mysqlRequest = "SELECT * FROM " + table + " where projectId = ?"; + VereinfachtesResultSet vereinfachtesResultSet = connect.issueSelectStatement(mysqlRequest, id); + HashMap<T, Boolean> projectPhaseBoolean = new HashMap<>(); + while (!vereinfachtesResultSet.isLast()) { + Boolean next = vereinfachtesResultSet.next(); + if (next) { + String phaseSelected = vereinfachtesResultSet.getObject(2).toString(); + T phaseSelected1 = Enum.valueOf(selectionclass, phaseSelected); + projectPhaseBoolean.put(phaseSelected1, true); + } else { + break; + } + } + return projectPhaseBoolean; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java index d8894437354dc1e6f4fbbd6d75cebb6d0fde3e8e..b93f0e8c68e66b3d5c2044db66a4e9eb13caee20 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java @@ -1,5 +1,7 @@ package unipotsdam.gf.modules.peer2peerfeedback; +import uk.co.jemos.podam.api.PodamFactory; +import uk.co.jemos.podam.api.PodamFactoryImpl; import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.core.management.user.User; import unipotsdam.gf.interfaces.Feedback; @@ -9,6 +11,13 @@ import java.io.File; import java.util.ArrayList; public class DummyFeedback implements Feedback { + + /** + * Utility to creaty dummy data for students + */ + PodamFactory factory = new PodamFactoryImpl(); + + @Override public Peer2PeerFeedback createPeer2PeerFeedbackmask( User feedbackuser, User selectedstudent, File document) { @@ -46,4 +55,9 @@ public class DummyFeedback implements Feedback { public void assignFeedbackTasks() { } + + @Override + public ResearchReport getFeedbackTask(User student) { + return factory.manufacturePojo(ResearchReport.class); + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportManagement.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportManagement.java index 712378eddbc2718b04fe597a1caf86c59e45ef31..1f1ece9f5505f20a499f57a860595d1b985a75ca 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportManagement.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportManagement.java @@ -1,13 +1,15 @@ package unipotsdam.gf.modules.researchreport; import sun.reflect.generics.reflectiveObjects.NotImplementedException; +import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.core.management.user.User; import java.io.File; public class DummyResearchReportManagement implements ResearchReportManagement { @Override - public String createResearchReport(ResearchReport researchReport, User student) { + public String createResearchReport( + ResearchReport researchReport, Project project, User student) { throw new NotImplementedException(); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/ResearchReportManagement.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/ResearchReportManagement.java index 8283acc4482d7bfe8cba0ba63a1bc7742be28e17..65505044a340115087c3bf197dff78e8312bf4dc 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/ResearchReportManagement.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/ResearchReportManagement.java @@ -1,5 +1,6 @@ package unipotsdam.gf.modules.researchreport; +import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.core.management.user.User; import java.io.File; @@ -15,10 +16,12 @@ public interface ResearchReportManagement { * Create a File * * @param researchReport Name of the Report + * @param project * @param student * @return Returns the reportId */ - String createResearchReport(ResearchReport researchReport, User student); + String createResearchReport( + ResearchReport researchReport, Project project, User student); /** diff --git a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql index 71f44c061c7cadc62ba178d87d521a212fb08808..99abfe1144640d485347d68b4ba1b5624b41d1bb 100644 --- a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql +++ b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql @@ -12,9 +12,10 @@ CREATE TABLE if not exists `projects` ( `password` varchar(400) NOT NULL, - `active` tinyint(1) NOT NULL, + `active` tinyint(1) NOT NULL, - `timecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `timecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP + ON UPDATE CURRENT_TIMESTAMP, `author` varchar(400) NOT NULL, @@ -106,25 +107,29 @@ CREATE TABLE if not exists projectuser ENGINE = InnoDB - DEFAULT CHARSET = utf8;CREATE TABLE if not exists `annotations` ( + DEFAULT CHARSET = utf8; +CREATE TABLE if not exists `annotations` ( - `id` varchar(120) NOT NULL, + `id` varchar(120) NOT NULL, - `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP + ON UPDATE CURRENT_TIMESTAMP, - `userId` int(11) DEFAULT NULL, + `userId` int(11) DEFAULT NULL, - `targetId` int(11) DEFAULT NULL, + `targetId` int(11) DEFAULT NULL, - `body` varchar(280) DEFAULT NULL, + `body` varchar(280) DEFAULT NULL, - `startCharacter` int(11) DEFAULT NULL, + `startCharacter` int(11) DEFAULT NULL, - `endCharacter` int(11) DEFAULT NULL, + `endCharacter` int(11) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) + ENGINE = InnoDB + DEFAULT CHARSET = utf8; alter table users @@ -134,17 +139,17 @@ CREATE TABLE if not exists quiz ( - author varchar(400) NOT NULL, + author varchar(400) NOT NULL, projectId varchar(400) NOT NULL, - question varchar(400) NOT NULL, + question varchar(400) NOT NULL, - mcType varchar(400) NOT NULL, + mcType varchar(400) NOT NULL, - answer varchar(400) NOT NULL, + answer varchar(400) NOT NULL, - correct tinyint(1) NOT NULL + correct tinyint(1) NOT NULL ) @@ -156,17 +161,49 @@ CREATE TABLE if not exists tasks ( - userId varchar(400) NOT NULL, + userId varchar(400) NOT NULL, projectId varchar(400) NOT NULL, - taskUrl varchar (400) NOT NULL + taskUrl varchar(400) NOT NULL ) ENGINE = InnoDB DEFAULT CHARSET = utf8; -ALTER TABLE `projectuser` ADD INDEX( `projectId`, `userId`); -ALTER TABLE `projectuser` ADD UNIQUE( `projectId`, `userId`); -ALTER TABLE `projects` ADD UNIQUE( `id`); \ No newline at end of file + +CREATE TABLE if not exists phasesSelected ( + `projectId` varchar(100) NOT NULL, + phaseSelected varchar(200) NOT NULL +) + ENGINE = InnoDB + DEFAULT CHARSET = utf8; + +CREATE TABLE if not exists categoriesSelected ( + `projectId` varchar(100) NOT NULL, + categorySelected varchar(200) NOT NULL +) + ENGINE = InnoDB + DEFAULT CHARSET = utf8; + +CREATE TABLE if not exists groupfindingMechanismSelected ( + `projectId` varchar(100) NOT NULL, + gfmSelected varchar(200) NOT NULL +) + ENGINE = InnoDB + DEFAULT CHARSET = utf8; + +CREATE TABLE if not exists assessmentMechanismSelected ( + `projectId` varchar(100) NOT NULL, + amSelected varchar(200) NOT NULL +) + ENGINE = InnoDB + DEFAULT CHARSET = utf8; + +ALTER TABLE `projectuser` + ADD INDEX (`projectId`, `userId`); +ALTER TABLE `projectuser` + ADD UNIQUE (`projectId`, `userId`); +ALTER TABLE `projects` + ADD UNIQUE (`id`); \ No newline at end of file diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java index 6cd64c4818575deac1faeb9699c524c9317ffb32..c7836b4195300289c45b09c62b68880946409181 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java @@ -26,6 +26,7 @@ import unipotsdam.gf.modules.researchreport.ResearchReportManagement; import javax.inject.Inject; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -123,7 +124,7 @@ public class ActivityFlowTest { for (User student : students) { // persist dossiers ResearchReport researchReport = factory.manufacturePojo(ResearchReport.class); - researchReportManagement.createResearchReport(researchReport, student); + researchReportManagement.createResearchReport(researchReport, project, student); } // assert that after the last report has been submitted, the feedback tasks were assigned automatically @@ -144,12 +145,30 @@ public class ActivityFlowTest { } // students upload updated dossier + ArrayList<User> students2 = students; + Iterator<User> students2Iterator = students2.iterator(); + students2Iterator.remove(); + students2Iterator.remove(); + while (students2Iterator.hasNext()) { + User student = students2Iterator.next(); + // persist dossiers (versioning) + ResearchReport researchReport = factory.manufacturePojo(ResearchReport.class); + researchReportManagement.createResearchReport(researchReport, project, student); + } // docent finishes phase + phases.endPhase(ProjectPhase.DossierFeedback, project); // student misses feedback -> reassignment + // assert that while reports are still missing feedback tasks are reassigned + verify(feedback, times(1)).assigningMissingFeedbackTasks(project); + + // assert that everybody has given and received feedback + assert feedback.checkFeedbackConstraints(project); + + // docent finishes phase + phases.endPhase(ProjectPhase.DossierFeedback, project); - // feedback restarted } diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java index 22b2822668e4214c1b239bf46c615c10be793cf2..9fbce54234111c240d671b9fb5e6ea7443201dda 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java @@ -8,17 +8,19 @@ import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; import org.junit.Before; import org.junit.Test; +import uk.co.jemos.podam.api.PodamFactory; +import uk.co.jemos.podam.api.PodamFactoryImpl; import unipotsdam.gf.config.GFApplicationBinder; import unipotsdam.gf.config.GFResourceConfig; import unipotsdam.gf.core.management.ManagementImpl; import unipotsdam.gf.core.management.project.Project; +import unipotsdam.gf.core.management.project.ProjectConfiguration; import unipotsdam.gf.core.management.user.User; import unipotsdam.gf.core.management.user.UserProfile; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; /** * Created by dehne on 01.06.2018. @@ -28,6 +30,11 @@ import static org.junit.Assert.assertTrue; public class ManagementTest { + /** + * Utility to creaty dummy data for students + */ + PodamFactory factory = new PodamFactoryImpl(); + @Test public void testDelete() { @@ -114,4 +121,20 @@ public class ManagementTest { assert !users.isEmpty(); } + + @Test + public void testProjectConfiguration() { + ProjectConfiguration projectConfiguration = factory.manufacturePojo(ProjectConfiguration.class); + Project project = factory.manufacturePojo(Project.class); + + ManagementImpl management = new ManagementImpl(); + management.create(projectConfiguration, project); + + ProjectConfiguration projectConfiguration1 = management.getProjectConfiguration(project); + assertNotNull(projectConfiguration1.getCriteriaSelected()); + assertNotNull(projectConfiguration1.getAssessmentMechanismSelected()); + assertNotNull(projectConfiguration1.getGroupMechanismSelected()); + assertNotNull(projectConfiguration1.getPhasesSelected()); + + } } \ No newline at end of file