diff --git a/gemeinsamforschen/pom.xml b/gemeinsamforschen/pom.xml index e23a29992f526e80c3722a35ceb67be4d603cc01..52c20b79f71aee59a5981002bb0cfffe254b46ba 100644 --- a/gemeinsamforschen/pom.xml +++ b/gemeinsamforschen/pom.xml @@ -170,6 +170,10 @@ <artifactId>commonmark</artifactId> <version>0.11.0</version> </dependency> + + <!-- state rules --> + + </dependencies> </project> \ No newline at end of file diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java index 554cf0504b8783acc9589f00deaa64eb8356a581..b1e37de6b0852ebc84668f6eab51cd42799d5b07 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java @@ -3,13 +3,24 @@ package unipotsdam.gf.config; import org.glassfish.hk2.utilities.binding.AbstractBinder; import unipotsdam.gf.core.management.Management; import unipotsdam.gf.core.management.ManagementImpl; -import unipotsdam.gf.interfaces.ICommunication; +import unipotsdam.gf.core.states.PhasesImpl; +import unipotsdam.gf.interfaces.*; +import unipotsdam.gf.modules.assessment.controller.service.PeerAssessment; +import unipotsdam.gf.modules.assessment.controller.service.PeerAssessmentDummy; import unipotsdam.gf.modules.communication.service.CommunicationDummyService; +import unipotsdam.gf.modules.journal.DummyJournalImpl; +import unipotsdam.gf.modules.journal.model.Journal; +import unipotsdam.gf.modules.journal.service.DummyJournalService; +import unipotsdam.gf.modules.peer2peerfeedback.DummyFeedback; public class GFApplicationBinder extends AbstractBinder { @Override protected void configure() { bind(CommunicationDummyService.class).to(ICommunication.class); bind(ManagementImpl.class).to(Management.class); + bind(DummyFeedback.class).to(Feedback.class); + bind(DummyJournalImpl.class).to(IJournal.class); + bind(PeerAssessmentDummy.class).to(IPeerAssessment.class); + bind(PhasesImpl.class).to(IPhases.class); } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java index 252905102d2472eaa125f06499bbdfe1663ea254..cefe2e289c2727db459f27dc5606aa0ceb9f9d6b 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java @@ -7,7 +7,7 @@ public class GFDatabaseConfig { public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; public static final String DB_URL = "jdbc:mysql://localhost"; // Database credentials - public static final String USER = "root"; - public static final String PASS = ""; + public static final String USER = "root2"; + public static final String PASS = "voyager2"; public static final String DB_NAME = "fltrail"; } 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 62744cc006b2ce3eaab08150ea2bf819d7f926a6..0bb16d84013c6b0e50dcf2c0b747364b497d5d87 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java @@ -64,7 +64,8 @@ public class ManagementImpl implements Management { "INSERT INTO projects (`id`, `password`, `active`, `timecreated`, `author`, " + "`adminPassword`, `token`, `phase`) values (?,?,?,?,?,?,?,?)"; connect.issueInsertOrDeleteStatement(mysqlRequest, project.getId(), project.getPassword(), project.isActive(), - project.getTimecreated(), project.getAuthor(), project.getAdminPassword(), token); + project.getTimecreated(), project.getAuthor(), project.getAdminPassword(), token, project.getPhase() + == null ? ProjectPhase.CourseCreation : project.getPhase()); connect.close(); } @@ -136,11 +137,15 @@ public class ManagementImpl implements Management { connect.connect(); VereinfachtesResultSet vereinfachtesResultSet = connect.issueSelectStatement(query, project.getId()); while (!vereinfachtesResultSet.isLast()) { - vereinfachtesResultSet.next(); - User user = getUserFromResultSet(vereinfachtesResultSet); - String token = vereinfachtesResultSet.getString("token"); - user.setToken(token); - result.add(user); + Boolean next = vereinfachtesResultSet.next(); + if (next) { + User user = getUserFromResultSet(vereinfachtesResultSet); + String token = vereinfachtesResultSet.getString("token"); + user.setToken(token); + result.add(user); + } else { + break; + } } connect.close(); return result; diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java index 0cdf93a1da414f9c0a3368420c66ff77c9e64f7c..06bd24d75edced5f007ff2db5a58b1bbcd6b30ab 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java @@ -32,7 +32,7 @@ public class Project { this.adminPassword = adminPassword; this.timecreated = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC"))); // default starting at course creation if new - this.setPhase(ProjectPhase.CourseCreationPhase); + this.setPhase(ProjectPhase.CourseCreation); } public String getPhase() { diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/Menu.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/Menu.java index f5ccb7490771953ed577159aef335bc032e59f00..16e3f3ffe900a17b77df2719adfc93ee1d5b6053 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/Menu.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/Menu.java @@ -9,6 +9,8 @@ import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.SimpleTagSupport; import java.io.IOException; + +// TODO: please move this to a view package at the top of the hierarchy as this is not part of the user package public class Menu extends SimpleTagSupport { public void doTag() throws JspException, IOException { PageContext pageContext = (PageContext) getJspContext(); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java.orig b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java.orig deleted file mode 100644 index 73d84e8fa40445fffec6c0a31a5523f9fb5e318f..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java.orig +++ /dev/null @@ -1,163 +0,0 @@ -package unipotsdam.gf.core.management.user; - -import unipotsdam.gf.core.management.ManagementImpl; -import unipotsdam.gf.interfaces.ICommunication; -import unipotsdam.gf.modules.communication.service.CommunicationDummyService; - -import javax.annotation.ManagedBean; -import javax.inject.Inject; -import javax.ws.rs.FormParam; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.net.URI; -import java.net.URISyntaxException; - -@Path("/user") -@ManagedBean -public class UserService { - - @Inject - private ICommunication communicationService; - - /** - * creates a user with given credentials - * - * @param name - * @param password - * @param email - * @param isStudent - * @return - * @throws URISyntaxException - */ - // This method is called if HTML is request - @POST - @Produces(MediaType.TEXT_HTML) - @Path("/create") - public Response createUser(@FormParam("name") String name, @FormParam("password") String password, - @FormParam("email") String email, @FormParam("isStudent") String isStudent) - throws URISyntaxException { - - ManagementImpl management = new ManagementImpl(); - User user = new User(name, password, email, isStudent == null); - return login(true, user); - - } - - /** - * checks if a user exists in order to log him in - * - * @param name - * @param password - * @param email - * @return - * @throws URISyntaxException - */ - // This method is called if HTML is request - @POST - @Produces(MediaType.TEXT_HTML) - @Path("/exists") - public Response existsUser(@FormParam("name") String name, @FormParam("password") String password, - @FormParam("email") String email) - throws URISyntaxException { - - ManagementImpl management = new ManagementImpl(); - User user = new User(name, password, email, null); - ICommunication iCommunication = new CommunicationDummyService(); - boolean isLoggedIn = iCommunication.loginUser(user); - if (isLoggedIn) { - return login(false, user); - } else { - return loginError(); - } - - - } - - /** - * if create User is true, the user is created and logged in if he does not exist - * - * @param createUser - * @param user - * @return - * @throws URISyntaxException - */ - protected Response login(boolean createUser, User user) throws URISyntaxException { - ManagementImpl management = new ManagementImpl(); - if (management.exists(user)) { - if (!createUser) { -<<<<<<< HEAD - ManagementImpl m = new ManagementImpl(); - String token = m.getUserToken(user); - user = m.getUser(token); -======= - boolean successfulLogin = communicationService.loginUser(user); - management.update(user); - if (!successfulLogin) { - return loginError(); - } ->>>>>>> 9bbae0ff75b2597ab35479a24d47c12e7a4cc0fd - return redirectToProjectPage(user, management); - } - String existsUrl = "../register.jsp?userExists=true"; - return forwardToLocation(existsUrl); - } else { - if (createUser) { - boolean isRegisteredAndLoggedIn = communicationService.registerAndLoginUser(user); - if (!isRegisteredAndLoggedIn) { - return registrationError(); - } - management.create(user, null); - } else { - String existsUrl = "../index.jsp?userExists=false"; - return forwardToLocation(existsUrl); - } - ManagementImpl m = new ManagementImpl(); - String token = m.getUserToken(user); - user = m.getUser(token); //todo: write query to get user isStudent - return redirectToProjectPage(user, management); - } - } - - private Response registrationError() throws URISyntaxException { - String existsUrl = "../register.jsp?registrationError=true"; - return forwardToLocation(existsUrl); - } - - private Response loginError() throws URISyntaxException { - String existsUrl = "../index.jsp?loginError=true"; - return forwardToLocation(existsUrl); - } - - /** - * helper function for redirecting to the right project page - * - * @param user - * @param management - * @return - * @throws URISyntaxException - */ - private Response redirectToProjectPage(User user, ManagementImpl management) throws URISyntaxException { - String successUrl; - if (user.getStudent() != null && user.getStudent()) { - successUrl = "../pages/overview-student.html?token="; - } else { - successUrl = "../pages/overview-docent.html?token="; - } - successUrl += management.getUserToken(user); - return forwardToLocation(successUrl); - } - - /** - * * helper function for redirecting to a new page - * - * @param existsUrl - * @return - * @throws URISyntaxException - */ - private Response forwardToLocation(String existsUrl) throws URISyntaxException { - return Response.seeOther(new URI(existsUrl)).build(); - } -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/DosserUploadTask.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/DosserUploadTask.java deleted file mode 100644 index 520f3a41da6b81d717322e756d62f69c1b05a9a0..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/DosserUploadTask.java +++ /dev/null @@ -1,19 +0,0 @@ -package unipotsdam.gf.core.states; - -import unipotsdam.gf.core.management.user.User; - -public class DosserUploadTask extends Task { - public DosserUploadTask(User owner) { - super(owner); - } - - @Override - public String getTaskMessage() { - return null; - } - - @Override - protected String getTaskUrl() { - return null; - } -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerAssessmentTask.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerAssessmentTask.java deleted file mode 100644 index 3808b6b33a08230d63aedc2d517440e62344638f..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerAssessmentTask.java +++ /dev/null @@ -1,21 +0,0 @@ -package unipotsdam.gf.core.states; - -import unipotsdam.gf.core.management.user.User; - -public class PeerAssessmentTask extends Task { - public PeerAssessmentTask(User owner) { - super(owner); - } - - @Override - public String getTaskMessage() { - return null; - } - - @Override - protected String getTaskUrl() { - return null; - } - - -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerFeedbackTask.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerFeedbackTask.java deleted file mode 100644 index 283977e62e49ac9d00019d6b4faa86977c532256..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerFeedbackTask.java +++ /dev/null @@ -1,22 +0,0 @@ -package unipotsdam.gf.core.states; - -import unipotsdam.gf.core.management.user.User; - -public class PeerFeedbackTask extends Task { - public PeerFeedbackTask(User owner) { - super(owner); - } - - @Override - public String getTaskMessage() { - // TODO implement - return null; - } - - @Override - protected String getTaskUrl() { - // TODO implement - return null; - } - -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..f41a8eeeac87a6ca6fe7d26fffdce08d4dea28bf --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java @@ -0,0 +1,126 @@ +package unipotsdam.gf.core.states; + +import unipotsdam.gf.core.database.mysql.MysqlConnect; +import unipotsdam.gf.core.management.project.Project; +import unipotsdam.gf.interfaces.*; +import unipotsdam.gf.view.Messages; + +import javax.annotation.ManagedBean; +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Created by dehne on 31.05.2018. + * This class should be used to manage changing the phases in a central location + * it has dependencies to most modules, as they are required to check the constraints + * when changing between phases + */ +@ManagedBean +public class PhasesImpl implements IPhases { + + @Inject + private IPeerAssessment iPeerAssessment; + + @Inject + private Feedback feedback; + + @Inject + private ICommunication iCommunication; + + @Inject + private IJournal iJournal; + + public PhasesImpl() { + } + + /** + * use this if you don't know how dependency injection works + * @param iPeerAssessment + * @param feedback + * @param iCommunication + * @param iJournal + */ + public PhasesImpl(IPeerAssessment iPeerAssessment, Feedback feedback, ICommunication iCommunication, IJournal iJournal) { + this.iPeerAssessment = iPeerAssessment; + this.feedback = feedback; + this.iCommunication = iCommunication; + this.iJournal = iJournal; + } + + @Override + public void endPhase(ProjectPhase currentPhase, Project project) { + switch (currentPhase) { + case CourseCreation: + // saving the state + saveState(project,getNextPhase(currentPhase)); + break; + case GroupFormation: + // inform users about the formed groups, optionally giving them a hint on what happens next + iCommunication.sendMessageToUsers(project, Messages.GroupFormation(project)); + saveState(project,getNextPhase(currentPhase)); + break; + case DossierFeedback: + // check if everybody has uploaded a dossier + Boolean feedbacksGiven = feedback.checkFeedbackConstraints(project); + if (!feedbacksGiven) { + feedback.assigningMissingFeedbackTasks(project); + } else { + // send a message to the users informing them about the start of the new phase + iCommunication.sendMessageToUsers(project, Messages.NewFeedbackTask(project)); + saveState(project,getNextPhase(currentPhase)); + } + break; + case Execution: + // check if the portfolios have been prepared for evaluation (relevant entries selected) + Boolean portfoliosReady = iJournal.getPortfoliosForEvaluationPrepared(project); + if (portfoliosReady) { + // inform users about the end of the phase + iCommunication.sendMessageToUsers(project, Messages.AssessmentPhaseStarted(project)); + saveState(project,getNextPhase(currentPhase)); + } else { + iJournal.assignMissingPortfolioTasks(project); + } + break; + case Assessment: + closeProject(); + break; + } + } + + private void closeProject() { + // TODO implement + } + + ProjectPhase getNextPhase(ProjectPhase projectPhase) { + switch (projectPhase) { + case CourseCreation: + return ProjectPhase.GroupFormation; + case GroupFormation: + return ProjectPhase.DossierFeedback; + case DossierFeedback: + return ProjectPhase.Execution; + case Execution: + return ProjectPhase.Assessment; + case Assessment: + return ProjectPhase.Projectfinished; + } + return null; + } + + private void saveState(Project project, ProjectPhase currentPhase) { + assert project.getId() != null; + MysqlConnect connect = new MysqlConnect(); + connect.connect(); + String mysqlRequest = "UPDATE `projects` SET `phase`=? WHERE id=? LIMIT 1"; + connect.issueUpdateStatement(mysqlRequest, currentPhase.name(), project.getId()); + connect.close(); + } + + + + + + + +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/ProjectPhase.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/ProjectPhase.java index f17a652a6bc98dd72dc972900dc92e0cc6e146ea..ba8bffad7c29716ddfd9bbb5f049e3f19b0241c4 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/ProjectPhase.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/ProjectPhase.java @@ -1,9 +1,6 @@ package unipotsdam.gf.core.states; public enum ProjectPhase { - CourseCreationPhase, - GroupFormationPhase, - DossierFeedbackPhase, - ExecutionPhase, - AssessmentPhase + CourseCreation, GroupFormation, DossierFeedback, Execution, Assessment, + Projectfinished } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/States.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/States.java deleted file mode 100644 index 638cf52b30ed30794734d891d77d21d2e7999e32..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/States.java +++ /dev/null @@ -1,35 +0,0 @@ -package unipotsdam.gf.core.states; - -import unipotsdam.gf.core.management.user.User; -import unipotsdam.gf.interfaces.ICommunication; -import unipotsdam.gf.modules.communication.model.Message; - -import javax.inject.Inject; - -public class States { - - @Inject - ICommunication iCommunication; - - - public void endPhase(ProjectPhase currentPhase) { - // TODO implement - - // calculate reaction - - // if no problem change phase - - // if problem send message - - // and start recovery process - } - - - private void sendProblemMessage(String message, User user) { - iCommunication.sendSingleMessage(new Message(null, message),user); - } - - - - -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/Task.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/Task.java deleted file mode 100644 index 821f480c22a607c48119604b6c65be1a9bd0846d..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/Task.java +++ /dev/null @@ -1,56 +0,0 @@ -package unipotsdam.gf.core.states; - -import unipotsdam.gf.core.management.user.User; -import unipotsdam.gf.interfaces.ICommunication; -import unipotsdam.gf.modules.communication.model.Message; - -import javax.inject.Inject; - -public abstract class Task { - - @Inject - ICommunication iCommunication; - - // the user who has to do the task - protected User owner; - - public Task(User owner) { - this.owner = owner; - } - - public abstract String getTaskMessage(); - - public void start() { - sendTaskMessage(); - save(); - } - - private void save() { - String name = getClass().getName(); // this returns the runtime name of the subclass i.e. PeerAssessmentTask - String url = getTaskUrl(); - - } - - /** - * should be a relative path like - * /dossiers/upload - * /peerfeedback/{userId}/give - * /peerassessment/{userId}/give - * or similar - * - * @return - */ - protected abstract String getTaskUrl(); - - public void sendTaskMessage() { - iCommunication.sendSingleMessage(new Message(null, getTaskMessage()), owner); - } - - public User getOwner() { - return owner; - } - - public void setOwner(User owner) { - this.owner = owner; - } -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/Feedback.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/Feedback.java index 6ba367ce70e0ce14f2492b9dab298d2d284a405d..5a882917907b4b844080d64a7136fca88eac382e 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/Feedback.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/Feedback.java @@ -1,4 +1,5 @@ package unipotsdam.gf.interfaces; +import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.core.management.user.User; import unipotsdam.gf.modules.peer2peerfeedback.Peer2PeerFeedback; import java.*; @@ -51,4 +52,12 @@ public interface Feedback { int countFeedback(User student); + /** + * TODO implement check in DB that everybody has given feedback + * @param project + * @return + */ + Boolean checkFeedbackConstraints(Project project); + + void assigningMissingFeedbackTasks(Project project); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java index d66970b8fc67d46bf89dbfae0bcb5eadcae6b0cd..3370fa6586a58651923f35abd482b94bc179b2ef 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java @@ -1,5 +1,6 @@ package unipotsdam.gf.interfaces; +import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.core.management.user.User; import unipotsdam.gf.modules.communication.model.Message; import unipotsdam.gf.modules.communication.model.chat.ChatMessage; @@ -85,5 +86,9 @@ public interface ICommunication { String getChatRoomLink(String userToken, String projectToken, String groupToken); + // TODO implement as Email or whatever void sendSingleMessage(Message message, User user); + + // TODO implement as Email or whatever + void sendMessageToUsers(Project project, String message); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java index 4da8b21c8ed3871d6824944e2f90b1a19315724e..869de710426fb0da5f54ba4039616f0fb9e8e7da 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java @@ -1,6 +1,7 @@ package unipotsdam.gf.interfaces; +import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; /** @@ -16,4 +17,16 @@ public interface IJournal { */ String exportJournal (StudentIdentifier student); + /** + * check if all students have prepared their portfolios to be evaluated + * @return + * @param project + */ + Boolean getPortfoliosForEvaluationPrepared(Project project); + + /** + * find out, who hasn't prepared their portfolio for evaluation and send message or highlight in view + * @param project + */ + void assignMissingPortfolioTasks(Project project); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IPhases.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IPhases.java new file mode 100644 index 0000000000000000000000000000000000000000..f98b67a9b224e50f1936e37ddd8ad7e6501e4f5a --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IPhases.java @@ -0,0 +1,13 @@ +package unipotsdam.gf.interfaces; + +import unipotsdam.gf.core.management.project.Project; +import unipotsdam.gf.core.states.ProjectPhase; + +public interface IPhases { + /** + * switch from one phase to the next + * @param projectPhase + * @param project + */ + public void endPhase(ProjectPhase projectPhase, Project project); +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java index 138e0d4ab2a485734cf95cdddf3f7f2d1ec515c8..c9c17f71e19cf357b9b0703df97d89b93621cdba 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java @@ -2,6 +2,7 @@ package unipotsdam.gf.modules.communication.service; import unipotsdam.gf.config.Constants; import unipotsdam.gf.core.management.Management; +import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.core.management.user.User; import unipotsdam.gf.interfaces.ICommunication; import unipotsdam.gf.modules.communication.model.Message; @@ -106,6 +107,12 @@ public class CommunicationDummyService implements ICommunication { System.out.println("sending email with message: "+ message.getMessage() + " to: "+ user.getEmail()); } + @Override + public void sendMessageToUsers(Project project, String message) { + // TODO implement as email or directed message, popup after login or whatever + System.out.println("sending email with message: "+ message + " to: "+ project.getId()); + } + // TODO: remove after done implementing // just for postman testing public User getUser() { diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/DummyJournalImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/DummyJournalImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..469ac93850bbde4ece18e5e03a7a524636e8a4fc --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/DummyJournalImpl.java @@ -0,0 +1,33 @@ +package unipotsdam.gf.modules.journal; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import unipotsdam.gf.core.management.project.Project; +import unipotsdam.gf.interfaces.IJournal; +import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; +import unipotsdam.gf.modules.journal.service.DummyJournalService; + +public class DummyJournalImpl implements IJournal { + + + private Logger log = LoggerFactory.getLogger(DummyJournalImpl.class); + + @Override + public String exportJournal(StudentIdentifier student) { + // TODO Impl was macht das hier? + + return null; + } + + @Override + public Boolean getPortfoliosForEvaluationPrepared(Project project) { + + log.debug("checking fake constraints for the portfolio evaluation"); + return false; + } + + @Override + public void assignMissingPortfolioTasks(Project project) { + log.debug("assigning fake MissingPortfolioTasks"); + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/model/Journal.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/model/Journal.java index 65a17d1fea783d016f0422414d5dbed66ee4b671..16d31e35a5dce1f97d2d4d63c9f027b7a9f27076 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/model/Journal.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/model/Journal.java @@ -3,7 +3,7 @@ package unipotsdam.gf.modules.journal.model; import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; -import static unipotsdam.gf.core.management.utils.MarkdownUtils.convertMarkdownToHtml; +import static unipotsdam.gf.view.MarkdownUtils.convertMarkdownToHtml; /** * Model Class for the learnig journal of the e-portfolio diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/model/ProjectDescription.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/model/ProjectDescription.java index 7c73443a81d372bfe5bdc2cbc43a67a241e95c43..51f14b21ca29e9e0afb414aaf8fd9250de22b3c9 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/model/ProjectDescription.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/model/ProjectDescription.java @@ -5,7 +5,7 @@ import unipotsdam.gf.core.management.project.Project; import java.util.ArrayList; import java.util.Map; -import static unipotsdam.gf.core.management.utils.MarkdownUtils.convertMarkdownToHtml; +import static unipotsdam.gf.view.MarkdownUtils.convertMarkdownToHtml; /** * Model class for the project descriptionHTML of the e portfolio diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/utils/Category.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/Category.java similarity index 82% rename from gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/utils/Category.java rename to gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/Category.java index 0929f342834ff143da72c6ebfa74ee911138338e..d371d33983460d0893f9136329b8aea4f36f0379 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/utils/Category.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/Category.java @@ -1,4 +1,4 @@ -package unipotsdam.gf.core.management.utils; +package unipotsdam.gf.modules.peer2peerfeedback; /** Categories for feedback and documents diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java new file mode 100644 index 0000000000000000000000000000000000000000..a8a2d0d178ac2f5bd516b2e5a4a4d151c28f9c32 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java @@ -0,0 +1,43 @@ +package unipotsdam.gf.modules.peer2peerfeedback; + +import unipotsdam.gf.core.management.project.Project; +import unipotsdam.gf.core.management.user.User; +import unipotsdam.gf.interfaces.Feedback; + +import java.io.File; +import java.util.ArrayList; + +public class DummyFeedback implements Feedback { + @Override + public Peer2PeerFeedback createPeer2PeerFeedbackmask( + User feedbackuser, User selectedstudent, File document) { + return null; + } + + @Override + public Boolean giveFeedback(Peer2PeerFeedback feedback, File document) { + return null; + } + + @Override + public ArrayList<Peer2PeerFeedback> showFeedback(User student) { + return null; + } + + @Override + public int countFeedback(User student) { + return 0; + } + + @Override + public Boolean checkFeedbackConstraints(Project project) { + // TODO implement cornstaints + System.out.println("Checking fake constraints"); + return true; + } + + @Override + public void assigningMissingFeedbackTasks(Project project) { + System.out.println("assigning fake tasks"); + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/ExampleFeedback.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/ExampleFeedback.java index bc040fad7ccfad8993d3a1f33ca2eebfbefb48a3..9b44f2d2e81a8ca1133da2917cfb47ba69bfdb7d 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/ExampleFeedback.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/ExampleFeedback.java @@ -1,7 +1,6 @@ package unipotsdam.gf.modules.peer2peerfeedback; import unipotsdam.gf.core.management.user.User; -import unipotsdam.gf.core.management.utils.Category; import java.io.File; diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/Peer2PeerFeedback.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/Peer2PeerFeedback.java index d68e106fb4c8d007e1d5b1a5a8c5e7eef4289487..55bd0e9dad14bc9e1954f223599ebdb4587f0dd6 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/Peer2PeerFeedback.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/Peer2PeerFeedback.java @@ -1,7 +1,6 @@ package unipotsdam.gf.modules.peer2peerfeedback; import unipotsdam.gf.core.management.user.User; -import unipotsdam.gf.core.management.utils.Category; import java.io.File; diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/utils/MarkdownUtils.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/view/MarkdownUtils.java similarity index 93% rename from gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/utils/MarkdownUtils.java rename to gemeinsamforschen/src/main/java/unipotsdam/gf/view/MarkdownUtils.java index 5d25997fb52658f8d3f209c289677286659ccb59..9f626e2ccbeb9b48b003a00e4ea7dd62b04345a1 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/utils/MarkdownUtils.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/view/MarkdownUtils.java @@ -1,4 +1,4 @@ -package unipotsdam.gf.core.management.utils; +package unipotsdam.gf.view; import org.commonmark.node.Node; import org.commonmark.parser.Parser; diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/view/Messages.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/view/Messages.java new file mode 100644 index 0000000000000000000000000000000000000000..986c7d741e87d479673663e4afccd5d685bc2249 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/view/Messages.java @@ -0,0 +1,20 @@ +package unipotsdam.gf.view; + +import unipotsdam.gf.core.management.project.Project; + +public class Messages { + public static String GroupFormation(Project project){ + // TODO add link to site + markup + return "Die Gruppen wurden für den Kurs "+ project.getId() + " erstellt"; + } + + public static String NewFeedbackTask(Project project) { + // TODO add link to site + markup + return "Eine neue Feedbackaufgabe wurde für den Kurs "+ project.getId() + " erstellt"; + } + + public static String AssessmentPhaseStarted(Project project) { + // TODO add link to site + markup + return "Die Bewertungsphase hat begonnen. Bitte geht auf ... und macht ...."; + } +} diff --git a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql index 906e40da2cdcf764e7f700a729a7b94d3bda8fd6..71f44c061c7cadc62ba178d87d521a212fb08808 100644 --- a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql +++ b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql @@ -8,7 +8,7 @@ USE `fltrail`; CREATE TABLE if not exists `projects` ( - `id` varchar(400) NOT NULL, + `id` varchar(100) NOT NULL, `password` varchar(400) NOT NULL, @@ -62,7 +62,7 @@ CREATE TABLE if not exists groupuser CREATE TABLE if not exists `tags` ( - `projectId` varchar(400) NOT NULL, + `projectId` varchar(100) NOT NULL, `tag` varchar(400) NOT NULL @@ -74,7 +74,7 @@ CREATE TABLE if not exists `tags` ( CREATE TABLE if not exists `users` ( - `name` varchar(400) NOT NULL, + `name` varchar(100) NOT NULL, `password` varchar(200) NOT NULL, @@ -98,9 +98,9 @@ CREATE TABLE if not exists projectuser ( - projectId varchar(400) NOT NULL, + projectId varchar(100) NOT NULL, - userId varchar(400) NOT NULL + userId varchar(100) NOT NULL ) @@ -124,7 +124,9 @@ CREATE TABLE if not exists projectuser PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8;alter table users +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +alter table users add isStudent tinyint(1) default '1' null; @@ -163,4 +165,8 @@ CREATE TABLE if not exists tasks ENGINE = InnoDB - DEFAULT CHARSET = utf8; \ No newline at end of file + 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/ManagementTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java index 8e71c0dcba017d321a6af5540fb843ea8ff7352c..22b2822668e4214c1b239bf46c615c10be793cf2 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java @@ -1,6 +1,15 @@ package unipotsdam.gf.interfaces; +import javafx.application.Application; +import org.glassfish.hk2.api.ServiceLocator; +import org.glassfish.hk2.utilities.Binder; +import org.glassfish.hk2.utilities.ServiceLocatorUtilities; +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.test.JerseyTest; +import org.junit.Before; import org.junit.Test; +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.user.User; @@ -14,7 +23,11 @@ import static org.junit.Assert.assertTrue; /** * Created by dehne on 01.06.2018. */ -public class ManagementTest { + + +public class ManagementTest { + + @Test public void testDelete() { @@ -90,6 +103,8 @@ public class ManagementTest { management.create(project); management.register(user, project, null); + assertTrue(management.exists(project)); + User user2 = new User("julian2", "12345", "from2@stuff.com", true); management.create(user2, new UserProfile()); assert management.exists(user2); diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/PhaseTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/PhaseTest.java new file mode 100644 index 0000000000000000000000000000000000000000..a4f54632fa0b338920dd264916ee909e627a0517 --- /dev/null +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/PhaseTest.java @@ -0,0 +1,83 @@ +package unipotsdam.gf.interfaces; + +import org.glassfish.hk2.api.ServiceLocator; +import org.glassfish.hk2.utilities.Binder; +import org.glassfish.hk2.utilities.ServiceLocatorUtilities; +import org.glassfish.hk2.utilities.binding.AbstractBinder; +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.test.JerseyTest; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +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.user.User; +import unipotsdam.gf.core.management.user.UserProfile; +import unipotsdam.gf.core.states.PhasesImpl; +import unipotsdam.gf.core.states.ProjectPhase; + +import javax.inject.Inject; +import javax.ws.rs.core.Application; + + +public class PhaseTest { + + @Inject + private IPhases phases; + + + @Before + public void setUp() { + final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder()); + locator.inject(this); + } + + @BeforeClass + public static void prepareProject() { + ManagementImpl management = new ManagementImpl(); + User user = new User("julian", "1234", "from@stuff.com", false); + management.create(user, new UserProfile()); + assert management.exists(user); + + Project project = new Project("Gemainsam Forschen", "1235", true, "me", "keins"); + management.create(project); + management.register(user, project, null); + } + + @Test + public void phase1() { + Project project = new Project(); + project.setId("Gemainsam Forschen"); + phases.endPhase(ProjectPhase.CourseCreation, project); + } + + @Test + public void phase2() { + Project project = new Project(); + project.setId("Gemainsam Forschen"); + phases.endPhase(ProjectPhase.GroupFormation, project); + } + + @Test + public void phase3() { + Project project = new Project(); + project.setId("Gemainsam Forschen"); + phases.endPhase(ProjectPhase.DossierFeedback, project); + } + + @Test + public void phase4() { + Project project = new Project(); + project.setId("Gemainsam Forschen"); + phases.endPhase(ProjectPhase.Execution, project); + } + + @Test + public void phase5() { + Project project = new Project(); + project.setId("Gemainsam Forschen"); + phases.endPhase(ProjectPhase.Assessment, project); + } +}