ko-archetype/src/main/resources/archetype-resources/src/main/java/TwitterClient.java
3 import java.util.Arrays;
5 import net.java.html.json.ComputedProperty;
6 import net.java.html.json.Function;
7 import net.java.html.json.Model;
8 import net.java.html.json.OnPropertyChange;
9 import net.java.html.json.OnReceive;
10 import net.java.html.json.Property;
12 @Model(className="TwitterModel", properties={
13 @Property(name="savedLists", type=Tweeters.class, array = true),
14 @Property(name="activeTweetersName", type=String.class),
15 @Property(name="activeTweeters", type=String.class, array = true),
16 @Property(name="userNameToAdd", type=String.class),
17 @Property(name="loading", type=boolean.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());
68 page.setLoading(false);
71 @OnPropertyChange("activeTweetersName")
72 static void changeTweetersList(TwitterModel model) {
73 Tweeters people = findByName(model.getSavedLists(), model.getActiveTweetersName());
74 model.getActiveTweeters().clear();
75 model.getActiveTweeters().addAll(people.getUserNames());
78 @OnPropertyChange({ "activeTweeters", "activeTweetersCount" })
79 static void refreshTweets(TwitterModel model) {
80 StringBuilder sb = new StringBuilder();
81 sb.append("rpp=25&q=");
83 for (String p : model.getActiveTweeters()) {
89 model.setLoading(true);
90 model.queryTweets("http://search.twitter.com", sb.toString());
94 final TwitterModel model = new TwitterModel();
95 final List<Tweeters> svdLst = model.getSavedLists();
96 svdLst.add(newTweeters("API Design", "JaroslavTulach"));
97 svdLst.add(newTweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson"));
98 svdLst.add(newTweeters("Microsoft people", "BillGates", "shanselman", "ScottGu"));
99 svdLst.add(newTweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans", "petrjiricka"));
100 svdLst.add(newTweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror"));
102 model.setActiveTweetersName("NetBeans");
104 model.applyBindings();
108 static boolean hasUnsavedChanges(List<String> activeTweeters, List<Tweeters> savedLists, String activeTweetersName) {
109 Tweeters tw = findByName(savedLists, activeTweetersName);
110 if (activeTweeters == null) {
113 return !tw.getUserNames().equals(activeTweeters);
117 static int activeTweetersCount(List<String> activeTweeters) {
118 return activeTweeters.size();
122 static boolean userNameToAddIsValid(
123 String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, List<String> activeTweeters
125 return userNameToAdd != null &&
126 userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
127 !activeTweeters.contains(userNameToAdd);
131 static void deleteList(TwitterModel model) {
132 final List<Tweeters> sl = model.getSavedLists();
133 sl.remove(findByName(sl, model.getActiveTweetersName()));
135 final Tweeters t = new Tweeters();
139 model.setActiveTweetersName(sl.get(0).getName());
143 static void saveChanges(TwitterModel model) {
144 Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
145 int indx = model.getSavedLists().indexOf(t);
147 t.setName(model.getActiveTweetersName());
148 t.getUserNames().clear();
149 t.getUserNames().addAll(model.getActiveTweeters());
154 static void addUser(TwitterModel model) {
155 String n = model.getUserNameToAdd();
156 model.getActiveTweeters().add(n);
159 static void removeUser(String data, TwitterModel model) {
160 model.getActiveTweeters().remove(data);
163 private static Tweeters findByName(List<Tweeters> list, String name) {
164 for (Tweeters l : list) {
165 if (l.getName() != null && l.getName().equals(name)) {
169 return list.isEmpty() ? new Tweeters() : list.get(0);
172 private static Tweeters newTweeters(String listName, String... userNames) {
173 Tweeters t = new Tweeters();
175 t.getUserNames().addAll(Arrays.asList(userNames));