diff --git a/src/main/java/org/gcube/social_networking/socialutillibrary/MessageParser.java b/src/main/java/org/gcube/social_networking/socialutillibrary/MessageParser.java new file mode 100644 index 0000000..70f113f --- /dev/null +++ b/src/main/java/org/gcube/social_networking/socialutillibrary/MessageParser.java @@ -0,0 +1,61 @@ +package org.gcube.social_networking.socialutillibrary; + +import java.io.StringWriter; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import org.gcube.socialnetworking.token.ReplaceableToken; +import org.gcube.socialnetworking.token.TagToken; +import org.gcube.socialnetworking.token.Token; +import org.gcube.socialnetworking.token.URLToken; + +public class MessageParser { + + private final String originalMessage; + + private StringWriter stringWriter; + private List tokens; + + public MessageParser(String message) { + this.originalMessage = message; + } + + public List getTokens() { + if(tokens==null){ + tokens = new ArrayList<>(); + SocialStringTokenizer socialStringTokenizer = new SocialStringTokenizer(originalMessage); + for(Token token : socialStringTokenizer.getTokens()) { + String tokenString = token.getToken(); + if(tokenString.startsWith("#")) { + TagToken tagToken = new TagToken(token); + tokens.add(tagToken); + continue; + } + + URL url = URLToken.isURL(tokenString); + if(url!=null) { + URLToken urlToken = new URLToken(token, url); + tokens.add(urlToken); + continue; + } + + ReplaceableToken replaceableToken = new ReplaceableToken(token); + tokens.add(replaceableToken); + } + } + return tokens; + } + + public String getParsedMessage() { + if(stringWriter==null) { + stringWriter = new StringWriter(); + for(ReplaceableToken token : getTokens()) { + stringWriter.append(token.getTokenReplacement()); + stringWriter.append(token.getDelimiter()); + } + } + return stringWriter.toString(); + } + +} diff --git a/src/main/java/org/gcube/social_networking/socialutillibrary/SocialStringTokenizer.java b/src/main/java/org/gcube/social_networking/socialutillibrary/SocialStringTokenizer.java new file mode 100644 index 0000000..cb1d4eb --- /dev/null +++ b/src/main/java/org/gcube/social_networking/socialutillibrary/SocialStringTokenizer.java @@ -0,0 +1,49 @@ +package org.gcube.social_networking.socialutillibrary; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.gcube.socialnetworking.token.Token; + +public class SocialStringTokenizer { + + private final String originalString; + + private Pattern pattern; + private Matcher matcher; + + private List tokens; + + public SocialStringTokenizer(String string) { + this.originalString = string; + this.pattern = Pattern.compile("\\s"); + this.matcher = pattern.matcher(originalString); + } + + public List getTokens() { + if(tokens==null) { + tokens = new ArrayList<>(); + int tokenStart = 0; + while(matcher.find()) { + int tokenEnd = matcher.start(); + String tokenString = originalString.substring(tokenStart, tokenEnd); + int delimiterStart = tokenEnd; + int delimiterEnd = matcher.end(); + String delimiter = originalString.substring(delimiterStart, delimiterEnd); + Token token = new Token(tokenString, delimiter, tokenStart, tokenEnd); + tokens.add(token); + tokenStart = delimiterEnd; + } + if(tokenStart!=originalString.length()){ + int tokenEnd = originalString.length(); + String tokenString = originalString.substring(tokenStart, tokenEnd); + Token token = new Token(tokenString, "", tokenStart, tokenEnd); + tokens.add(token); + } + } + return tokens; + } + +} diff --git a/src/main/java/org/gcube/socialnetworking/token/ReplaceableToken.java b/src/main/java/org/gcube/socialnetworking/token/ReplaceableToken.java new file mode 100644 index 0000000..6ad6cc3 --- /dev/null +++ b/src/main/java/org/gcube/socialnetworking/token/ReplaceableToken.java @@ -0,0 +1,21 @@ +package org.gcube.socialnetworking.token; + +public class ReplaceableToken extends Token { + + protected String tokenReplacement; + + public ReplaceableToken(Token token) { + super(token.token, token.delimiter, token.start, token.end); + this.tokenReplacement = token.token; + } + + public ReplaceableToken(Token token, String tokenReplacement) { + super(token.token, token.delimiter, token.start, token.end); + this.tokenReplacement = tokenReplacement; + } + + public String getTokenReplacement() { + return tokenReplacement; + } + +} diff --git a/src/main/java/org/gcube/socialnetworking/token/TagToken.java b/src/main/java/org/gcube/socialnetworking/token/TagToken.java new file mode 100644 index 0000000..bc0622d --- /dev/null +++ b/src/main/java/org/gcube/socialnetworking/token/TagToken.java @@ -0,0 +1,9 @@ +package org.gcube.socialnetworking.token; + +public class TagToken extends ReplaceableToken { + + public TagToken(Token token) { + super(token, "#MY_MASSI_TAG"); + } + +} diff --git a/src/main/java/org/gcube/socialnetworking/token/Token.java b/src/main/java/org/gcube/socialnetworking/token/Token.java new file mode 100644 index 0000000..fc961f0 --- /dev/null +++ b/src/main/java/org/gcube/socialnetworking/token/Token.java @@ -0,0 +1,45 @@ +package org.gcube.socialnetworking.token; + +public class Token{ + + final String token; + final String delimiter; + final int start; + final int end; + + /** + * @param token the Token String + * @param delimiter the delimiter after token + * @param start the start point in the original String + * @param end the end point in the original String + */ + public Token(String token, String delimiter, int start, int end){ + this.token = token; + this.delimiter = delimiter; + this.start = start; + this.end = end; + } + + public String getToken() { + return token; + } + + public String getDelimiter() { + return delimiter; + } + + public int getStart() { + return start; + } + + public int getEnd() { + return end; + } + + @Override + public String toString() { + return String.format("Token '%s', Subsequent delimiter '%s', Start '%d', End '%d'", token, delimiter, start, end); + } + + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/socialnetworking/token/URLToken.java b/src/main/java/org/gcube/socialnetworking/token/URLToken.java new file mode 100644 index 0000000..3ab4d83 --- /dev/null +++ b/src/main/java/org/gcube/socialnetworking/token/URLToken.java @@ -0,0 +1,33 @@ +package org.gcube.socialnetworking.token; + +import java.net.MalformedURLException; +import java.net.URL; + +public class URLToken extends ReplaceableToken { + + + private String getReplacement(URL url) { + StringBuilder sb = new StringBuilder(); + return sb.toString(); + } + + public URLToken(Token token, URL url) { + super(token); + this.tokenReplacement = "___URL____"; + } + + + public static URL isURL(String string) { + if(string.startsWith("www.")) { + string = "http://" + string; + } + try { + return new URL(string); + } catch(MalformedURLException e) { + // not an URL + return null; + } + + } + +}