aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build.gradle1
-rw-r--r--juick-api/src/main/java/com/juick/api/TGBot.java9
-rw-r--r--juick-core/build.gradle1
-rw-r--r--juick-notifications/src/main/java/com/juick/components/Notifications.java28
-rw-r--r--juick-notifications/src/main/java/com/juick/components/mpns/MPNSError.java29
-rw-r--r--juick-notifications/src/main/java/com/juick/components/mpns/MPNSToken.java29
-rw-r--r--juick-server/build.gradle1
-rw-r--r--juick-server/src/main/java/com/juick/server/protocol/JuickProtocol.java38
-rw-r--r--juick-ws/build.gradle1
-rw-r--r--juick-ws/src/main/java/com/juick/ws/XMPPConnection.java54
-rw-r--r--juick-www/src/main/java/com/juick/www/FacebookLogin.java27
-rw-r--r--juick-www/src/main/java/com/juick/www/TwitterAuth.java10
-rw-r--r--juick-www/src/main/java/com/juick/www/VKontakteLogin.java24
-rw-r--r--juick-www/src/main/java/com/juick/www/facebook/Graph.java43
-rw-r--r--juick-www/src/main/java/com/juick/www/twitter/User.java19
-rw-r--r--juick-www/src/main/java/com/juick/www/vk/GraphResponse.java19
-rw-r--r--juick-www/src/main/java/com/juick/www/vk/Token.java29
-rw-r--r--juick-www/src/main/java/com/juick/www/vk/User.java39
-rw-r--r--juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java7
-rw-r--r--src/test/java/com/juick/json/JSONSerializer.java (renamed from juick-core/src/main/java/com/juick/json/JSONSerializer.java)0
-rw-r--r--src/test/java/com/juick/json/MessageSerializer.java (renamed from juick-core/src/main/java/com/juick/json/MessageSerializer.java)0
-rw-r--r--src/test/java/com/juick/json/PlaceSerializer.java (renamed from juick-core/src/main/java/com/juick/json/PlaceSerializer.java)0
-rw-r--r--src/test/java/com/juick/json/UserSerializer.java (renamed from juick-core/src/main/java/com/juick/json/UserSerializer.java)0
-rw-r--r--src/test/java/com/juick/tests/ApiTests.java3
24 files changed, 311 insertions, 100 deletions
diff --git a/build.gradle b/build.gradle
index f0e83b9b..3af0fdae 100644
--- a/build.gradle
+++ b/build.gradle
@@ -23,6 +23,7 @@ dependencies {
testCompile project(':juick-core')
testCompile project(':juick-www')
testCompile project(':juick-xmpp')
+ testCompile 'org.json:json:20160810'
testCompile 'com.fasterxml.jackson.core:jackson-core:2.8.1'
testCompile 'com.fasterxml.jackson.core:jackson-databind:2.8.1'
testCompile 'org.springframework:spring-jdbc:4.3.4.RELEASE'
diff --git a/juick-api/src/main/java/com/juick/api/TGBot.java b/juick-api/src/main/java/com/juick/api/TGBot.java
index ae3c6b74..882dc821 100644
--- a/juick-api/src/main/java/com/juick/api/TGBot.java
+++ b/juick-api/src/main/java/com/juick/api/TGBot.java
@@ -1,6 +1,6 @@
package com.juick.api;
-import com.juick.json.MessageSerializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.juick.service.MessagesService;
import com.juick.service.TelegramService;
import com.neovisionaries.ws.client.WebSocket;
@@ -16,7 +16,6 @@ import com.pengrad.telegrambot.request.SendMessage;
import com.pengrad.telegrambot.request.SetWebhook;
import com.pengrad.telegrambot.response.SendResponse;
import org.apache.commons.lang3.StringUtils;
-import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,7 +35,7 @@ public class TGBot implements AutoCloseable {
TelegramBot bot;
WebSocket ws;
- MessageSerializer ms = new MessageSerializer();
+ ObjectMapper ms = new ObjectMapper();
@Inject
TelegramService telegramService;
@@ -71,8 +70,8 @@ public class TGBot implements AutoCloseable {
@Override
public void onTextMessage(WebSocket websocket, String text) throws Exception {
super.onTextMessage(websocket, text);
- com.juick.Message jmsg = ms.deserialize(new JSONObject(text));
- logger.info("got jmsg: " + ms.serialize(jmsg).toString());
+ com.juick.Message jmsg = ms.readValue(text, com.juick.Message.class);
+ logger.info("got jmsg: " + ms.writeValueAsString(jmsg));
String msgUrl = formatUrl(jmsg);
if (jmsg.getRid() == 0) {
String msg = formatPost(jmsg);
diff --git a/juick-core/build.gradle b/juick-core/build.gradle
index 134156b2..295a22d3 100644
--- a/juick-core/build.gradle
+++ b/juick-core/build.gradle
@@ -11,7 +11,6 @@ dependencies {
compile 'org.apache.commons:commons-lang3:3.5'
compile 'org.apache.commons:commons-collections4:4.1'
compile 'commons-io:commons-io:2.5'
- compile 'org.json:json:20160810'
}
compileJava.options.encoding = 'UTF-8'
diff --git a/juick-notifications/src/main/java/com/juick/components/Notifications.java b/juick-notifications/src/main/java/com/juick/components/Notifications.java
index cb120ce9..e0155a0a 100644
--- a/juick-notifications/src/main/java/com/juick/components/Notifications.java
+++ b/juick-notifications/src/main/java/com/juick/components/Notifications.java
@@ -17,8 +17,10 @@
*/
package com.juick.components;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.android.gcm.server.*;
-import com.juick.json.MessageSerializer;
+import com.juick.components.mpns.MPNSError;
+import com.juick.components.mpns.MPNSToken;
import com.notnoop.apns.APNS;
import com.notnoop.apns.ApnsService;
import org.apache.commons.lang3.StringEscapeUtils;
@@ -35,7 +37,6 @@ import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.http.util.TextUtils;
-import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.ParameterizedTypeReference;
@@ -71,6 +72,8 @@ public class Notifications implements AutoCloseable {
private final int xmppPort;
private final String xmppPushPassword;
+ private final ObjectMapper mapper;
+
@Inject
private ApnsService apns;
@@ -84,6 +87,7 @@ public class Notifications implements AutoCloseable {
xmppHost = env.getProperty("xmpp_host", "localhost");
xmppPort = NumberUtils.toInt(env.getProperty("xmpp_port"), 5347);
xmppPushPassword = env.getProperty("push_xmpp_password", "");
+ mapper = new ObjectMapper();
}
@PostConstruct
@@ -114,11 +118,11 @@ public class Notifications implements AutoCloseable {
}
if (!regids.isEmpty()) {
- MessageSerializer messageSerializer = new MessageSerializer();
- String json = messageSerializer.serialize(jmsg).toString();
- logger.info(json);
- Message message = new Message.Builder().addData("message", json).build();
try {
+ ObjectMapper messageSerializer = new ObjectMapper();
+ String json = messageSerializer.writeValueAsString(jmsg);
+ logger.info(json);
+ Message message = new Message.Builder().addData("message", json).build();
MulticastResult result = GCMSender.send(message, regids, 3);
List<Result> results = result.getResults();
for (int i = 0; i < results.size(); i++) {
@@ -238,15 +242,15 @@ public class Notifications implements AutoCloseable {
HttpResponse response = client.execute(httppost);
int statusCode = response.getStatusLine().getStatusCode();
String responseContent = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
- JSONObject json = new JSONObject(responseContent);
if (statusCode != 200) {
- throw new IOException(json.opt("error") + ": " + json.opt("error_description"));
+ MPNSError error = mapper.readValue(responseContent, MPNSError.class);
+ throw new IOException(error.getError() + ": " + error.getErrorDescription());
}
- String tokenType = (String) json.get("token_type");
- if (tokenType.length() >= 1) {
- tokenType = Character.toUpperCase(tokenType.charAt(0)) + tokenType.substring(1);
+ MPNSToken token = mapper.readValue(responseContent, MPNSToken.class);
+ if (token.getTokenType().length() >= 1) {
+ token.setTokenType(Character.toUpperCase(token.getTokenType().charAt(0)) + token.getTokenType().substring(1));
}
- return tokenType + " " + json.get("access_token");
+ return token.getTokenType() + " " + token.getAccessToken();
}
void sendWNS(final String wnsToken, final String url, final String xml) throws IOException {
diff --git a/juick-notifications/src/main/java/com/juick/components/mpns/MPNSError.java b/juick-notifications/src/main/java/com/juick/components/mpns/MPNSError.java
new file mode 100644
index 00000000..de27641e
--- /dev/null
+++ b/juick-notifications/src/main/java/com/juick/components/mpns/MPNSError.java
@@ -0,0 +1,29 @@
+package com.juick.components.mpns;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Created by vitalyster on 28.11.2016.
+ */
+public class MPNSError {
+ private String error;
+ private String errorDescription;
+
+ @JsonProperty("error")
+ public String getError() {
+ return error;
+ }
+
+ public void setError(String error) {
+ this.error = error;
+ }
+
+ @JsonProperty("error_description")
+ public String getErrorDescription() {
+ return errorDescription;
+ }
+
+ public void setErrorDescription(String errorDescription) {
+ this.errorDescription = errorDescription;
+ }
+}
diff --git a/juick-notifications/src/main/java/com/juick/components/mpns/MPNSToken.java b/juick-notifications/src/main/java/com/juick/components/mpns/MPNSToken.java
new file mode 100644
index 00000000..68baf9cd
--- /dev/null
+++ b/juick-notifications/src/main/java/com/juick/components/mpns/MPNSToken.java
@@ -0,0 +1,29 @@
+package com.juick.components.mpns;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Created by vitalyster on 28.11.2016.
+ */
+public class MPNSToken {
+ private String tokenType;
+ private String accessToken;
+
+ @JsonProperty("token_type")
+ public String getTokenType() {
+ return tokenType;
+ }
+
+ public void setTokenType(String tokenType) {
+ this.tokenType = tokenType;
+ }
+
+ @JsonProperty("access_token")
+ public String getAccessToken() {
+ return accessToken;
+ }
+
+ public void setAccessToken(String accessToken) {
+ this.accessToken = accessToken;
+ }
+}
diff --git a/juick-server/build.gradle b/juick-server/build.gradle
index 17c292bb..23387506 100644
--- a/juick-server/build.gradle
+++ b/juick-server/build.gradle
@@ -41,7 +41,6 @@ dependencies {
compile 'org.apache.commons:commons-dbcp2:2.1.1'
compile 'com.googlecode.log4jdbc:log4jdbc:1.2'
- compile 'org.json:json:20160810'
compile 'javax.inject:javax.inject:1'
compile 'org.bitbucket.sco0ter.babbler:xmpp-core-client:0ba6c0e2f9'
diff --git a/juick-server/src/main/java/com/juick/server/protocol/JuickProtocol.java b/juick-server/src/main/java/com/juick/server/protocol/JuickProtocol.java
index eb579712..6bd8e11f 100644
--- a/juick-server/src/main/java/com/juick/server/protocol/JuickProtocol.java
+++ b/juick-server/src/main/java/com/juick/server/protocol/JuickProtocol.java
@@ -1,10 +1,11 @@
package com.juick.server.protocol;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.juick.Message;
import com.juick.Tag;
import com.juick.User;
import com.juick.formatters.PlainTextFormatter;
-import com.juick.json.MessageSerializer;
import com.juick.server.*;
import com.juick.server.protocol.annotation.UserCommand;
import com.juick.util.TagUtils;
@@ -22,7 +23,7 @@ import java.util.stream.Collectors;
*/
public class JuickProtocol {
- MessageSerializer json = new MessageSerializer();
+ ObjectMapper json = new ObjectMapper();
JdbcTemplate sql;
String baseUri;
@@ -41,7 +42,7 @@ public class JuickProtocol {
* @throws NoSuchMethodException
*/
public ProtocolReply getReply(User user, String userInput) throws InvocationTargetException,
- IllegalAccessException, NoSuchMethodException {
+ IllegalAccessException, NoSuchMethodException, JsonProcessingException {
Optional<Method> cmd = Arrays.stream(getClass().getDeclaredMethods())
.filter(m -> m.isAnnotationPresent(UserCommand.class))
.filter(m -> Pattern.compile(m.getAnnotation(UserCommand.class).pattern(),
@@ -64,24 +65,24 @@ public class JuickProtocol {
}
}
- public ProtocolReply postMessage(User user, String input) {
+ public ProtocolReply postMessage(User user, String input) throws JsonProcessingException {
List<Tag> tags = TagQueries.fromString(sql, input, false);
String body = input.substring(TagUtils.toString(tags).length());
int mid = MessagesQueries.createMessage(sql, user.getUid(), body, null, tags);
SubscriptionsQueries.subscribeMessage(sql, mid, user.getUid());
//app.events().publishEvent(new JuickMessageEvent(app.messages().getMessage(mid)));
return new ProtocolReply("New message posted.\n#" + mid + " " + baseUri + mid,
- Optional.of(json.serializeList(Collections.singletonList(MessagesQueries.getMessage(sql, mid)))));
+ Optional.of(json.writeValueAsString(Collections.singletonList(MessagesQueries.getMessage(sql, mid)))));
}
@UserCommand(pattern = "^#(\\++)$", help = "#+ - Show last Juick messages (#++ - second page, ...)")
- public ProtocolReply commandLast(User user, String... arguments) {
+ public ProtocolReply commandLast(User user, String... arguments) throws JsonProcessingException {
// number of + is the page count
int page = arguments[0].length() - 1;
List<Integer> mids = MessagesQueries.getAll(sql, user.getUid(), page);
List<Message> messages = MessagesQueries.getMessages(sql, mids);
return new ProtocolReply("Last messages: \n" + String.join("\n", messages.stream().map(PlainTextFormatter::formatPost)
- .collect(Collectors.toList())), Optional.of(json.serializeList(messages)));
+ .collect(Collectors.toList())), Optional.of(json.writeValueAsString(messages)));
}
@UserCommand(pattern = "^\\s*bl\\s*$", patternFlags = Pattern.CASE_INSENSITIVE,
@@ -182,19 +183,19 @@ public class JuickProtocol {
}
@UserCommand(pattern = "!", help = "! - Show your favorite messages")
- public ProtocolReply commandFavorites(User currentUser, String... args) {
+ public ProtocolReply commandFavorites(User currentUser, String... args) throws JsonProcessingException {
List<Integer> mids = MessagesQueries.getUserRecommendations(sql, currentUser.getUid(), 0);
if (mids.size() > 0) {
List<Message> messages = MessagesQueries.getMessages(sql, mids);
return new ProtocolReply("Favorite messages: \n" + String.join("\n", messages.stream().map(PlainTextFormatter::formatPost)
- .collect(Collectors.toList())), Optional.of(json.serializeList(messages)));
+ .collect(Collectors.toList())), Optional.of(json.writeValueAsString(messages)));
}
return new ProtocolReply("No favorite messages, try to \"like\" something ;)", Optional.empty());
}
@UserCommand(pattern = "^\\@([^\\s\\n\\+]+)(\\+?)$",
help = "@username+ - Show user's info and last 10 messages (@username++ - second page, ..)")
- public ProtocolReply commandUser(User user, String... arguments) {
+ public ProtocolReply commandUser(User user, String... arguments) throws JsonProcessingException {
User blogUser = UserQueries.getUserByName(sql, arguments[0]);
int page = arguments[1].length();
if (blogUser != null) {
@@ -203,7 +204,7 @@ public class JuickProtocol {
return new ProtocolReply(String.format("Last messages from @%s:\n%s", arguments[0],
String.join("\n", messages.stream()
.map(Object::toString).collect(Collectors.toList()))),
- Optional.of(json.serializeList(messages)));
+ Optional.of(json.writeValueAsString(messages)));
}
return new ProtocolReply("User not found", Optional.empty());
}
@@ -230,7 +231,7 @@ public class JuickProtocol {
}
@UserCommand(pattern = "^(#+)$", help = "# - Show last messages from your feed (## - second page, ...)")
- public ProtocolReply commandMyFeed(User user, String... arguments) {
+ public ProtocolReply commandMyFeed(User user, String... arguments) throws JsonProcessingException {
// number of # is the page count
int page = arguments[0].length() - 1;
List<Integer> mids = MessagesQueries.getMyFeed(sql, user.getUid(), page);
@@ -238,7 +239,7 @@ public class JuickProtocol {
// TODO: add instructions for empty feed
return new ProtocolReply("Your feed: \n" + String.join("\n",
messages.stream().map(PlainTextFormatter::formatPost).collect(Collectors.toList())),
- Optional.of(json.serializeList(messages)));
+ Optional.of(json.writeValueAsString(messages)));
}
@UserCommand(pattern = "^\\s*(on|off)\\s*$", patternFlags = Pattern.CASE_INSENSITIVE,
@@ -333,7 +334,7 @@ public class JuickProtocol {
}
@UserCommand(pattern = "^#(\\d+)(\\+?)$", help = "#1234 - Show message (#1234+ - message with replies)")
- public ProtocolReply commandShow(User user, String... arguments) {
+ public ProtocolReply commandShow(User user, String... arguments) throws JsonProcessingException {
boolean showReplies = arguments[1].length() > 0;
int mid;
try {
@@ -348,15 +349,16 @@ public class JuickProtocol {
replies.add(0, msg);
return new ProtocolReply(String.join("\n",
replies.stream().map(PlainTextFormatter::formatPost).collect(Collectors.toList())),
- Optional.of(json.serializeList(replies)));
+ Optional.of(json.writeValueAsString(replies)));
}
- return new ProtocolReply(PlainTextFormatter.formatPost(msg), Optional.of(json.serializeList(Collections.singletonList(msg))));
+ return new ProtocolReply(PlainTextFormatter.formatPost(msg),
+ Optional.of(json.writeValueAsString(Collections.singletonList(msg))));
}
return new ProtocolReply("Message not found", Optional.empty());
}
@UserCommand(pattern = "^(#|\\.)(\\d+)((\\.|\\-|\\/)(\\d+))?\\s([\\s\\S]+)",
help = "#1234 *tag *tag2 - edit tags\n#1234 text - reply to message")
- public ProtocolReply EditOrReply(User user, String... args) {
+ public ProtocolReply EditOrReply(User user, String... args) throws JsonProcessingException {
int mid;
try {
mid = Integer.parseInt(args[1]);
@@ -381,7 +383,7 @@ public class JuickProtocol {
int newrid = MessagesQueries.createReply(sql, mid, rid, user.getUid(), txt, null);
return new ProtocolReply("Reply posted.\n#" + mid + "/" + newrid + " "
+ baseUri + mid + "/" + newrid,
- Optional.of(json.serializeList(Collections.singletonList(MessagesQueries.getReply(sql, mid, newrid)))));
+ Optional.of(json.writeValueAsString(Collections.singletonList(MessagesQueries.getReply(sql, mid, newrid)))));
}
}
diff --git a/juick-ws/build.gradle b/juick-ws/build.gradle
index b235a2c1..2326a13b 100644
--- a/juick-ws/build.gradle
+++ b/juick-ws/build.gradle
@@ -15,6 +15,7 @@ def springFrameworkVersion = '4.3.4.RELEASE'
dependencies {
compile project(':juick-server')
+ compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.6.3'
compile "org.springframework:spring-webmvc:${springFrameworkVersion}"
compile "org.springframework:spring-websocket:${springFrameworkVersion}"
compile 'com.mitchellbosecke:pebble-spring4:2.3.0'
diff --git a/juick-ws/src/main/java/com/juick/ws/XMPPConnection.java b/juick-ws/src/main/java/com/juick/ws/XMPPConnection.java
index 30dad3f3..2019ec0a 100644
--- a/juick-ws/src/main/java/com/juick/ws/XMPPConnection.java
+++ b/juick-ws/src/main/java/com/juick/ws/XMPPConnection.java
@@ -1,7 +1,9 @@
package com.juick.ws;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.juick.User;
-import com.juick.json.MessageSerializer;
import com.juick.server.MessagesQueries;
import com.juick.server.SubscriptionsQueries;
import org.apache.commons.lang3.math.NumberUtils;
@@ -31,7 +33,7 @@ public class XMPPConnection implements AutoCloseable {
private final JdbcTemplate jdbc;
private final WebsocketComponent wsHandler;
private final String xmppPassword;
- private final MessageSerializer ms;
+ private final ObjectMapper ms;
private final int xmppPort;
private final String wsJid;
@@ -51,29 +53,33 @@ public class XMPPConnection implements AutoCloseable {
xmppPort = NumberUtils.toInt(env.getProperty("xmpp_port"), 5347);
wsJid = env.getProperty("ws_jid", "ws.juick.local");
- ms = new MessageSerializer();
+ ms = new XmlMapper();
XmppSessionConfiguration configuration = XmppSessionConfiguration.builder()
.extensions(Extension.of(com.juick.Message.class))
.build();
xmpp = ExternalComponent.create(wsJid, xmppPassword, configuration, "localhost", xmppPort);
xmpp.addInboundMessageListener(e -> {
- Message msg = e.getMessage();
- com.juick.Message jmsg = msg.getExtension(com.juick.Message.class);
- if (jmsg != null) {
- logger.info("got msg: " + ms.serialize(jmsg).toString());
- if (jmsg.getMid() == 0) {
- int uid_to = NumberUtils.toInt(msg.getTo().getLocal(), 0);
- if (uid_to > 0) {
- onJuickPM(uid_to, jmsg);
+ try {
+ Message msg = e.getMessage();
+ com.juick.Message jmsg = msg.getExtension(com.juick.Message.class);
+ if (jmsg != null) {
+ logger.info("got msg: " + ms.writeValueAsString(jmsg));
+ if (jmsg.getMid() == 0) {
+ int uid_to = NumberUtils.toInt(msg.getTo().getLocal(), 0);
+ if (uid_to > 0) {
+ onJuickPM(uid_to, jmsg);
+ }
+ } else if (jmsg.getRid() == 0) {
+ onJuickMessagePost(jmsg);
+ } else {
+ // to get quote
+ com.juick.Message reply = MessagesQueries.getReply(jdbc, jmsg.getMid(), jmsg.getRid());
+ onJuickMessageReply(reply);
}
- } else if (jmsg.getRid() == 0) {
- onJuickMessagePost(jmsg);
- } else {
- // to get quote
- com.juick.Message reply = MessagesQueries.getReply(jdbc, jmsg.getMid(), jmsg.getRid());
- onJuickMessageReply(reply);
}
+ } catch (JsonProcessingException ex) {
+ logger.error("mapper exception", ex);
}
});
try {
@@ -91,10 +97,8 @@ public class XMPPConnection implements AutoCloseable {
logger.info("XmppSession on WS destroyed");
}
- MessageSerializer messageSerializer = new MessageSerializer();
-
- private void onJuickPM(final int uid_to, final com.juick.Message jmsg) {
- String json = messageSerializer.serialize(jmsg).toString();
+ private void onJuickPM(final int uid_to, final com.juick.Message jmsg) throws JsonProcessingException {
+ String json = ms.writeValueAsString(jmsg);
synchronized (wsHandler.getClients()) {
wsHandler.getClients().stream().filter(c -> !c.legacy && c.visitor.getUid() == uid_to).forEach(c -> {
try {
@@ -107,8 +111,8 @@ public class XMPPConnection implements AutoCloseable {
}
}
- private void onJuickMessagePost(final com.juick.Message jmsg) {
- String json = messageSerializer.serialize(jmsg).toString();
+ private void onJuickMessagePost(final com.juick.Message jmsg) throws JsonProcessingException {
+ String json = ms.writeValueAsString(jmsg);
List<Integer> uids = SubscriptionsQueries.getSubscribedUsers(jdbc, jmsg.getUser().getUid(), jmsg.getMid())
.stream().map(User::getUid).collect(Collectors.toList());
synchronized (wsHandler.getClients()) {
@@ -136,8 +140,8 @@ public class XMPPConnection implements AutoCloseable {
}
}
- private void onJuickMessageReply(final com.juick.Message jmsg) {
- String json = messageSerializer.serialize(jmsg).toString();
+ private void onJuickMessageReply(final com.juick.Message jmsg) throws JsonProcessingException {
+ String json = ms.writeValueAsString(jmsg);
List<Integer> threadUsers =
SubscriptionsQueries.getUsersSubscribedToComments(jdbc, jmsg.getMid(), jmsg.getUser().getUid())
.stream().map(User::getUid).collect(Collectors.toList());
diff --git a/juick-www/src/main/java/com/juick/www/FacebookLogin.java b/juick-www/src/main/java/com/juick/www/FacebookLogin.java
index 2b67dd5c..b42bb23b 100644
--- a/juick-www/src/main/java/com/juick/www/FacebookLogin.java
+++ b/juick-www/src/main/java/com/juick/www/FacebookLogin.java
@@ -17,8 +17,11 @@
*/
package com.juick.www;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.juick.server.UserQueries;
-import org.json.JSONObject;
+import com.juick.www.facebook.Graph;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.EmptyResultDataAccessException;
@@ -43,10 +46,12 @@ public class FacebookLogin {
private final String FACEBOOK_APPID;
private final String FACEBOOK_SECRET;
private final String FACEBOOK_REDIRECT = "http://juick.com/_fblogin";
+ private final ObjectMapper mapper;
public FacebookLogin(String ApplicationID, String secret) {
this.FACEBOOK_APPID = ApplicationID;
this.FACEBOOK_SECRET = secret;
+ mapper = new ObjectMapper();
}
protected void doGet(JdbcTemplate sql, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
@@ -94,24 +99,16 @@ public class FacebookLogin {
}
try {
- JSONObject json = new JSONObject(graph);
- String fbIDStr = json.getString("id");
- String fbName = json.getString("name");
- String fbLink = json.getString("link");
- boolean fbVerified = json.getBoolean("verified");
-
- long fbID = 0;
- if (fbIDStr != null && !fbIDStr.isEmpty()) {
- fbID = Long.parseLong(fbIDStr);
- }
+ Graph fb = mapper.readValue(graph, Graph.class);
- if (fbID == 0 || fbName == null || fbLink == null || fbName.isEmpty() || fbLink.isEmpty()) {
+ long fbID = NumberUtils.toLong(fb.getId(), 0);
+ if (fbID == 0 || StringUtils.isBlank(fb.getName()) || StringUtils.isBlank(fb.getLink())) {
throw new Exception();
}
int uid = getUIDbyFBID(sql, fbID);
if (uid > 0) {
- if (!updateDB(sql, fbID, token, fbName, fbLink)) {
+ if (!updateDB(sql, fbID, token, fb.getName(), fb.getLink())) {
throw new Exception();
}
Cookie c = new Cookie("hash", UserQueries.getHashByUID(sql, uid));
@@ -119,9 +116,9 @@ public class FacebookLogin {
response.addCookie(c);
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("Location", "/");
- } else if (fbVerified) {
+ } else if (fb.getVerified()) {
String loginhash = UUID.randomUUID().toString();
- if (!insertDB(sql, fbID, loginhash, token, fbName, fbLink)) {
+ if (!insertDB(sql, fbID, loginhash, token, fb.getName(), fb.getLink())) {
throw new Exception();
}
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
diff --git a/juick-www/src/main/java/com/juick/www/TwitterAuth.java b/juick-www/src/main/java/com/juick/www/TwitterAuth.java
index 5ea58eb3..c6aaf9a1 100644
--- a/juick-www/src/main/java/com/juick/www/TwitterAuth.java
+++ b/juick-www/src/main/java/com/juick/www/TwitterAuth.java
@@ -1,5 +1,6 @@
package com.juick.www;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.scribejava.apis.TwitterApi;
import com.github.scribejava.core.builder.ServiceBuilder;
import com.github.scribejava.core.model.OAuth1AccessToken;
@@ -8,7 +9,6 @@ import com.github.scribejava.core.model.OAuthRequest;
import com.github.scribejava.core.model.Verb;
import com.github.scribejava.core.oauth.OAuth10aService;
import com.juick.server.UserQueries;
-import org.json.JSONObject;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.servlet.ServletException;
@@ -26,9 +26,12 @@ public class TwitterAuth {
private String consumerKey, consumerSecret;
+ private final ObjectMapper mapper;
+
public TwitterAuth(String consumerKey, String consumerSecret) {
this.consumerKey = consumerKey;
this.consumerSecret = consumerSecret;
+ mapper = new ObjectMapper();
}
protected void doGet(JdbcTemplate sql, HttpServletRequest request, HttpServletResponse response)
@@ -72,10 +75,9 @@ public class TwitterAuth {
OAuth1AccessToken accessToken = oAuthService.getAccessToken(requestToken, verifier);
OAuthRequest oAuthRequest = new OAuthRequest(Verb.GET, VERIFY_URL, oAuthService);
oAuthService.signRequest(accessToken, oAuthRequest);
- JSONObject jsonResponse = new JSONObject(oAuthRequest.send().getBody());
- String screenName = jsonResponse.getString("screen_name");
+ com.juick.www.twitter.User twitterUser = mapper.readValue(oAuthRequest.send().getBody(), com.juick.www.twitter.User.class);
if (UserQueries.linkTwitterAccount(sql, user, accessToken.getToken(), accessToken.getTokenSecret(),
- screenName)) {
+ twitterUser.getScreenName())) {
response.setStatus(HttpServletResponse.SC_FOUND);
response.setHeader("Location", "http://juick.com/settings");
} else {
diff --git a/juick-www/src/main/java/com/juick/www/VKontakteLogin.java b/juick-www/src/main/java/com/juick/www/VKontakteLogin.java
index f0010ac8..83619b2a 100644
--- a/juick-www/src/main/java/com/juick/www/VKontakteLogin.java
+++ b/juick-www/src/main/java/com/juick/www/VKontakteLogin.java
@@ -17,9 +17,9 @@
*/
package com.juick.www;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.juick.server.UserQueries;
-import org.json.JSONException;
-import org.json.JSONObject;
+import com.juick.www.vk.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.EmptyResultDataAccessException;
@@ -43,6 +43,8 @@ public class VKontakteLogin {
private static final String VK_SECRET = "z2afNI8jA5lIpZ2jsTm1";
private static final String VK_REDIRECT = "http://juick.com/_vklogin";
+ private final ObjectMapper mapper = new ObjectMapper();
+
protected void doGet(JdbcTemplate sql, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code = request.getParameter("code");
if (code == null || code.equals("")) {
@@ -60,15 +62,9 @@ public class VKontakteLogin {
}
String token = null;
long vkID = 0;
- try {
- JSONObject json = new JSONObject(tokenjson);
- token = json.getString("access_token");
- vkID = json.getLong("user_id");
- } catch (JSONException e) {
- logger.error("VK TOKEN EXCEPTION: ", e);
- response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- return;
- }
+ Token json = mapper.readValue(tokenjson, Token.class);
+ token = json.getAccessToken();
+ vkID = json.getUserId();
if (token == null || vkID == 0) {
logger.error("VK TOKEN EMPTY: " + tokenjson);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
@@ -85,9 +81,9 @@ public class VKontakteLogin {
}
try {
- JSONObject json = new JSONObject(graph).getJSONArray("response").getJSONObject(0);
- String vkName = json.getString("first_name") + " " + json.getString("last_name");
- String vkLink = json.getString("screen_name");
+ com.juick.www.vk.User jsonUser = mapper.readValue(graph, GraphResponse.class).getUser();
+ String vkName = jsonUser.getFirstName() + " " + jsonUser.getLastName();
+ String vkLink = jsonUser.getScreenName();
if (vkName == null || vkLink == null || vkName.isEmpty() || vkName.length() == 1 || vkLink.isEmpty()) {
throw new Exception();
diff --git a/juick-www/src/main/java/com/juick/www/facebook/Graph.java b/juick-www/src/main/java/com/juick/www/facebook/Graph.java
new file mode 100644
index 00000000..b5827751
--- /dev/null
+++ b/juick-www/src/main/java/com/juick/www/facebook/Graph.java
@@ -0,0 +1,43 @@
+package com.juick.www.facebook;
+
+/**
+ * Created by vitalyster on 28.11.2016.
+ */
+public class Graph {
+ private String id;
+ private String name;
+ private String link;
+ private boolean verified;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getLink() {
+ return link;
+ }
+
+ public void setLink(String link) {
+ this.link = link;
+ }
+
+ public boolean getVerified() {
+ return verified;
+ }
+
+ public void setVerified(boolean verified) {
+ this.verified = verified;
+ }
+}
diff --git a/juick-www/src/main/java/com/juick/www/twitter/User.java b/juick-www/src/main/java/com/juick/www/twitter/User.java
new file mode 100644
index 00000000..47b90f9a
--- /dev/null
+++ b/juick-www/src/main/java/com/juick/www/twitter/User.java
@@ -0,0 +1,19 @@
+package com.juick.www.twitter;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Created by vitalyster on 28.11.2016.
+ */
+public class User {
+ private String screenName;
+
+ @JsonProperty("screen_name")
+ public String getScreenName() {
+ return screenName;
+ }
+
+ public void setScreenName(String screenName) {
+ this.screenName = screenName;
+ }
+}
diff --git a/juick-www/src/main/java/com/juick/www/vk/GraphResponse.java b/juick-www/src/main/java/com/juick/www/vk/GraphResponse.java
new file mode 100644
index 00000000..f1985a91
--- /dev/null
+++ b/juick-www/src/main/java/com/juick/www/vk/GraphResponse.java
@@ -0,0 +1,19 @@
+package com.juick.www.vk;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Created by vitalyster on 28.11.2016.
+ */
+public class GraphResponse {
+ private User user;
+
+ @JsonValue
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+}
diff --git a/juick-www/src/main/java/com/juick/www/vk/Token.java b/juick-www/src/main/java/com/juick/www/vk/Token.java
new file mode 100644
index 00000000..abeb7c96
--- /dev/null
+++ b/juick-www/src/main/java/com/juick/www/vk/Token.java
@@ -0,0 +1,29 @@
+package com.juick.www.vk;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Created by vitalyster on 28.11.2016.
+ */
+public class Token {
+ private Long userId;
+ private String accessToken;
+
+ @JsonProperty("user_id")
+ public Long getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Long userId) {
+ this.userId = userId;
+ }
+
+ @JsonProperty("access_token")
+ public String getAccessToken() {
+ return accessToken;
+ }
+
+ public void setAccessToken(String accessToken) {
+ this.accessToken = accessToken;
+ }
+}
diff --git a/juick-www/src/main/java/com/juick/www/vk/User.java b/juick-www/src/main/java/com/juick/www/vk/User.java
new file mode 100644
index 00000000..c197da2e
--- /dev/null
+++ b/juick-www/src/main/java/com/juick/www/vk/User.java
@@ -0,0 +1,39 @@
+package com.juick.www.vk;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Created by vitalyster on 28.11.2016.
+ */
+public class User {
+ private String firstName;
+ private String lastName;
+ private String screenName;
+
+ @JsonProperty("first_name")
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ @JsonProperty("last_name")
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ @JsonProperty("screen_name")
+ public String getScreenName() {
+ return screenName;
+ }
+
+ public void setScreenName(String screenName) {
+ this.screenName = screenName;
+ }
+}
diff --git a/juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java b/juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java
index 43ed3dde..15ba073e 100644
--- a/juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java
+++ b/juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java
@@ -1,5 +1,6 @@
package com.juick.components;
+import com.fasterxml.jackson.core.JsonProcessingException;
import com.juick.User;
import com.juick.server.UserQueries;
import com.juick.server.helpers.UserInfo;
@@ -78,16 +79,14 @@ public class XMPPBot implements AutoCloseable {
replyMessage.setBody(reply.getDescription());
replyMessage.setFrom(juickJid);
component.send(replyMessage);
- } catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException ex) {
+ } catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException | JsonProcessingException ex) {
logger.warn("unhandled error", ex);
}
}
});
component.connect();
- } catch (XmppException e) {
+ } catch (XmppException | IOException e) {
logger.error("bot connection error", e);
- } catch (IOException e) {
- logger.error("bot initialization error", e);
}
}
diff --git a/juick-core/src/main/java/com/juick/json/JSONSerializer.java b/src/test/java/com/juick/json/JSONSerializer.java
index 3dc9e04e..3dc9e04e 100644
--- a/juick-core/src/main/java/com/juick/json/JSONSerializer.java
+++ b/src/test/java/com/juick/json/JSONSerializer.java
diff --git a/juick-core/src/main/java/com/juick/json/MessageSerializer.java b/src/test/java/com/juick/json/MessageSerializer.java
index ebc3b0b0..ebc3b0b0 100644
--- a/juick-core/src/main/java/com/juick/json/MessageSerializer.java
+++ b/src/test/java/com/juick/json/MessageSerializer.java
diff --git a/juick-core/src/main/java/com/juick/json/PlaceSerializer.java b/src/test/java/com/juick/json/PlaceSerializer.java
index f433f7f0..f433f7f0 100644
--- a/juick-core/src/main/java/com/juick/json/PlaceSerializer.java
+++ b/src/test/java/com/juick/json/PlaceSerializer.java
diff --git a/juick-core/src/main/java/com/juick/json/UserSerializer.java b/src/test/java/com/juick/json/UserSerializer.java
index 120645a6..120645a6 100644
--- a/juick-core/src/main/java/com/juick/json/UserSerializer.java
+++ b/src/test/java/com/juick/json/UserSerializer.java
diff --git a/src/test/java/com/juick/tests/ApiTests.java b/src/test/java/com/juick/tests/ApiTests.java
index b80b9eb9..727447e0 100644
--- a/src/test/java/com/juick/tests/ApiTests.java
+++ b/src/test/java/com/juick/tests/ApiTests.java
@@ -2,6 +2,7 @@ package com.juick.tests;
import ch.vorburger.exec.ManagedProcessException;
import ch.vorburger.mariadb4j.DB;
+import com.fasterxml.jackson.core.JsonProcessingException;
import com.juick.Message;
import com.juick.Tag;
import com.juick.User;
@@ -100,7 +101,7 @@ public class ApiTests {
}
@Test
- public void protocolTests() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException, ParseException {
+ public void protocolTests() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException, ParseException, JsonProcessingException {
String baseUri = "http://localhost/";
JuickProtocol protocol = new JuickProtocol(jdbc, baseUri);
MessageSerializer json = new MessageSerializer();