From 8c0b7fb466fe98e436ce1ead80e9f02970b6756f Mon Sep 17 00:00:00 2001 From: Eyob Date: Sun, 17 Mar 2019 22:54:52 -0400 Subject: [PATCH 1/3] This is the part 1 of the image update in the guided project. --- .../java/com/google/codeu/servlets/MessageServlet.java | 6 +++++- src/main/webapp/css/user-page.css | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/codeu/servlets/MessageServlet.java b/src/main/java/com/google/codeu/servlets/MessageServlet.java index 3b5269b..f8c36b2 100644 --- a/src/main/java/com/google/codeu/servlets/MessageServlet.java +++ b/src/main/java/com/google/codeu/servlets/MessageServlet.java @@ -80,8 +80,12 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr String recipient = request.getParameter("recipient"); System.out.println("print recipient:"); System.out.println(recipient); + + String regex = "(https?://\\S+\\.(png|jpg))"; + String replacement = ""; + String textWithImagesReplaced = text.replaceAll(regex, replacement); - Message message = new Message(user, text, recipient); + Message message = new Message(user, textWithImagesReplaced, recipient); datastore.storeMessage(message); response.sendRedirect("/user-page.html?user=" + recipient); diff --git a/src/main/webapp/css/user-page.css b/src/main/webapp/css/user-page.css index d117865..0230882 100644 --- a/src/main/webapp/css/user-page.css +++ b/src/main/webapp/css/user-page.css @@ -44,4 +44,13 @@ user is not logged in or viewing their own page. */ .hidden { display: none; +} + +/* Use this to ensure that the message is completely + displayed on one page */ + +.message-body img { + display: block; + margin-top: 25px; + max-width: 75%; } \ No newline at end of file From f0b654a7c9ccc662c445870a02079d2a33d54dce Mon Sep 17 00:00:00 2001 From: Eyob Date: Mon, 18 Mar 2019 18:57:35 -0400 Subject: [PATCH 2/3] Code neccesary to do images part 2 --- .../java/com/google/codeu/data/Datastore.java | 8 +++-- .../java/com/google/codeu/data/Message.java | 15 ++++++-- .../codeu/servlets/ImageUploadUrlServlet.java | 26 ++++++++++++++ .../google/codeu/servlets/MessageServlet.java | 20 +++++++++++ src/main/webapp/js/user-page-loader.js | 34 ++++++++++++++++++- src/main/webapp/user-page.html | 5 ++- 6 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/google/codeu/servlets/ImageUploadUrlServlet.java diff --git a/src/main/java/com/google/codeu/data/Datastore.java b/src/main/java/com/google/codeu/data/Datastore.java index a17290e..748d399 100644 --- a/src/main/java/com/google/codeu/data/Datastore.java +++ b/src/main/java/com/google/codeu/data/Datastore.java @@ -43,7 +43,9 @@ public void storeMessage(Message message) { messageEntity.setProperty("text", message.getText()); messageEntity.setProperty("timestamp", message.getTimestamp()); messageEntity.setProperty("recipient", message.getRecipient()); - + if(message.getImageUrl() != null) { + messageEntity.setProperty("imageUrl", message.getImageUrl()); + } datastore.put(messageEntity); } @@ -58,8 +60,8 @@ public List messageConverter(PreparedQuery results) { String recipient = (String) entity.getProperty("recipient"); String text = (String) entity.getProperty("text"); long timestamp = (long) entity.getProperty("timestamp"); - - Message message = new Message(id, user, text, timestamp, recipient); + String imageUrl = (String) entity.getProperty("imageUrl"); + Message message = new Message(id, user, text, timestamp, recipient, imageUrl); messages.add(message); } catch (Exception e) { System.err.println("Error reading message."); diff --git a/src/main/java/com/google/codeu/data/Message.java b/src/main/java/com/google/codeu/data/Message.java index 099bff1..184e665 100644 --- a/src/main/java/com/google/codeu/data/Message.java +++ b/src/main/java/com/google/codeu/data/Message.java @@ -26,21 +26,23 @@ public class Message { private String text; private long timestamp; private String recipient; + private String imageUrl; /** * Constructs a new {@link Message} posted by {@code user} with {@code text} content to a {@code * recipient}. Generates a random ID and uses the current system time for the creation time. */ public Message(String user, String text, String recipient) { - this(UUID.randomUUID(), user, text, System.currentTimeMillis(), recipient); + this(UUID.randomUUID(), user, text, System.currentTimeMillis(), recipient, "none"); } - public Message(UUID id, String user, String text, long timestamp, String recipient) { + public Message(UUID id, String user, String text, long timestamp, String recipient, String imageUrl) { this.id = id; this.user = user; this.text = text; this.timestamp = timestamp; this.recipient = recipient; + this.imageUrl = imageUrl; } public UUID getId() { @@ -62,4 +64,13 @@ public long getTimestamp() { public String getRecipient() { return recipient; } + +public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; +} + +public Object getImageUrl() { + // TODO Auto-generated method stub + return imageUrl; +} } diff --git a/src/main/java/com/google/codeu/servlets/ImageUploadUrlServlet.java b/src/main/java/com/google/codeu/servlets/ImageUploadUrlServlet.java new file mode 100644 index 0000000..f786af2 --- /dev/null +++ b/src/main/java/com/google/codeu/servlets/ImageUploadUrlServlet.java @@ -0,0 +1,26 @@ +package com.google.codeu.servlets; + +import com.google.appengine.api.blobstore.BlobstoreService; +import com.google.appengine.api.blobstore.BlobstoreServiceFactory; +import java.io.IOException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Provides access to a URL that allows a user to upload an image to Blobstore. + */ +@WebServlet("/image-upload-url") +public class ImageUploadUrlServlet extends HttpServlet { + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + + BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); + String uploadUrl = blobstoreService.createUploadUrl("/messages") ; + + response.setContentType("text/html"); + response.getOutputStream().println(uploadUrl); + } +} diff --git a/src/main/java/com/google/codeu/servlets/MessageServlet.java b/src/main/java/com/google/codeu/servlets/MessageServlet.java index f8c36b2..6df938b 100644 --- a/src/main/java/com/google/codeu/servlets/MessageServlet.java +++ b/src/main/java/com/google/codeu/servlets/MessageServlet.java @@ -16,6 +16,12 @@ package com.google.codeu.servlets; +import com.google.appengine.api.blobstore.BlobKey; +import com.google.appengine.api.blobstore.BlobstoreService; +import com.google.appengine.api.blobstore.BlobstoreServiceFactory; +import com.google.appengine.api.images.ImagesServiceFactory; +import com.google.appengine.api.images.ImagesServicePb.ImagesService; +import com.google.appengine.api.images.ServingUrlOptions; import com.google.appengine.api.users.UserService; import com.google.appengine.api.users.UserServiceFactory; import com.google.codeu.data.Datastore; @@ -23,6 +29,8 @@ import com.google.gson.Gson; import java.io.IOException; import java.util.List; +import java.util.Map; + import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -86,6 +94,18 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr String textWithImagesReplaced = text.replaceAll(regex, replacement); Message message = new Message(user, textWithImagesReplaced, recipient); + BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); + Map> blobs = blobstoreService.getUploads(request); + List blobKeys = blobs.get("image"); + + if(blobKeys != null && !blobKeys.isEmpty()) { + BlobKey blobKey = blobKeys.get(0); + com.google.appengine.api.images.ImagesService imagesService = ImagesServiceFactory.getImagesService(); + ServingUrlOptions options = ServingUrlOptions.Builder.withBlobKey(blobKey); + String imageUrl = imagesService.getServingUrl(options); + message.setImageUrl(imageUrl); + } + datastore.storeMessage(message); response.sendRedirect("/user-page.html?user=" + recipient); diff --git a/src/main/webapp/js/user-page-loader.js b/src/main/webapp/js/user-page-loader.js index 2758b86..24a9213 100644 --- a/src/main/webapp/js/user-page-loader.js +++ b/src/main/webapp/js/user-page-loader.js @@ -47,6 +47,33 @@ function showMessageFormIfLoggedIn() { }); } +/** + * Shows the message form if the user is logged in and viewing their own page. + */ +function showMessageFormIfViewingSelf() { + fetch('/login-status') + .then((response) => { + return response.json(); + }) + .then((loginStatus) => { + if (loginStatus.isLoggedIn && + loginStatus.username == parameterUsername) { + fetchImageUploadUrlAndShowForm(); + } + }); +} + +function fetchImageUploadUrlAndShowForm() { + fetch('/image-upload-url') + .then((response) => { + return response.text(); + }) + .then((imageUploadUrl) => { + const messageForm = document.getElementById('message-form'); + messageForm.action = imageUploadUrl; + messageForm.classList.remove('hidden'); + }); +} /** Fetches messages and add them to the page. */ function fetchMessages() { @@ -89,13 +116,18 @@ function buildMessageDiv(message) { messageDiv.appendChild(headerDiv); messageDiv.appendChild(bodyDiv); + if(message.imageUrl){ + bodyDiv.innerHTML += '
'; + bodyDiv.innerHTML += ''; + } return messageDiv; } /** Fetches data and populates the UI of the page. */ function buildUI() { setPageTitle(); - showMessageFormIfLoggedIn(); + //showMessageFormIfLoggedIn(); + showMessageFormIfViewingSelf() fetchMessages(); fetchAboutMe(); } diff --git a/src/main/webapp/user-page.html b/src/main/webapp/user-page.html index 8e3a1c1..59754f3 100644 --- a/src/main/webapp/user-page.html +++ b/src/main/webapp/user-page.html @@ -31,11 +31,14 @@

User Page

-
From 3f225bfe2dbaed2e4545605cc76139eba470502a Mon Sep 17 00:00:00 2001 From: Eyob Date: Mon, 15 Apr 2019 14:17:25 -0400 Subject: [PATCH 3/3] Some changes to Message.java allowing for message rating --- .../java/com/google/codeu/data/Message.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/main/java/com/google/codeu/data/Message.java b/src/main/java/com/google/codeu/data/Message.java index 184e665..3460b95 100644 --- a/src/main/java/com/google/codeu/data/Message.java +++ b/src/main/java/com/google/codeu/data/Message.java @@ -27,6 +27,8 @@ public class Message { private long timestamp; private String recipient; private String imageUrl; + private int positiveVote = 0; + private int negativeVote = 0; /** * Constructs a new {@link Message} posted by {@code user} with {@code text} content to a {@code @@ -73,4 +75,32 @@ public Object getImageUrl() { // TODO Auto-generated method stub return imageUrl; } + +public int getNegativeVote() { + return negativeVote; +} + +public void setNegativeVote(int negativeVote) { + this.negativeVote = negativeVote; +} + +public void incrementNegativeVote() { + this.negativeVote++; +} + +public int getPositiveVote() { + return positiveVote; +} + +public void setPositiveVote(int positiveVote) { + this.positiveVote = positiveVote; +} + +public void incrementPositiveVote() { + this.positiveVote++; +} + +public int getMessageScore() { + return this.positiveVote-this.negativeVote; +} }