diff --git a/.gitignore b/.gitignore index 063da21..4f7bf00 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,8 @@ hs_err_pid* .*DS_Store # IntelliJ, Eclipse and Maven files -/BIN/ +/bin/ /target/ +/.idea/ .project +*.iml diff --git a/pom.xml b/pom.xml index 8073b38..b5aa16f 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,11 @@ limitations under the License. + + com.google.cloud + google-cloud-language + 1.55.0 + javax.servlet diff --git a/src/main/java/com/google/codeu/data/Datastore.java b/src/main/java/com/google/codeu/data/Datastore.java index d3fd07c..11e5d7b 100644 --- a/src/main/java/com/google/codeu/data/Datastore.java +++ b/src/main/java/com/google/codeu/data/Datastore.java @@ -19,6 +19,7 @@ import com.google.appengine.api.datastore.DatastoreService; import com.google.appengine.api.datastore.DatastoreServiceFactory; import com.google.appengine.api.datastore.Entity; +import com.google.appengine.api.datastore.FetchOptions; import com.google.appengine.api.datastore.PreparedQuery; import com.google.appengine.api.datastore.Query; import com.google.appengine.api.datastore.Query.FilterOperator; @@ -42,8 +43,18 @@ public void storeMessage(Message message) { messageEntity.setProperty("user", message.getUser()); messageEntity.setProperty("text", message.getText()); messageEntity.setProperty("timestamp", message.getTimestamp()); + System.out.println("Data store testing sentiment: " + message.getSentiment()); + messageEntity.setProperty("sentiment", message.getSentiment()); datastore.put(messageEntity); + System.out.println("Testing message entity: " + messageEntity); + } + + /** Inserted Code * */ + public int getTotalMessageCount() { + Query query = new Query("Message"); + PreparedQuery results = datastore.prepare(query); + return results.countEntities(FetchOptions.Builder.withLimit(1000)); } /** diff --git a/src/main/java/com/google/codeu/data/Message.java b/src/main/java/com/google/codeu/data/Message.java index a0dbdfe..e2208cc 100644 --- a/src/main/java/com/google/codeu/data/Message.java +++ b/src/main/java/com/google/codeu/data/Message.java @@ -25,6 +25,7 @@ public class Message { private String user; private String text; private long timestamp; + private float sentiment = -2; // default value to indicate not assigned /** * Constructs a new {@link Message} posted by {@code user} with {@code text} content. Generates a @@ -34,6 +35,16 @@ public Message(String user, String text) { this(UUID.randomUUID(), user, text, System.currentTimeMillis()); } + public Message(String user, String text, float sentiment) { + this.id = UUID.randomUUID(); + this.user = user; + this.text = text; + this.timestamp = System.currentTimeMillis(); + this.sentiment = sentiment; + + System.out.println("Message data test item 'this': " + this); + } + public Message(UUID id, String user, String text, long timestamp) { this.id = id; this.user = user; @@ -56,4 +67,8 @@ public String getText() { public long getTimestamp() { return timestamp; } + + public float getSentiment() { + return sentiment; + } } diff --git a/src/main/java/com/google/codeu/database/taxOverflow_Schema_mySQL.java b/src/main/java/com/google/codeu/database/taxOverflow_Schema_mySQL.java new file mode 100644 index 0000000..063e7b0 --- /dev/null +++ b/src/main/java/com/google/codeu/database/taxOverflow_Schema_mySQL.java @@ -0,0 +1,87 @@ +// Import required packages + +import java.sql.*; + +public class JDBCExample { + // JDBC driver name and database URL + static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; + static final String DB_URL = "jdbc:mysql://localhost/STUDENTS"; + + // Database credentials + static final String USER = "username"; + static final String PASS = "password"; + + public static void main(String[] args) { + Connection conn = null; + Statement stmt = null; + try { + // Register JDBC driver + Class.forName("com.mysql.jdbc.Driver"); + + // Open a connection + System.out.println("Connecting to a selected database..."); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + System.out.println("Connected database successfully..."); + + // Creating a database schema + Statement sta = con.createStatement(); + int count = sta.executeUpdate("CREATE SCHEMA T_Overflow"); + System.out.println("Schema created."); + sta.close(); + + // Execute a query + System.out.println("Creating table in given database..."); + stmt = conn.createStatement(); + + // need to create array of postID to keep track of answered questions + String sql = + "CREATE TABLE PROFILE " + + "(profileId INTEGER not NULL, " + + " first VARCHAR, " + + " last VARCHAR, " + + " isCPA BIT not NULL, " + + " PRIMARY KEY ( profileId ))"; + + stmt.executeUpdate(sql); + System.out.println("Created table in given database..."); + + // Execute a query + System.out.println("Creating table in given database..."); + stmt = conn.createStatement(); + + // need to create array of responses, per postId + String sql = + "CREATE TABLE POST " + + "(postId INTEGER not NULL UNIQUE, " + + " memberId INTEGER not NULL, " + + " header VARCHAR(255), " + + + // " response VARCHAR(255), " + + " pointTotal INTEGER, " + + " FOREIGN KEY ( memberId ) REFERENCES PROFILE.profileId" + + " PRIMARY KEY ( postId ))"; + + stmt.executeUpdate(sql); + System.out.println("Created table in given database..."); + + } catch (SQLException se) { + // Handle errors for JDBC + se.printStackTrace(); + } catch (Exception e) { + // Handle errors for Class.forName + e.printStackTrace(); + } finally { + // finally block used to close resources + try { + if (stmt != null) conn.close(); + } catch (SQLException se) { + } // do nothing + try { + if (conn != null) conn.close(); + } catch (SQLException se) { + se.printStackTrace(); + } // end finally try + } // end try + System.out.println("Goodbye!"); + } // end main +} // end JDBCExample diff --git a/src/main/java/com/google/codeu/servlets/MessageServlet.java b/src/main/java/com/google/codeu/servlets/MessageServlet.java index 5d5dd9a..736cfb7 100644 --- a/src/main/java/com/google/codeu/servlets/MessageServlet.java +++ b/src/main/java/com/google/codeu/servlets/MessageServlet.java @@ -18,6 +18,10 @@ import com.google.appengine.api.users.UserService; import com.google.appengine.api.users.UserServiceFactory; +import com.google.cloud.language.v1.Document; +import com.google.cloud.language.v1.Document.Type; +import com.google.cloud.language.v1.LanguageServiceClient; +import com.google.cloud.language.v1.Sentiment; import com.google.codeu.data.Datastore; import com.google.codeu.data.Message; import com.google.gson.Gson; @@ -65,6 +69,18 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) thro response.getWriter().println(json); } + private float getSentimentScore(String text) throws IOException { + Document doc = Document.newBuilder().setContent(text).setType(Type.PLAIN_TEXT).build(); + + LanguageServiceClient languageService = LanguageServiceClient.create(); + Sentiment sentiment = languageService.analyzeSentiment(doc).getDocumentSentiment(); + languageService.close(); + + // System.out.println(sentiment); + + return sentiment.getScore(); + } + /** Stores a new {@link Message}. */ @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { @@ -78,7 +94,12 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr String user = userService.getCurrentUser().getEmail(); String text = Jsoup.clean(request.getParameter("text"), Whitelist.none()); - Message message = new Message(user, text); + float sentimentScore = getSentimentScore(text); + // System.out.println(sentimentScore); + + Message message = new Message(user, text, sentimentScore); + System.out.println("Message testing sentiment: " + message.getSentiment()); + // Message message = new Message(user, text); datastore.storeMessage(message); response.sendRedirect("/user-page.html?user=" + user); diff --git a/src/main/java/com/google/codeu/servlets/StatsPageServlet.java b/src/main/java/com/google/codeu/servlets/StatsPageServlet.java new file mode 100644 index 0000000..9c512c8 --- /dev/null +++ b/src/main/java/com/google/codeu/servlets/StatsPageServlet.java @@ -0,0 +1,34 @@ +package com.google.codeu.servlets; + +import com.google.codeu.data.Datastore; +import com.google.gson.JsonObject; +import java.io.IOException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** Responds with a hard-coded message for testing purposes. */ +@WebServlet("/stats") +public class StatsPageServlet extends HttpServlet { + + private Datastore datastore; + + @Override + public void init() { + datastore = new Datastore(); + } + + /** Responds with site statistics in JSON. */ + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + + response.setContentType("application/json"); + + int messageCount = datastore.getTotalMessageCount(); + + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("messageCount", messageCount); + response.getOutputStream().println(jsonObject.toString()); + } +} diff --git a/src/main/webapp/css/main.css b/src/main/webapp/css/main.css index eaa3d93..80c6f00 100644 --- a/src/main/webapp/css/main.css +++ b/src/main/webapp/css/main.css @@ -30,3 +30,16 @@ nav li { display: inline-block; margin-right: 10px } + +#card-header{ +/* + margin-left: 1 px; + margin-right: 1 px; + /*width: 8em;*/ +} + +#card-inner-p{ +} + +#card-footer{ +} \ No newline at end of file diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html index 88b4784..4426c8e 100644 --- a/src/main/webapp/index.html +++ b/src/main/webapp/index.html @@ -20,19 +20,36 @@ CodeU 2019 Starter Project + + -

CodeU Starter Project

-

This is the CodeU starter project. Click the links above to login and visit your page. - You can post messages on your page, and you can visit other user pages if you have - their URL.

-

This is your code now! Feel free to make changes, and don't be afraid to get creative! - You could start by modifying this page to tell the world more about your team.

+
+ +
+

CodeU Starter Project

+
+ +
+

This is the CodeU starter project. Click the links above to login and visit your page. + You can post messages on your page, and you can visit other user pages if you have + their URL.

+
+

This is your code now! Feel free to make changes, and don't be afraid to get creative! + You could start by modifying this page to tell the world more about your team.

+
+ +
+
Team Code Busters
+
+ +
\ No newline at end of file diff --git a/src/main/webapp/js/user-page-loader.js b/src/main/webapp/js/user-page-loader.js index d038919..94cd68f 100644 --- a/src/main/webapp/js/user-page-loader.js +++ b/src/main/webapp/js/user-page-loader.js @@ -61,6 +61,7 @@ function fetchMessages() { messagesContainer.innerHTML = ''; } messages.forEach((message) => { + console.log(message); const messageDiv = buildMessageDiv(message); messagesContainer.appendChild(messageDiv); }); @@ -75,8 +76,9 @@ function fetchMessages() { function buildMessageDiv(message) { const headerDiv = document.createElement('div'); headerDiv.classList.add('message-header'); + console.log("Test within buildMessageDive. Message contents: " + message); headerDiv.appendChild(document.createTextNode( - message.user + ' - ' + new Date(message.timestamp))); + message.user + ' - ' + new Date(message.timestamp) + ' [' + message.sentiment + ']')); const bodyDiv = document.createElement('div'); bodyDiv.classList.add('message-body'); diff --git a/src/main/webapp/stats.html b/src/main/webapp/stats.html new file mode 100644 index 0000000..c597994 --- /dev/null +++ b/src/main/webapp/stats.html @@ -0,0 +1,41 @@ + + + + Stats + + + + + +
+

Site Statistics

+
+
Loading...
+
+ + \ No newline at end of file diff --git a/src/main/webapp/user-page.html b/src/main/webapp/user-page.html index b633030..6942482 100644 --- a/src/main/webapp/user-page.html +++ b/src/main/webapp/user-page.html @@ -26,7 +26,7 @@

User Page

@@ -34,9 +34,9 @@

User Page