diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java index 90f40f37048d031e694e86033a8a717efa7a09ea..4590125022ff3ba67b1a59bfb83fbaefe4cc5b0a 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java @@ -56,7 +56,7 @@ import unipotsdam.gf.process.SurveyProcess; import unipotsdam.gf.process.constraints.ConstraintsImpl; import unipotsdam.gf.process.phases.PhasesImpl; import unipotsdam.gf.process.tasks.TaskDAO; -import unipotsdam.gf.process.tasks.TaskMapping; +import unipotsdam.gf.process.tasks.TaskMapper; import unipotsdam.gf.session.GFContext; import unipotsdam.gf.session.GFContexts; @@ -117,7 +117,7 @@ public class GFApplicationBinder extends AbstractBinder { bind(FileManagementDAO.class).to(FileManagementDAO.class); bind(AssessmentDAO.class).to(AssessmentDAO.class); bind(ReflexionProcess.class).to(ReflexionProcess.class); - bind(TaskMapping.class).to(TaskMapping.class); + bind(TaskMapper.class).to(TaskMapper.class); /* * TODO: @Martin comment in for your development diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/controller/AnnotationController.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/controller/AnnotationController.java index 432d5c0e4d343e351fbf75e1f2a20f9ae43b9e9c..909bff040f98c47250209902a16a8986eb11a5dd 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/controller/AnnotationController.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/controller/AnnotationController.java @@ -108,10 +108,10 @@ public class AnnotationController implements IAnnotation { "AND gu.groupId=? WHERE projectname = ? AND finalized=1;"; VereinfachtesResultSet rs = connection.issueSelectStatement(request, groupId, project.getName()); - if (rs.next()) { + if (rs!= null && rs.next()) { return rs.getString("text"); }else{ - return null; + return "random shit"; } } @@ -202,6 +202,15 @@ public class AnnotationController implements IAnnotation { AnnotationBody body = new AnnotationBody(title, comment, startCharacter, endCharacter); return new Annotation(id, timestamp, userEmail, targetId, targetCategory, body); + } + public void setAnnotationCategories(Project project) { + connection.connect(); + for (String category : project.getCategories()) { + String query = "INSERT INTO `categoriesselected`(`projectName`, `categorySelected`) VALUES (?,?)"; + connection.issueUpdateStatement( + query, project.getName(), category); + } + connection.close(); } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/controller/FeedbackImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/controller/FeedbackImpl.java index cd66cf4ce3bc73a9ed2f1fe1321d3aa3af34d4c4..46deed75c7ea3dc4d89fdec15b252fdfa6ea0b2c 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/controller/FeedbackImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/controller/FeedbackImpl.java @@ -8,7 +8,7 @@ import unipotsdam.gf.modules.user.User; import unipotsdam.gf.mysql.MysqlConnect; import unipotsdam.gf.mysql.VereinfachtesResultSet; import unipotsdam.gf.process.tasks.Task; -import unipotsdam.gf.process.tasks.TaskMapping; +import unipotsdam.gf.process.tasks.TaskMapper; import javax.inject.Inject; import java.util.List; @@ -22,7 +22,7 @@ public class FeedbackImpl implements Feedback { GroupDAO groupDAO; @Inject - TaskMapping taskMapping; + TaskMapper taskMapper; @Override public void assigningMissingFeedbackTasks(Project project) { @@ -32,7 +32,7 @@ public class FeedbackImpl implements Feedback { @Override public void specifyFeedbackTasks(List<Task> tasks) { for (Task task : tasks) { - List<Integer> groupToFeedback = taskMapping.groupToFeedback(tasks, task, 1); + List<Integer> groupToFeedback = taskMapper.groupToFeedback(tasks, task, 1); for (Integer groupId : groupToFeedback) { connection.connect(); String request = "UPDATE `fullsubmissions` SET `feedbackGroup`=? WHERE groupId=? AND projectName=?"; diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/model/AnnotationResponse.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/model/AnnotationResponse.java index 045986bdf8fbd7ccb6a4dadbe1142ade3c3ff9ae..f1b2660573e431fa050795b8c524de15578d5f69 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/model/AnnotationResponse.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/annotation/model/AnnotationResponse.java @@ -7,7 +7,7 @@ package unipotsdam.gf.modules.annotation.model; public class AnnotationResponse { // variables - String message; + private String message; // constructors public AnnotationResponse(String message) { diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/AssessmentDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/AssessmentDAO.java index f9c54a71c9d211abd1bbde739819b4c347690061..b933dd80f92c37e2fe2411532079c1b0b8722316 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/AssessmentDAO.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/AssessmentDAO.java @@ -1,11 +1,19 @@ package unipotsdam.gf.modules.assessment; -import uk.co.jemos.podam.api.PodamFactory; import uk.co.jemos.podam.api.PodamFactoryImpl; +import unipotsdam.gf.modules.fileManagement.FileRole; +import unipotsdam.gf.modules.group.Group; +import unipotsdam.gf.modules.group.GroupDAO; +import unipotsdam.gf.modules.project.Project; +import unipotsdam.gf.modules.user.User; import unipotsdam.gf.modules.user.UserDAO; import unipotsdam.gf.mysql.MysqlConnect; +import unipotsdam.gf.mysql.VereinfachtesResultSet; +import unipotsdam.gf.process.tasks.TaskMapping; +import unipotsdam.gf.process.tasks.TaskName; import javax.inject.Inject; +import java.util.List; public class AssessmentDAO { @@ -14,12 +22,108 @@ public class AssessmentDAO { @Inject private MysqlConnect connect; + @Inject + private GroupDAO groupDAO; + @Inject private UserDAO userDAO; - public AssessmentProgress getProgress() { - AssessmentProgress assessmentProgress = podamFactory.manufacturePojo(AssessmentProgress.class); - //assessmentProgress.setNumberOfGroupsWithoutPresentation(3); - return assessmentProgress; + /** + * get the progress for the docent so he can assess if he wants to proceed to grading + * + * @param project + * @return + */ + public AssessmentProgress getProgress(Project project) { + AssessmentProgress assessmentProgress = new AssessmentProgress(); + //assessmentProgress.setNumberOfGroupsWithoutPresentation(3); + + int numberOfGroups = groupDAO.getGroupsByProjectName(project.getName()).size(); + + // get number of submitted Presentation Files + String fileRole = FileRole.PRESENTATION.name(); + int presentationCount = getNumberOfSubmittedFiles(project, fileRole); + assessmentProgress.setNumberOfGroupsWithoutPresentation(numberOfGroups - presentationCount); + + // get number of submitted final reports + String fileRole2 = FileRole.FINAL_REPORT.name(); + int reportCount = getNumberOfSubmittedFiles(project, fileRole2); + assessmentProgress.setNumberOfGroupReportsMissing(numberOfGroups - reportCount); + + // + assessmentProgress.setNumberOfGroupsWithoutExternalAssessment(numberOfGroups); + // Todo IMPLEMENT + + assessmentProgress + .setNumberOfStudentsWithoutInternalAsssessment(userDAO.getUsersByProjectName(project.getName()).size()); + // TODO IMPLEMENT + + return assessmentProgress; } + + public int getNumberOfSubmittedFiles(Project project, String fileRole) { + int presentationCount; + connect.connect(); + String query = "SELECT COUNT(*) from largefilestorage where projectName = ? and fileRole = '" + fileRole + "'"; + VereinfachtesResultSet vereinfachtesResultSet = connect.issueSelectStatement(query, project.getName()); + if (vereinfachtesResultSet == null) { + return 0; + } + vereinfachtesResultSet.next(); + presentationCount = vereinfachtesResultSet.getInt("COUNT(*)"); + connect.close(); + return presentationCount; + } + + /** + * TODO implement + * + * @param mappedTask + */ + public void persistMapping(TaskMapping mappedTask) { + + connect.connect(); + String query = + "INSERT INTO mappedtasks (subjectEmail, groupObjectId, objectEmail, taskname, projectName) " + + "values (?,?,?,?,?)"; + + Object groupValue = null; + if (mappedTask.getObjectGroup() != null) { + groupValue = mappedTask.getObjectGroup().getId(); + } + String objectUser = null; + if (mappedTask.getObjectUser() != null) { + objectUser = mappedTask.getObjectUser().getEmail(); + } + + connect.issueInsertOrDeleteStatement(query, mappedTask.getSubject().getEmail(), groupValue, objectUser, + mappedTask.getTaskName().name(), mappedTask.getProject().getName()); + + connect.close(); + } + + public TaskMapping getTargetGroupForAssessment(User subject) { + TaskMapping result; + connect.connect(); + + String query = "SELECT * from mappedtasks where subjectEmail = ? and taskname = ?"; + VereinfachtesResultSet vereinfachtesResultSet = + connect.issueSelectStatement(query, subject.getEmail(), TaskName.GIVE_EXTERNAL_ASSESSMENT.name()); + if (vereinfachtesResultSet != null) { + boolean next = vereinfachtesResultSet.next(); + int groupObjectId = vereinfachtesResultSet.getInt("groupObjectId"); + String subjectEmail = vereinfachtesResultSet.getString("subjectEmail"); + String objectEmail = vereinfachtesResultSet.getString("objectEmail"); + String taskName = vereinfachtesResultSet.getString("taskname"); + String projectName = vereinfachtesResultSet.getString("projectName"); + result = new TaskMapping(new User(subjectEmail), new Group(groupObjectId), new User(objectEmail), + TaskName.valueOf(taskName), new Project(projectName)); + } else { + return null; + } + connect.close(); + return result; + } + + } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/AssessmentProgress.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/AssessmentProgress.java index 564ee3ffc7acf1165beb8ff46f76a3bf3db9f448..2a1cc184889a27ec3413a1dcae057f4cb4a15424 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/AssessmentProgress.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/AssessmentProgress.java @@ -7,7 +7,7 @@ public class AssessmentProgress { private int numberOfGroups; private int numberOfGroupPresentions; - private int numberOfGroupReports; + private int numberOfGroupReportsMissing; private int numberOfGroupsWithoutExternalAssessment; private int numberOfStudentsWithoutInternalAsssessment; private int numberOfGroupsWithoutPresentation; @@ -18,7 +18,7 @@ public class AssessmentProgress { int numberOfGroupsWithoutExternalAssessment, int numberOfStudentsWithoutInternalAsssessment) { this.numberOfGroups = numberOfGroups; this.numberOfGroupPresentions = numberOfGroupPresentions; - this.numberOfGroupReports = numberOfGroupReports; + this.numberOfGroupReportsMissing = numberOfGroupReports; this.numberOfGroupsWithoutExternalAssessment = numberOfGroupsWithoutExternalAssessment; this.numberOfStudentsWithoutInternalAsssessment = numberOfStudentsWithoutInternalAsssessment; } @@ -39,12 +39,12 @@ public class AssessmentProgress { this.numberOfGroupPresentions = numberOfGroupPresentions; } - public int getNumberOfGroupReports() { - return numberOfGroupReports; + public int getNumberOfGroupReportsMissing() { + return numberOfGroupReportsMissing; } - public void setNumberOfGroupReports(int numberOfGroupReports) { - this.numberOfGroupReports = numberOfGroupReports; + public void setNumberOfGroupReportsMissing(int numberOfGroupReportsMissing) { + this.numberOfGroupReportsMissing = numberOfGroupReportsMissing; } public int getNumberOfGroupsWithoutExternalAssessment() { diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/AssessmentView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/AssessmentView.java new file mode 100644 index 0000000000000000000000000000000000000000..7087347c8651e5cce601a64cf551bed8c47bccf8 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/AssessmentView.java @@ -0,0 +1,22 @@ +package unipotsdam.gf.modules.assessment; + +import unipotsdam.gf.modules.project.Project; +import unipotsdam.gf.process.PeerAssessmentProcess; + +import javax.inject.Inject; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +@Path("/assessment") +public class AssessmentView { + + @Inject + private PeerAssessmentProcess peerAssessmentProcess; + + @POST + @Path("/grading/start/projects/{projectName}") + public void startGrading(@PathParam("projectName") String projectName){ + peerAssessmentProcess.startGrading(new Project(projectName)); + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java index 6bb2fae971ef699f5c6f22ca0b5518fa41154562..68cb6302f6aa5c58407ccb5c3eb754af1ff632d0 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java @@ -17,7 +17,7 @@ import unipotsdam.gf.modules.project.Management; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.modules.user.User; import unipotsdam.gf.process.constraints.ConstraintsMessages; -import unipotsdam.gf.process.tasks.TaskMapping; +import unipotsdam.gf.process.tasks.TaskMapper; import javax.inject.Inject; import java.util.*; @@ -34,7 +34,7 @@ public class PeerAssessment implements IPeerAssessment { private GroupDAO groupDAO; @Inject - private TaskMapping taskMapping; + private TaskMapper taskMapper; @Inject private AnnotationController annotationController; @@ -124,7 +124,7 @@ public class PeerAssessment implements IPeerAssessment { if (answers == null) { return "quiz"; } - Integer groupToRate = taskMapping.getWhichGroupToRate(project, user); + Integer groupToRate = taskMapper.getWhichGroupToRate(project, user); if (!assessmentDBCommunication.getContributionRating(groupToRate, user.getEmail())) { return "contributionRating"; } @@ -354,7 +354,7 @@ public class PeerAssessment implements IPeerAssessment { @Override public Integer whichGroupToRate(Project project, User user) { - return taskMapping.getWhichGroupToRate(project, user); + return taskMapper.getWhichGroupToRate(project, user); } @Override diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java index b217d775ef68c2301da5265e655445e2a1bf8342..9099f8b40812a48fa6bca6853c331979f204f669 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java @@ -17,6 +17,10 @@ public class Group { members = new ArrayList<>(); } + public Group(int id) { + this.id = id; + members = new ArrayList<>(); + } public String getProjectName() { return projectName; diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java index 5e62cddd398b09900c113573f026c2b3e2d420a2..e9dfc5ab1622bd1ffe646f0210b31fd809ad38b7 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java @@ -734,8 +734,12 @@ public class SubmissionController implements ISubmission, HasProgress { } public GroupFeedbackTaskData getMyFeedback(User user, Project project) { - connection.connect(); Integer groupId = groupDAO.getGroupByStudent(project, user); + return getMyFeedback(groupId, project); + } + + public GroupFeedbackTaskData getMyFeedback(Integer groupId, Project project) { + connection.connect(); String query = "SELECT * from fullsubmissions where groupId = ? and projectName = ?"; VereinfachtesResultSet vereinfachtesResultSet = connection.issueSelectStatement(query, groupId, project.getName()); @@ -877,4 +881,18 @@ public class SubmissionController implements ISubmission, HasProgress { connection.close(); return feedbackedGroup; } + + public List<String> getAnnotationCategories(Project project) { + List<String> result = new ArrayList<>(); + connection.connect(); + String query = "select * from categoriesselected where projectName = ?"; + VereinfachtesResultSet vereinfachtesResultSet = connection.issueSelectStatement(query, + project.getName()); + while (vereinfachtesResultSet.next()) { + + result.add(vereinfachtesResultSet.getString("categorySelected")); + } + connection.close(); + return result; + } } \ No newline at end of file diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java index 3776f2a5899ac50ac4f36b7ed8cb8e61b15f3c82..28ca82334a08caaf2368370af15dd8f164ea9fb8 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java @@ -230,8 +230,11 @@ public class SubmissionService { @GET @Path("categories/project/{projectName}") public List<String> getAnnotationCategories(@PathParam("projectName") String projectName) { - //todo: for every project categories should be selectable - return Categories.standardAnnotationCategories; + List<String> result = submissionController.getAnnotationCategories(new Project(projectName)); + if (result.size() == 0) { + return Categories.standardAnnotationCategories; + } + return result; } @GET diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/PeerAssessmentProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/PeerAssessmentProcess.java index 63309a2640484dca937aff5cc7b50f1ea6b9ee59..987ea9eb7379d614a1fafbe5478ab9604ae75f9b 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/PeerAssessmentProcess.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/PeerAssessmentProcess.java @@ -10,6 +10,8 @@ import unipotsdam.gf.process.tasks.*; import javax.inject.Inject; +import java.util.List; + import static unipotsdam.gf.process.tasks.TaskName.UPLOAD_PRESENTATION; public class PeerAssessmentProcess { @@ -23,6 +25,9 @@ public class PeerAssessmentProcess { @Inject private GroupDAO groupDAO; + @Inject + private TaskMapper taskMapper; + /** * this function is only used to show the peer assessment phase before previous phases are ready * @@ -33,7 +38,6 @@ public class PeerAssessmentProcess { taskDAO.persistTaskForAllGroups(project, UPLOAD_PRESENTATION, Phase.Assessment); // distribute teacher tasks taskDAO.persistTeacherTask(project, TaskName.WAIT_FOR_UPLOAD, Phase.Assessment); - } public void fileHasBeenUploaded( @@ -67,12 +71,30 @@ public class PeerAssessmentProcess { new GroupTask(TaskName.UPLOAD_FINAL_REPORT, groupByStudent, Progress.FINISHED, project)); // set new tasks - // check if all the groups have finished uploads and stuff TODO - // set assessment tasks for group - taskDAO.persistTaskForAllGroups(project, TaskName.GIVE_ASSESSMENT, Phase.Assessment); + } + + /** + * + * @param project + */ + public void startGrading(Project project) { + // TODO implement + //System.out.println("grading tihs project now:" + project); + + // set assessment tasks for students + taskDAO.persistMemberTask(project, TaskName.GIVE_EXTERNAL_ASSESSMENT, Phase.Assessment); + taskDAO.persistMemberTask(project, TaskName.GIVE_INTERNAL_ASSESSMENT, Phase.Assessment); + // set assessment tasks for docent TODO + // set assessment tasks for students + List<User> usersByProjectName = userDAO.getUsersByProjectName(project.getName()); + for (User user : usersByProjectName) { + taskMapper.persistTaskMapping(project, user, TaskName.GIVE_EXTERNAL_ASSESSMENT); + } + + // set final grading tasks } /** diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java index c1642728fd4dc2eaba95239f5a4fc41aeb9f1742..949b7440117693f0723b39ab1ed9e7d83bf35ac6 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java @@ -5,6 +5,7 @@ import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; import unipotsdam.gf.exceptions.UserExistsInMysqlException; import unipotsdam.gf.exceptions.UserExistsInRocketChatException; import unipotsdam.gf.interfaces.ICommunication; +import unipotsdam.gf.modules.annotation.controller.AnnotationController; import unipotsdam.gf.modules.communication.model.RocketChatUser; import unipotsdam.gf.modules.group.GroupDAO; import unipotsdam.gf.modules.group.preferences.database.ProfileDAO; @@ -46,6 +47,9 @@ public class ProjectCreationProcess { @Inject private GFContexts gfContexts; + @Inject + private AnnotationController annotationController; + /** * STEP 1 * @@ -60,6 +64,7 @@ public class ProjectCreationProcess { } catch (Exception e) { throw new WebApplicationException("Project already exists"); } + annotationController.setAnnotationCategories(project); profileDAO.createNewSurveyProject(project); taskDao.createTaskWaitForParticipants(project, author); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java index b68d35f7d7359e53ad32319baa6f891d409fa628..338dec6b26728a5590cb8da29154c06934048bfd 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java @@ -149,7 +149,15 @@ public class TaskDAO { return groupsTask; } - public Task createUserDefault(Project project, User target, TaskName taskName, Phase phase) { + /** + * TODO refactor reduce overloading by introducing + * @param project + * @param target + * @param taskName + * @param phase + * @return + */ + private Task createUserDefault(Project project, User target, TaskName taskName, Phase phase) { return createUserDefault(project, target, taskName, phase, Importance.MEDIUM); } @@ -157,11 +165,12 @@ public class TaskDAO { return createUserDefault(project, target, taskName, phase, Importance.MEDIUM, progress); } - public Task createUserDefault(Project project, User target, TaskName taskName, Phase phase, Importance importance) { + private Task createUserDefault(Project project, User target, TaskName taskName, Phase phase, Importance importance) { return createUserDefault(project, target, taskName, phase, importance, Progress.JUSTSTARTED); } - public Task createUserDefault(Project project, User target, TaskName taskName, Phase phase, Importance importance, Progress progress) { + private Task createUserDefault( + Project project, User target, TaskName taskName, Phase phase, Importance importance, Progress progress) { Task task = new Task(); task.setTaskName(taskName); task.setEventCreated(System.currentTimeMillis()); @@ -303,7 +312,10 @@ public class TaskDAO { } case REEDIT_DOSSIER: { result = getGeneralTask(vereinfachtesResultSet); - + GroupFeedbackTaskData groupFeedbackTaskData = submissionController.getMyFeedback(groupId, project); + if (groupFeedbackTaskData == null) { + break; + } Map<String, String> taskData = new HashMap<>(); taskData.put("fullSubmissionId", submissionController.getFullSubmissionId(groupId, project, FileRole.DOSSIER, 1)); result.setTaskData(taskData); @@ -357,7 +369,13 @@ public class TaskDAO { Task task = getGeneralTask(vereinfachtesResultSet); task.setHasRenderModel(true); // get Progress from peer assessment - task.setTaskData(assessmentDAO.getProgress()); + task.setTaskData(assessmentDAO.getProgress(new Project(task.getProjectName()))); + result = task; + break; + } + case GIVE_EXTERNAL_ASSESSMENT: { + Task task = getGeneralTask(vereinfachtesResultSet); + task.setTaskData(assessmentDAO.getTargetGroupForAssessment(new User(task.getUserEmail()))); result = task; break; } @@ -430,14 +448,13 @@ public class TaskDAO { persist(task); } - public Task createWaitingForGroupFormationTask(Project project, User target) { + public void createWaitingForGroupFormationTask(Project project, User target) { Task task = createUserDefault(project, target, WAITING_FOR_GROUP, Phase.GroupFormation); task.setTaskType(TaskType.INFO); task.setImportance(Importance.MEDIUM); task.setProgress(Progress.JUSTSTARTED); persist(task); - return task; } public void updateForUser(Task task) { diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskMapper.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..c97b4df5c3570c5600cfba3cdf6a0e886d8b551b --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskMapper.java @@ -0,0 +1,103 @@ +package unipotsdam.gf.process.tasks; + +import unipotsdam.gf.modules.assessment.AssessmentDAO; +import unipotsdam.gf.modules.group.Group; +import unipotsdam.gf.modules.project.Project; +import unipotsdam.gf.modules.user.User; +import unipotsdam.gf.mysql.MysqlConnect; +import unipotsdam.gf.mysql.VereinfachtesResultSet; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; + +public class TaskMapper { + + @Inject + private MysqlConnect connect; + + @Inject + private AssessmentDAO assessmentDAO; + + /** + * + * @param tasks + * @param task + * @param howMany + * @return + */ + public List<Integer> groupToFeedback(List<Task> tasks, Task task, int howMany) { + List<Integer> result = new ArrayList<>(); + int position = tasks.indexOf(task); + for (int i = 1; i <= howMany; i++) { + result.add(tasks.get((i + position) % tasks.size()).getGroupTask()); //modulo builds a circle in users + } + return result; + } + + /** + * WARNING. CALLING THIS METHOD SEQUENTIALLY + * ASSUMES THAT SQL WILL ALWAYS RETURN THE DATA IN THE SAME ORDER + * THIS IS NOT DEFINED FOR A STREAM + * @param project + * @param user + * @return the id of the group that is rated + */ + @Deprecated + public Integer getWhichGroupToRate(Project project, User user) { + Integer result; + List<Integer> groups = new ArrayList<>(); + Integer groupId = buildGroupIndexes(project, user, groups); + // every user gets the next group in the cycle + if (groups.indexOf(groupId) + 1 == groups.size()) { + result = groups.get(0); + } else { + result = groups.get(groups.indexOf(groupId) + 1); + } + return result; + } + + /** + * returns the groupId the user is in and a list of groupIds of the project is filled + * @param project + * @param user + * @param groups + * @return + */ + private Integer buildGroupIndexes(Project project, User user, List<Integer> groups) { + connect.connect(); + String mysqlRequest1 = "SELECT groupId FROM `groupuser` gu JOIN groups g on " + + "gu.groupid=g.id AND g.projectName=? WHERE `userEmail`=?"; + VereinfachtesResultSet vereinfachtesResultSet1 = + connect.issueSelectStatement(mysqlRequest1, project.getName(), user.getEmail()); + vereinfachtesResultSet1.next(); + Integer groupId = vereinfachtesResultSet1.getInt("groupId"); + + String mysqlRequest2 = "SELECT DISTINCT id FROM `groups` WHERE `projectName`=? ORDER BY id ASC"; + VereinfachtesResultSet vereinfachtesResultSet2 = + connect.issueSelectStatement(mysqlRequest2, project.getName()); + boolean next = vereinfachtesResultSet2.next(); + while (next) { + groups.add(vereinfachtesResultSet2.getInt("id")); + next = vereinfachtesResultSet2.next(); + } + connect.close(); + return groupId; + } + + public void persistTaskMapping(Project project, User user, TaskName taskName) { + Integer groupResult; + List<Integer> groups = new ArrayList<>(); + Integer groupId = buildGroupIndexes(project, user, groups); + // every user gets the next group in the cycle + if (groups.indexOf(groupId) + 1 == groups.size()) { + groupResult = groups.get(0); + } else { + groupResult = groups.get(groups.indexOf(groupId) + 1); + } + Group group = new Group(project.getName()); + group.setId(groupResult); + + assessmentDAO.persistMapping(new TaskMapping(user, group, null, taskName, project)); + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskMapping.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskMapping.java index 4f319786beba24b787b90f15e05a3de6f5bced09..01ec28690d6b4222174050b25cfee34055faaab3 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskMapping.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskMapping.java @@ -1,53 +1,63 @@ package unipotsdam.gf.process.tasks; +import unipotsdam.gf.modules.group.Group; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.modules.user.User; -import unipotsdam.gf.mysql.MysqlConnect; -import unipotsdam.gf.mysql.VereinfachtesResultSet; - -import javax.inject.Inject; -import java.util.ArrayList; -import java.util.List; public class TaskMapping { + private User subject; + // object is either a group or a user + private Group objectGroup; + private User objectUser; + private TaskName taskName; + private Project project; + + public TaskMapping( + User subject, Group objectGroup, User objectUser, TaskName taskName, Project project) { + this.subject = subject; + this.objectGroup = objectGroup; + this.objectUser = objectUser; + this.taskName = taskName; + this.project = project; + } + + public User getSubject() { + return subject; + } + + public void setSubject(User subject) { + this.subject = subject; + } + + public Group getObjectGroup() { + return objectGroup; + } + + public void setObjectGroup(Group objectGroup) { + this.objectGroup = objectGroup; + } + + public User getObjectUser() { + return objectUser; + } + + public void setObjectUser(User objectUser) { + this.objectUser = objectUser; + } + + public TaskName getTaskName() { + return taskName; + } + + public void setTaskName(TaskName taskName) { + this.taskName = taskName; + } + + public Project getProject() { + return project; + } - @Inject - private MysqlConnect connect; - - public List<Integer> groupToFeedback(List<Task> tasks, Task task, int howMany) { - List<Integer> result = new ArrayList<>(); - int position = tasks.indexOf(task); - for (int i = 1; i <= howMany; i++) { - result.add(tasks.get((i + position) % tasks.size()).getGroupTask()); //modulo builds a circle in users - } - return result; - } - - public Integer getWhichGroupToRate(Project project, User user) { - Integer result; - List<Integer> groups = new ArrayList<>(); - connect.connect(); - String mysqlRequest1 = "SELECT groupId FROM `groupuser` gu JOIN groups g on " + - "gu.groupid=g.id AND g.projectName=? WHERE `userEmail`=?"; - VereinfachtesResultSet vereinfachtesResultSet1 = - connect.issueSelectStatement(mysqlRequest1, project.getName(), user.getEmail()); - vereinfachtesResultSet1.next(); - Integer groupId = vereinfachtesResultSet1.getInt("groupId"); - - String mysqlRequest2 = "SELECT DISTINCT id FROM `groups` WHERE `projectName`=? "; - VereinfachtesResultSet vereinfachtesResultSet2 = - connect.issueSelectStatement(mysqlRequest2, project.getName()); - boolean next = vereinfachtesResultSet2.next(); - while (next) { - groups.add(vereinfachtesResultSet2.getInt("id")); - next = vereinfachtesResultSet2.next(); - } - if (groups.indexOf(groupId) + 1 == groups.size()) { - result = groups.get(0); - } else { - result = groups.get(groups.indexOf(groupId) + 1); - } - connect.close(); - return result; + public void setProject(Project project) { + this.project = project; } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java index b69a718d69566fe619d375e3a04fb32823a7a045..4c3c984bcb23bd0fd90884bffbdeca5e0fe3209c 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java @@ -20,14 +20,33 @@ public enum TaskName { OPTIONAL_PORTFOLIO_ENTRY, REFLECT_DOSSIER_CREATION, ANSWER_REFLEXION_QUESTIONS, // assessment tasks - UPLOAD_PRESENTATION, UPLOAD_FINAL_REPORT, + + // students have to upload their presentation + UPLOAD_PRESENTATION, + // students have to upload their final report + UPLOAD_FINAL_REPORT, + // the docent waits for students to upload presentation WAIT_FOR_UPLOAD, - GIVE_ASSESSMENT, SEE_ASSESSMENT, + + + // student gives assessment to other group + GIVE_EXTERNAL_ASSESSMENT, + + // student rates his own group + GIVE_INTERNAL_ASSESSMENT, + + + // DOCENT gives assessments + GIVE_ASSESSMENT, + + SEE_ASSESSMENT, // shared tasks // execution phase CHOOSE_FITTING_COMPETENCES, CHOOSE_REFLEXION_QUESTIONS, + // the docent waits for students to grade their peers + WAIT_FOR_GRADING, END } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java index e723b6ee4591dc63a7f38858a0b3276eeb4fffe9..7a4b90bedd81361a3115c17f0ad317fe56aa8624 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java @@ -27,6 +27,8 @@ public class TaskOrder { result.add(TaskName.WAIT_FOR_REFLECTION); result.add(TaskName.CLOSE_EXECUTION_PHASE); result.add(TaskName.UPLOAD_PRESENTATION); + result.add(TaskName.UPLOAD_FINAL_REPORT); + result.add(TaskName.GIVE_EXTERNAL_ASSESSMENT); result.add(TaskName.COLLECT_RESULTS_FOR_ASSESSMENT); result.add(TaskName.WAIT_FOR_PEER_ASSESSMENTS); result.add(TaskName.GIVE_ASSESSMENT); diff --git a/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml b/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml index 4c566263d0b35611e4a54c48be5e0570cc78a62b..1946eba3e86f6d6a1c199b9fb94ff2ba1bd0da5d 100644 --- a/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml +++ b/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml @@ -61,6 +61,7 @@ <url-pattern>/journal/*</url-pattern> <!-- either url-pattern or servlet-name is mandatory --> <url-pattern>/profile/*</url-pattern> <!-- either url-pattern or servlet-name is mandatory --> <url-pattern>/researchReport/*</url-pattern> <!-- either url-pattern or servlet-name is mandatory --> + <url-pattern>/assessment/*</url-pattern> <!-- either url-pattern or servlet-name is mandatory --> <dispatcher>REQUEST</dispatcher> </filter-mapping> diff --git a/gemeinsamforschen/src/main/webapp/assessment/js/assessmentService.js b/gemeinsamforschen/src/main/webapp/assessment/js/assessmentService.js index 7c03e3dc5c8fd8d7e798900cb76370feedb1ae4b..a2221e5e98c841852a3927f5b3997d2db8a7cb36 100644 --- a/gemeinsamforschen/src/main/webapp/assessment/js/assessmentService.js +++ b/gemeinsamforschen/src/main/webapp/assessment/js/assessmentService.js @@ -1,5 +1,13 @@ +// assert that utility is included + function startGrading(project) { window.console.log("starting assessment for project: "+ project); - // TODO: send request to backend to start grading - alert("helloo"); + let requestObj = new RequestObj(1, "/assessment", "/grading/start/projects/?",[project],[], "") + serverSide(requestObj, 'POST', function (response) { + // yeah it worked + }); +} + +function startDocentGrading(project) { + // TODO implement } \ No newline at end of file diff --git a/gemeinsamforschen/src/main/webapp/assessment/js/rateContribution.js b/gemeinsamforschen/src/main/webapp/assessment/js/rateContribution.js index fe052b3caf00edaa97388fe2c6458c1c2d3444a9..a1357c15816d742e3507d522d8426360c9ce68cd 100644 --- a/gemeinsamforschen/src/main/webapp/assessment/js/rateContribution.js +++ b/gemeinsamforschen/src/main/webapp/assessment/js/rateContribution.js @@ -3,17 +3,17 @@ $(document).ready(function () { $('#done').hide(); - whichGroupToRate(prepareContributionRating); + $('#groupId').html(getQueryVariable(groupId)); + prepareContributionRating(); //editor.style = "min-height: 100px"; - $('#submit').on('click', function () { safeContributionRating(); }); }); -function whichGroupToRate(callback) { +/*function whichGroupToRate(callback) { let projectName = $('#projectName').html().trim(); $.ajax({ url: '../rest/assessments/groupRate/project/' + projectName, @@ -30,7 +30,7 @@ function whichGroupToRate(callback) { } }) -} +}*/ function safeContributionRating() { let contributions = $('.contributionRating'); @@ -70,7 +70,7 @@ function safeContributionRating() { function prepareContributionRating() { $.ajax({ - url: '../rest/assessments/contributions/project/' + $('#projectName').html().trim(), + url: '../rest/assessments/contributions/project/' + getProjectName(), headers: { "Content-Type": "application/json", "Cache-Control": "no-cache" diff --git a/gemeinsamforschen/src/main/webapp/project/js/create-project.js b/gemeinsamforschen/src/main/webapp/project/js/create-project.js index 55a3931b7f70a9b5df9349bc6a38833b7a811908..05f186b26feb70f800e36159fb43322582770d3e 100644 --- a/gemeinsamforschen/src/main/webapp/project/js/create-project.js +++ b/gemeinsamforschen/src/main/webapp/project/js/create-project.js @@ -137,9 +137,12 @@ function getProjectValues() { } let time = new Date().getTime(); let selectedCategories = []; - $(".category input:checked").each(function () { + $("input:checked[class*='category']").each(function () { selectedCategories.push($(this).val()); }); + if (selectedCategories.length === 0) { + stop(); + } return { "name": projectName, diff --git a/gemeinsamforschen/src/main/webapp/project/js/tasks.js b/gemeinsamforschen/src/main/webapp/project/js/tasks.js index 8c72541dd4daf581eb85de8a27de3e10e7c17d42..5ff1ecd50da97d38fc933178da5dc6eeb085df77 100644 --- a/gemeinsamforschen/src/main/webapp/project/js/tasks.js +++ b/gemeinsamforschen/src/main/webapp/project/js/tasks.js @@ -11,11 +11,6 @@ $(document).ready(function () { groupViewLink.on('click', function () { location.href = "../groupfinding/view-groups.jsp?projectName=" + projectName; }); - /** - * TODO refactor remove all the inline js and group it like this leading - * - */ - }); function fillTasks(projectName, userEmail) { @@ -308,7 +303,6 @@ function handleLinkedTasks(object, result) { "projectName=" + object.projectName+"\')"; break; - case "OPTIONAL_PORTFOLIO_ENTRY": result.solveTaskWith = "Erstelle einen Portfolio-Eintrag (optional)"; result.solveTaskWithLink = "redirect(\'../annotation/upload-unstructured-dossier.jsp?" + $.param({ @@ -316,6 +310,20 @@ function handleLinkedTasks(object, result) { fileRole: "Portfolio", personal: "true" }) + "\')"; + break; + /* case "GIVE_ASSESSMENT": + result.solveTaskWith = "Bewerten"; + result.solveTaskWithLink = "redirect(\'../annotation/upload-unstructured-dossier.jsp?" + $.param({ + projectName: object.projectName, + contributionCategory: "Portfolio", + personal: "true" + }) + "\')"; + break;*/ + case "GIVE_EXTERNAL_ASSESSMENT": + result.solveTaskWith = "Bewerten Sie die Ergebnisse ihrer Kommilitonen!"; + result.solveTaskWithLink = "redirect(\'../assessment/rate-contribution.jsp?" + + "projectName=" + object.projectName+"&groupId="+result.taskData.objectGroup.id+"\')"; + break; default: result.solveTaskWith = null; diff --git a/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp b/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp index ce3a8e73f47121cc6a81d90da1391f74a0ae024c..107f2a1f720ac881b56be7209b7a9f8654b0fe89 100644 --- a/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp +++ b/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp @@ -59,15 +59,26 @@ {{if inCardSolver=="WAIT_FOR_UPLOAD"}} <div class="inCardSolver"> {{if taskData.numberOfGroupsWithoutPresentation > 0 }} - Es haben noch ${taskData.numberOfGroupsWithoutPresentation} Gruppen keine Präsentation hochgeladen. + Anzahl an Gruppen ohne hochgeladene Präsentation: + ${taskData.numberOfGroupsWithoutPresentation}. {{/if}} + {{if taskData.numberOfGroupReportsMissing > 0 }} + Anzahl an Gruppen ohne hochgeladene Abgabe ${taskData.numberOfGroupReportsMissing}. + {{/if}} + <button id='startGradingButton' onClick="startGrading(getProjectName());">Bewertung abschließen</button> + </div> + {{/if}} + {{if inCardSolver=="WAIT_FOR_GRADING"}} + <div class="inCardSolver"> {{if taskData.numberOfGroupsWithoutExternalAssessment > 0 }} - ${taskData.numberOfGroupsWithoutExternalAssessment} Gruppen haben keine Bewertung durch Peers bekommen. + Anzahl an Gruppen ohne Bewertung durch Peers + bekommen: ${taskData.numberOfGroupsWithoutExternalAssessment} . {{/if}} {{if taskData.numberOfStudentsWithoutInternalAsssessment > 0 }} - ${taskData.numberOfStudentsWithoutInternalAsssessment} Studierende haben noch keine Bewertung der Gruppe bekommen. + Anzahl an Studierenden ohne Bewertung durch die Gruppe. + ${taskData.numberOfStudentsWithoutInternalAsssessment} . {{/if}} - <button id='startGradingButton' onClick="startGrading(getProjectName());">Bewertung abschließen</button> + <button id='startGradingButton' onClick="startDocentGrading(getProjectName());">Bewertung abschließen</button> </div> {{/if}} {{/if}} diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java index 1126545d4166a88d78baf8992026a95556803564..24c315ce8b0fe2748bd3e144ba1d1cdf5dffdca1 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java @@ -40,14 +40,14 @@ import static org.junit.Assert.assertTrue; @RunWith(MockitoJUnitRunner.class) public class ActivityFlowTest { - - private final ArrayList<User> students = new ArrayList<>(); - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); /** * Utility to creaty dummy data for students */ + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); PodamFactory factory = new PodamFactoryImpl(); + private final ArrayList<User> students = new ArrayList<>(); private final Project project = factory.manufacturePojo(Project.class); private final User teacher = factory.manufacturePojo(User.class); @Inject diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/assessment/TestAddAssessment.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/assessment/TestAddAssessment.java index 0cdbb30925880329b543917ba0fe6e0aa6b4d274..e1c55eee1762cb81f28c54e9d545f57b93f0f7a8 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/assessment/TestAddAssessment.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/assessment/TestAddAssessment.java @@ -181,12 +181,13 @@ public class TestAddAssessment { @Test public void quickstartAssessmentPhase() { - Project project = new Project("assessmenttest2"); List<Group> groups = groupFinding.getGroups(project); assertFalse(groups.isEmpty()); - peerAssessmentProcess.startPeerAssessmentPhase(project); + //peerAssessmentProcess.startPeerAssessmentPhase(project); + + peerAssessmentProcess.startGrading(project); } diff --git a/gemeinsamforschen/src/test/resources/database/fltrail.sql b/gemeinsamforschen/src/test/resources/database/fltrail.sql index b1475a69ad5c243532fab16fa7a777bee647eae1..c7364bf6e46a6588babb537a1a60e39377d09af6 100644 --- a/gemeinsamforschen/src/test/resources/database/fltrail.sql +++ b/gemeinsamforschen/src/test/resources/database/fltrail.sql @@ -535,6 +535,25 @@ CREATE TABLE `workrating` ) ENGINE = InnoDB DEFAULT CHARSET = utf8 COMMENT ='@Axel plz comment'; + +create table mappedtasks +( + id int auto_increment + primary key, + subjectEmail varchar(200) null, + groupObjectId int null, + objectEmail varchar(200) null, + taskname varchar(200) null, + projectName varchar(200) null +) ENGINE = InnoDB + DEFAULT CHARSET = utf8 + comment 'This table holds the task mapping i.e. which user should give feedback to which groups products'; + + + + + + -- -- Indizes der exportierten Tabellen --