Browse Source

Merge 363c514a3b1b8a2d05703dc17ad5c82beb10671b into bd1fca498ef63809a3a7a9e8867a8c20219bafbb

Patrick Glavin 6 years ago
parent
commit
d33bc3482e
No account linked to committer's email

+ 11
- 5
Client/Client.iml View File

@@ -5,14 +5,20 @@
5 5
     <output-test url="file://$MODULE_DIR$/target/test-classes" />
6 6
     <content url="file://$MODULE_DIR$">
7 7
       <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
8
-      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
9
-      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
10 8
       <excludeFolder url="file://$MODULE_DIR$/target" />
11 9
     </content>
12 10
     <orderEntry type="inheritedJdk" />
13 11
     <orderEntry type="sourceFolder" forTests="false" />
14
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.8.6" level="project" />
15
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.8.0" level="project" />
16
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.8.6" level="project" />
12
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.4" level="project" />
13
+    <orderEntry type="library" name="Maven: com.squareup.okhttp:okhttp:2.7.5" level="project" />
14
+    <orderEntry type="library" name="Maven: com.squareup.okio:okio:1.6.0" level="project" />
15
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.4" level="project" />
16
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
17
+    <orderEntry type="library" scope="TEST" name="Maven: com.squareup.okhttp3:mockwebserver:3.10.0" level="project" />
18
+    <orderEntry type="library" scope="TEST" name="Maven: com.squareup.okhttp3:okhttp:3.10.0" level="project" />
19
+    <orderEntry type="library" scope="TEST" name="Maven: org.bouncycastle:bcprov-jdk15on:1.50" level="project" />
20
+    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
21
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
22
+    <orderEntry type="library" name="Maven: log4j:log4j:1.2.17" level="project" />
17 23
   </component>
18 24
 </module>

+ 16
- 0
Client/pom.xml View File

@@ -11,5 +11,21 @@
11 11
 
12 12
     <artifactId>Client</artifactId>
13 13
 
14
+    <dependencies>
15
+        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
16
+        <dependency>
17
+            <groupId>com.fasterxml.jackson.core</groupId>
18
+            <artifactId>jackson-core</artifactId>
19
+            <version>2.9.4</version>
20
+        </dependency>
21
+        <!-- https://mvnrepository.com/artifact/com.squareup.okhttp/okhttp -->
22
+        <dependency>
23
+            <groupId>com.squareup.okhttp</groupId>
24
+            <artifactId>okhttp</artifactId>
25
+            <version>2.7.5</version>
26
+        </dependency>
27
+    </dependencies>
28
+
29
+
14 30
 
15 31
 </project>

+ 14
- 0
Client/src/main/java/DMGetter.java View File

@@ -0,0 +1,14 @@
1
+public class DMGetter implements Runnable{
2
+    private User user;
3
+    private YouAreEll webber;
4
+
5
+    public DMGetter(User user, YouAreEll webber) {
6
+        this.user = user;
7
+        this.webber = webber;
8
+    }
9
+
10
+    public void run() {
11
+        String results = webber.get_DMs(user);
12
+        SimpleShell.prettyPrintMessages(results);
13
+    }
14
+}

+ 53
- 0
Client/src/main/java/DMScraper.java View File

@@ -0,0 +1,53 @@
1
+import com.fasterxml.jackson.databind.ObjectMapper;
2
+
3
+import java.io.IOException;
4
+import java.util.ArrayList;
5
+
6
+public class DMScraper implements Runnable{
7
+    private ArrayList<Message> messageList;
8
+    private User user;
9
+    private YouAreEll webber;
10
+
11
+    public DMScraper(User user, YouAreEll webber) {
12
+        this.user = user;
13
+        this.webber = webber;
14
+    }
15
+
16
+    public void run() {
17
+        this.messageList = new ArrayList<Message>();
18
+        ObjectMapper objectMapper = new ObjectMapper();
19
+        Message[] incoming = new Message[0];
20
+        String scrape;
21
+        while (true){
22
+            waitN(5000);
23
+            scrape = webber.get_DMs(user);
24
+            waitN(100);
25
+            try {
26
+                incoming = objectMapper.readValue(scrape, Message[].class);
27
+            } catch (IOException e) {
28
+                e.printStackTrace();
29
+            }
30
+            for (Message message:incoming) {
31
+                if (newMessageCheck(message)){
32
+                    System.out.println("New DM!\n" + message.getFromid() + " says: " + message.getMessage());
33
+                    this.messageList.add(message);
34
+                }
35
+            }
36
+        }
37
+    }
38
+
39
+    private void waitN(int i) {
40
+        try {
41
+            Thread.sleep(i);
42
+        } catch (InterruptedException e) {
43
+            e.printStackTrace();
44
+        }
45
+    }
46
+
47
+    private boolean newMessageCheck(Message newMessage){
48
+        for (Message message:this.messageList) {
49
+            if (message.getSequence().equals(newMessage.getSequence())) return false;
50
+        }
51
+        return true;
52
+    }
53
+}

+ 23
- 0
Client/src/main/java/IDGetter.java View File

@@ -0,0 +1,23 @@
1
+public class IDGetter implements Runnable{
2
+    private User user;
3
+    private YouAreEll webber;
4
+
5
+    public IDGetter(User user, YouAreEll webber) {
6
+        this.user = user;
7
+        this.webber = webber;
8
+    }
9
+
10
+    public void run() {
11
+        String results = webber.get_ids(user);
12
+        simulateLag();
13
+        SimpleShell.prettyPrintUsers(results);
14
+    }
15
+
16
+    private void simulateLag() {
17
+        try {
18
+            Thread.sleep(10000);
19
+        } catch (InterruptedException e){
20
+            e.printStackTrace();
21
+        }
22
+    }
23
+}

+ 19
- 0
Client/src/main/java/Logger.java View File

@@ -0,0 +1,19 @@
1
+//import java.util.logging.Level;
2
+//
3
+//public class Logger {
4
+//
5
+//    // Creation & retrieval methods:
6
+//    public static Logger getRootLogger();
7
+//    public static Logger getLogger(String name);
8
+//
9
+//    // printing methods:
10
+//    public void trace(Object message);
11
+//    public void debug(Object message);
12
+//    public void info(Object message);
13
+//    public void warn(Object message);
14
+//    public void error(Object message);
15
+//    public void fatal(Object message);
16
+//
17
+//    // generic printing method:
18
+//    public void log(Level l, Object message);
19
+//}

+ 49
- 0
Client/src/main/java/Message.java View File

@@ -0,0 +1,49 @@
1
+public class Message {
2
+    private String sequence;
3
+    private String timestamp;
4
+    private String fromid;
5
+    private String toid;
6
+    private String message;
7
+
8
+    public Message(){ }
9
+
10
+    public Message(String fromid, String toid, String message) {
11
+        this.sequence = "-";
12
+        this.timestamp = "2018-03-21T01:00:00.0Z";
13
+        this.fromid = fromid;
14
+        this.toid = toid;
15
+        this.message = message;
16
+    }
17
+
18
+    public String getSequence() {
19
+        return sequence;
20
+    }
21
+
22
+    public String getTimestamp() {
23
+        return timestamp;
24
+    }
25
+
26
+    public String getFromid() {
27
+        return fromid;
28
+    }
29
+
30
+    public void setFromid(String fromid) {
31
+        this.fromid = fromid;
32
+    }
33
+
34
+    public String getToid() {
35
+        return toid;
36
+    }
37
+
38
+    public void setToid(String toid) {
39
+        this.toid = toid;
40
+    }
41
+
42
+    public String getMessage() {
43
+        return message;
44
+    }
45
+
46
+    public void setMessage(String message) {
47
+        this.message = message;
48
+    }
49
+}

+ 23
- 0
Client/src/main/java/MessageLogger.java View File

@@ -0,0 +1,23 @@
1
+public class MessageLogger implements Runnable{
2
+    private User user;
3
+    private YouAreEll webber;
4
+
5
+    public MessageLogger(User user, YouAreEll webber) {
6
+        this.user = user;
7
+        this.webber = webber;
8
+    }
9
+
10
+    public void run() {
11
+        String results = webber.get_messages(user);
12
+        simulateLag();
13
+        SimpleShell.prettyPrintMessages(results);
14
+    }
15
+
16
+    private void simulateLag() {
17
+        try {
18
+            Thread.sleep(10000);
19
+        } catch (InterruptedException e){
20
+            e.printStackTrace();
21
+        }
22
+    }
23
+}

+ 53
- 0
Client/src/main/java/MessageScraper.java View File

@@ -0,0 +1,53 @@
1
+import com.fasterxml.jackson.databind.ObjectMapper;
2
+
3
+import java.io.IOException;
4
+import java.util.ArrayList;
5
+
6
+public class MessageScraper implements Runnable{
7
+    private ArrayList<Message> messageList;
8
+    private User user;
9
+    private YouAreEll webber;
10
+
11
+    public MessageScraper(User user, YouAreEll webber) {
12
+        this.user = user;
13
+        this.webber = webber;
14
+    }
15
+
16
+    public void run() {
17
+        this.messageList = new ArrayList<Message>();
18
+        ObjectMapper objectMapper = new ObjectMapper();
19
+        Message[] incoming = new Message[0];
20
+        String scrape;
21
+        while (true){
22
+            waitN(4000);
23
+            scrape = webber.get_messages(user);
24
+            waitN(100);
25
+            try {
26
+                incoming = objectMapper.readValue(scrape, Message[].class);
27
+            } catch (IOException e) {
28
+                e.printStackTrace();
29
+            }
30
+            for (Message message:incoming) {
31
+                if (newMessageCheck(message)){
32
+                    System.out.println("New Message!\n" + message.getFromid() + " says: " + message.getMessage());
33
+                    this.messageList.add(message);
34
+                }
35
+            }
36
+        }
37
+    }
38
+
39
+    private void waitN(int i) {
40
+        try {
41
+            Thread.sleep(i);
42
+        } catch (InterruptedException e) {
43
+            e.printStackTrace();
44
+        }
45
+    }
46
+
47
+    private boolean newMessageCheck(Message newMessage){
48
+        for (Message message:this.messageList) {
49
+            if (message.getSequence().equals(newMessage.getSequence())) return false;
50
+        }
51
+        return true;
52
+    }
53
+}

+ 46
- 0
Client/src/main/java/MessageSender.java View File

@@ -0,0 +1,46 @@
1
+import java.util.List;
2
+
3
+public class MessageSender implements Runnable{
4
+    private List<String> list;
5
+    private User user;
6
+    private YouAreEll webber;
7
+    private Message message;
8
+    private String sentence = "";
9
+
10
+    public MessageSender(List<String> list, User user, YouAreEll webber) {
11
+        this.list = list;
12
+        this.user = user;
13
+        this.webber = webber;
14
+    }
15
+
16
+    public void run() {
17
+        buildSentence();
18
+        buildMessage();
19
+        String results = webber.send_message(message);
20
+        simulateLag();
21
+        SimpleShell.prettyPrintMessage(results);
22
+    }
23
+
24
+    private void simulateLag() {
25
+        try {
26
+            Thread.sleep(10000);
27
+        } catch (InterruptedException e){
28
+            e.printStackTrace();
29
+        }
30
+    }
31
+
32
+    private void buildMessage() {
33
+        if (list.get(1).equalsIgnoreCase("group")){
34
+            message = new Message(user.getGithub(), "", sentence);
35
+        } else {
36
+            message = new Message(user.getGithub(), list.get(1), sentence);
37
+        }
38
+    }
39
+
40
+    private void buildSentence() {
41
+        for (int i = 2; i < list.size(); i++) {
42
+            sentence += list.get(i) + " ";
43
+        }
44
+        sentence = sentence.substring(0, sentence.length()-1);
45
+    }
46
+}

+ 69
- 7
Client/src/main/java/SimpleShell.java View File

@@ -1,3 +1,6 @@
1
+import com.fasterxml.jackson.databind.ObjectMapper;
2
+import org.apache.log4j.*;
3
+
1 4
 import java.io.BufferedReader;
2 5
 import java.io.IOException;
3 6
 import java.io.InputStream;
@@ -7,11 +10,48 @@ import java.util.List;
7 10
 
8 11
 public class SimpleShell {
9 12
 
13
+    private static final Logger logger = LogManager.getLogger(SimpleShell.class);
10 14
 
11
-    public static void prettyPrint(String output) {
12
-        // yep, make an effort to format things nicely, eh?
13
-        System.out.println(output);
15
+    public static void prettyPrintUsers(String output) {
16
+        ObjectMapper mapper = new ObjectMapper();
17
+        User[] users = null;
18
+        try {
19
+            users = mapper.readValue(output, User[].class);
20
+        } catch (IOException e) {
21
+            e.printStackTrace();
22
+        }
23
+        for (User user:users){
24
+            System.out.println("Name: " + user.getName() + " Github: " + user.getGithub() + "\n-----------------------------------------");
25
+        }
14 26
     }
27
+
28
+    public static void prettyPrintMessages(String output) {
29
+        ObjectMapper mapper = new ObjectMapper();
30
+        Message[] messages = null;
31
+        try {
32
+            messages = mapper.readValue(output, Message[].class);
33
+        } catch (IOException e) {
34
+            logger.trace("Pretty Print Message exception");
35
+            e.printStackTrace();
36
+        }
37
+        for (Message message:messages){
38
+            if (message.getToid().equals("")) System.out.println(message.getFromid() + ": " + message.getMessage() + "\n-----------------------------------------");
39
+            else System.out.println(message.getFromid() + " says to " + message.getToid() + ": " + message.getMessage() + "\n-----------------------------------------");
40
+        }
41
+    }
42
+
43
+    public static void prettyPrintMessage(String output) {
44
+        ObjectMapper mapper = new ObjectMapper();
45
+        Message message = null;
46
+        try {
47
+            message = mapper.readValue(output, Message.class);
48
+        } catch (IOException e) {
49
+            e.printStackTrace();
50
+        }
51
+        if (message.getToid().equals("")) System.out.println(message.getFromid() + ": " + message.getMessage() + "\n-----------------------------------------");
52
+        else System.out.println(message.getFromid() + " says to " + message.getToid() + ": " + message.getMessage() + "\n-----------------------------------------");
53
+    }
54
+
15 55
     public static void main(String[] args) throws java.io.IOException {
16 56
 
17 57
         YouAreEll webber = new YouAreEll();
@@ -22,6 +62,16 @@ public class SimpleShell {
22 62
         ProcessBuilder pb = new ProcessBuilder();
23 63
         List<String> history = new ArrayList<String>();
24 64
         int index = 0;
65
+        System.out.println("your name is? ");
66
+        String name = console.readLine();
67
+        System.out.println("your github id is? ");
68
+        String githubID = console.readLine();
69
+        User user = new User(name, githubID);
70
+        System.out.println(user.getName() + " " + user.getGithub());
71
+        Thread dmscrapeThread = new Thread(new DMScraper(user, webber));
72
+        dmscrapeThread.start();
73
+        Thread globalScrapeThread = new Thread(new MessageScraper(user, webber));
74
+        globalScrapeThread.start();
25 75
         //we break out with <ctrl c>
26 76
         while (true) {
27 77
             //read what the user enters
@@ -60,19 +110,31 @@ public class SimpleShell {
60 110
 
61 111
                 // ids
62 112
                 if (list.contains("ids")) {
63
-                    String results = webber.get_ids();
64
-                    SimpleShell.prettyPrint(results);
113
+                    Thread thread = new Thread(new IDGetter(user, webber));
114
+                    thread.start();
65 115
                     continue;
66 116
                 }
67 117
 
68 118
                 // messages
69 119
                 if (list.contains("messages")) {
70
-                    String results = webber.get_messages();
71
-                    SimpleShell.prettyPrint(results);
120
+                    Thread thread = new Thread(new MessageLogger(user, webber));
121
+                    thread.start();
72 122
                     continue;
73 123
                 }
74 124
                 // you need to add a bunch more.
75 125
 
126
+                if (list.contains("dms")) {
127
+                    Thread thread = new Thread(new DMGetter(user, webber));
128
+                    thread.start();
129
+                    continue;
130
+                }
131
+
132
+                if (list.contains("send")) {
133
+                    Thread thread = new Thread(new MessageSender(list, user, webber));
134
+                    thread.start();
135
+                    continue;
136
+                }
137
+
76 138
                 //!! command returns the last command in history
77 139
                 if (list.get(list.size() - 1).equals("!!")) {
78 140
                     pb.command(history.get(history.size() - 2));

+ 9
- 0
Client/src/main/java/URLCall.java View File

@@ -0,0 +1,9 @@
1
+public class URLCall {
2
+    String mainurl;
3
+    String method;
4
+    String jpayload;
5
+
6
+    public URLCall(String m){
7
+
8
+    }
9
+}

+ 36
- 0
Client/src/main/java/User.java View File

@@ -0,0 +1,36 @@
1
+public class User {
2
+    private String name;
3
+    private String github;
4
+    private String userid;
5
+
6
+    public User(){}
7
+
8
+    public User(String name, String github) {
9
+        this.name = name;
10
+        this.github = github;
11
+    }
12
+
13
+    public String getName() {
14
+        return name;
15
+    }
16
+
17
+    public void setName(String name) {
18
+        this.name = name;
19
+    }
20
+
21
+    public String getGithub() {
22
+        return github;
23
+    }
24
+
25
+    public void setGithub(String github) {
26
+        this.github = github;
27
+    }
28
+
29
+    public String getUserid() {
30
+        return userid;
31
+    }
32
+
33
+    public void setUserid(String userid) {
34
+        this.userid = userid;
35
+    }
36
+}

+ 58
- 4
Client/src/main/java/YouAreEll.java View File

@@ -1,4 +1,16 @@
1
+import com.fasterxml.jackson.core.JsonProcessingException;
2
+import com.fasterxml.jackson.databind.ObjectMapper;
3
+import com.squareup.okhttp.*;
4
+import sun.rmi.runtime.Log;
5
+
6
+import javax.swing.text.html.parser.Entity;
7
+import java.awt.*;
8
+import java.io.IOException;
9
+
1 10
 public class YouAreEll {
11
+    private String base = "http://zipcode.rocks:8085";
12
+    private static final MediaType json = MediaType.parse("application/json; charset=utf-8");
13
+    private OkHttpClient okClient = new OkHttpClient();
2 14
 
3 15
     YouAreEll() {
4 16
     }
@@ -6,18 +18,60 @@ public class YouAreEll {
6 18
     public static void main(String[] args) {
7 19
         YouAreEll urlhandler = new YouAreEll();
8 20
         System.out.println(urlhandler.MakeURLCall("/ids", "GET", ""));
9
-        System.out.println(urlhandler.MakeURLCall("/messages", "GET", ""));
10 21
     }
11 22
 
12
-    public String get_ids() {
13
-        return MakeURLCall("/ids", "GET", "");
23
+    public String get_ids(User user) {
24
+        ObjectMapper objectMapper = new ObjectMapper();
25
+        try {
26
+            return MakeURLCall("/ids", "GET", objectMapper.writeValueAsString(user));
27
+        } catch (JsonProcessingException e) {
28
+            e.printStackTrace();
29
+        }
30
+        return null;
31
+    }
32
+
33
+    public String get_DMs(User user){
34
+        return MakeURLCall("/ids/" + user.getGithub() + "/messages", "GET", "");
14 35
     }
15 36
 
16
-    public String get_messages() {
37
+    public String get_messages(User user) {
17 38
         return MakeURLCall("/messages", "GET", "");
18 39
     }
19 40
 
41
+    public String send_message(Message message) {
42
+        ObjectMapper mapper = new ObjectMapper();
43
+        String jpayload = null;
44
+        try {
45
+            jpayload = mapper.writeValueAsString(message);
46
+        } catch (JsonProcessingException e) {
47
+            e.printStackTrace();
48
+        }
49
+        return MakeURLCall("/ids/" + message.getFromid() + "/messages" , "POST", jpayload);
50
+    }
51
+
20 52
     public String MakeURLCall(String mainurl, String method, String jpayload) {
53
+        //System.out.println(jpayload);
54
+        String fullUrl = base + mainurl;
55
+        Request request = null;
56
+        if (method.equalsIgnoreCase("get")){
57
+            request = new Request.Builder()
58
+                    .url(fullUrl).get().build();
59
+        } else if (method.equalsIgnoreCase("post")){
60
+            request = new Request.Builder()
61
+                    .url(fullUrl).post(RequestBody.create(json, jpayload))
62
+                    .build();
63
+        }
64
+        try {
65
+            Response response = okClient.newCall(request).execute();
66
+            return response.body().string();
67
+        } catch (IOException e) {
68
+            e.printStackTrace();
69
+        }
21 70
         return "nada";
22 71
     }
23 72
 }
73
+
74
+//jpayload = "{\n" +
75
+//        "\"name\":\"pat\",\n" +
76
+//        "\"github\": \"patglavin\"\n" +
77
+//        "}";

+ 10
- 3
YouAreEll.iml View File

@@ -8,8 +8,15 @@
8 8
     </content>
9 9
     <orderEntry type="inheritedJdk" />
10 10
     <orderEntry type="sourceFolder" forTests="false" />
11
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.8.6" level="project" />
12
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.8.0" level="project" />
13
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.8.6" level="project" />
11
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.4" level="project" />
12
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
13
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.4" level="project" />
14
+    <orderEntry type="library" scope="TEST" name="Maven: com.squareup.okhttp3:mockwebserver:3.10.0" level="project" />
15
+    <orderEntry type="library" scope="TEST" name="Maven: com.squareup.okhttp3:okhttp:3.10.0" level="project" />
16
+    <orderEntry type="library" scope="TEST" name="Maven: com.squareup.okio:okio:1.14.0" level="project" />
17
+    <orderEntry type="library" scope="TEST" name="Maven: org.bouncycastle:bcprov-jdk15on:1.50" level="project" />
18
+    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
19
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
20
+    <orderEntry type="library" name="Maven: log4j:log4j:1.2.17" level="project" />
14 21
   </component>
15 22
 </module>

+ 14
- 1
pom.xml View File

@@ -13,10 +13,23 @@
13 13
     </modules>
14 14
 
15 15
     <dependencies>
16
+        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
16 17
         <dependency>
17 18
             <groupId>com.fasterxml.jackson.core</groupId>
18 19
             <artifactId>jackson-databind</artifactId>
19
-            <version>2.8.6</version>
20
+            <version>2.9.4</version>
21
+        </dependency>
22
+        <dependency>
23
+            <groupId>com.squareup.okhttp3</groupId>
24
+            <artifactId>mockwebserver</artifactId>
25
+            <version>3.10.0</version>
26
+            <scope>test</scope>
27
+        </dependency>
28
+        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
29
+        <dependency>
30
+            <groupId>log4j</groupId>
31
+            <artifactId>log4j</artifactId>
32
+            <version>1.2.17</version>
20 33
         </dependency>
21 34
     </dependencies>
22 35
 </project>