ko-archetype/src/main/resources/archetype-resources/src/main/java/TwitterClient.java
Moving archetype tests into separate module - at that moment it is possible to use the previously generated archetype
3 import java.util.Arrays;
5 import net.java.html.json.ComputedProperty;
6 import net.java.html.json.Context;
7 import net.java.html.json.Function;
8 import net.java.html.json.Model;
9 import net.java.html.json.OnPropertyChange;
10 import net.java.html.json.OnReceive;
11 import net.java.html.json.Property;
13 @Model(className="TwitterModel", properties={
14 @Property(name="savedLists", type=Tweeters.class, array = true),
15 @Property(name="activeTweetersName", type=String.class),
16 @Property(name="activeTweeters", type=String.class, array = true),
17 @Property(name="userNameToAdd", type=String.class),
18 @Property(name="currentTweets", type=Tweet.class, array = true)
20 public class TwitterClient {
21 @Model(className = "Tweeters", properties = {
22 @Property(name="name", type = String.class),
23 @Property(name="userNames", type = String.class, array = true)
27 @Model(className = "Tweet", properties = {
28 @Property(name = "from_user", type = String.class),
29 @Property(name = "from_user_id", type = int.class),
30 @Property(name = "profile_image_url", type = String.class),
31 @Property(name = "text", type = String.class),
32 @Property(name = "created_at", type = String.class),
34 static final class Twt {
35 @ComputedProperty static String html(String text) {
36 StringBuilder sb = new StringBuilder(320);
38 int http = text.indexOf("http", pos);
40 sb.append(text.substring(pos));
43 int spc = text.indexOf(' ', http);
47 sb.append(text.substring(pos, http));
48 String url = text.substring(http, spc);
49 sb.append("<a href='").append(url).append("'>").append(url).append("</a>");
54 @ComputedProperty static String userUrl(String from_user) {
55 return "http://twitter.com/" + from_user;
58 @Model(className = "TwitterQuery", properties = {
59 @Property(array = true, name = "results", type = Twt.class)
61 public static final class TwttrQr {
64 @OnReceive(url="{root}/search.json?{query}&callback={me}", jsonp="me")
65 static void queryTweets(TwitterModel page, TwitterQuery q) {
66 page.getCurrentTweets().clear();
67 page.getCurrentTweets().addAll(q.getResults());
70 @OnPropertyChange("activeTweetersName")
71 static void changeTweetersList(TwitterModel model) {
72 Tweeters people = findByName(model.getSavedLists(), model.getActiveTweetersName());
73 model.getActiveTweeters().clear();
74 model.getActiveTweeters().addAll(people.getUserNames());
77 @OnPropertyChange({ "activeTweeters", "activeTweetersCount" })
78 static void refreshTweets(TwitterModel model) {
79 StringBuilder sb = new StringBuilder();
80 sb.append("rpp=25&q=");
82 for (String p : model.getActiveTweeters()) {
88 model.queryTweets("http://search.twitter.com", sb.toString());
91 private static final Context DEFAULT = Context.findDefault(TwitterClient.class);
93 final TwitterModel model = new TwitterModel(DEFAULT);
94 final List<Tweeters> svdLst = model.getSavedLists();
95 svdLst.add(newTweeters("API Design", "JaroslavTulach"));
96 svdLst.add(newTweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson"));
97 svdLst.add(newTweeters("Microsoft people", "BillGates", "shanselman", "ScottGu"));
98 svdLst.add(newTweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans", "petrjiricka"));
99 svdLst.add(newTweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror"));
101 model.setActiveTweetersName("NetBeans");
103 model.applyBindings();
107 static boolean hasUnsavedChanges(List<String> activeTweeters, List<Tweeters> savedLists, String activeTweetersName) {
108 Tweeters tw = findByName(savedLists, activeTweetersName);
109 if (activeTweeters == null) {
112 return !tw.getUserNames().equals(activeTweeters);
116 static int activeTweetersCount(List<String> activeTweeters) {
117 return activeTweeters.size();
121 static boolean userNameToAddIsValid(
122 String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, List<String> activeTweeters
124 return userNameToAdd != null &&
125 userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
126 !activeTweeters.contains(userNameToAdd);
130 static void deleteList(TwitterModel model) {
131 final List<Tweeters> sl = model.getSavedLists();
132 sl.remove(findByName(sl, model.getActiveTweetersName()));
134 final Tweeters t = new Tweeters(DEFAULT);
138 model.setActiveTweetersName(sl.get(0).getName());
142 static void saveChanges(TwitterModel model) {
143 Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
144 int indx = model.getSavedLists().indexOf(t);
146 t.setName(model.getActiveTweetersName());
147 t.getUserNames().clear();
148 t.getUserNames().addAll(model.getActiveTweeters());
153 static void addUser(TwitterModel model) {
154 String n = model.getUserNameToAdd();
155 model.getActiveTweeters().add(n);
158 static void removeUser(String data, TwitterModel model) {
159 model.getActiveTweeters().remove(data);
162 private static Tweeters findByName(List<Tweeters> list, String name) {
163 for (Tweeters l : list) {
164 if (l.getName() != null && l.getName().equals(name)) {
168 return list.isEmpty() ? new Tweeters(DEFAULT) : list.get(0);
171 private static Tweeters newTweeters(String listName, String... userNames) {
172 Tweeters t = new Tweeters(DEFAULT);
174 t.getUserNames().addAll(Arrays.asList(userNames));