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.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="loading", type=boolean.class),
19 @Property(name="currentTweets", type=Tweet.class, array = true)
21 public class TwitterClient {
22 @Model(className = "Tweeters", properties = {
23 @Property(name="name", type = String.class),
24 @Property(name="userNames", type = String.class, array = true)
28 @Model(className = "Tweet", properties = {
29 @Property(name = "from_user", type = String.class),
30 @Property(name = "from_user_id", type = int.class),
31 @Property(name = "profile_image_url", type = String.class),
32 @Property(name = "text", type = String.class),
33 @Property(name = "created_at", type = String.class),
35 static final class Twt {
36 @ComputedProperty static String html(String text) {
37 StringBuilder sb = new StringBuilder(320);
39 int http = text.indexOf("http", pos);
41 sb.append(text.substring(pos));
44 int spc = text.indexOf(' ', http);
48 sb.append(text.substring(pos, http));
49 String url = text.substring(http, spc);
50 sb.append("<a href='").append(url).append("'>").append(url).append("</a>");
55 @ComputedProperty static String userUrl(String from_user) {
56 return "http://twitter.com/" + from_user;
59 @Model(className = "TwitterQuery", properties = {
60 @Property(array = true, name = "results", type = Twt.class)
62 public static final class TwttrQr {
65 @OnReceive(url="{root}/search.json?{query}&callback={me}", jsonp="me")
66 static void queryTweets(TwitterModel page, TwitterQuery q) {
67 page.getCurrentTweets().clear();
68 page.getCurrentTweets().addAll(q.getResults());
69 page.setLoading(false);
72 @OnPropertyChange("activeTweetersName")
73 static void changeTweetersList(TwitterModel model) {
74 Tweeters people = findByName(model.getSavedLists(), model.getActiveTweetersName());
75 model.getActiveTweeters().clear();
76 model.getActiveTweeters().addAll(people.getUserNames());
79 @OnPropertyChange({ "activeTweeters", "activeTweetersCount" })
80 static void refreshTweets(TwitterModel model) {
81 StringBuilder sb = new StringBuilder();
82 sb.append("rpp=25&q=");
84 for (String p : model.getActiveTweeters()) {
90 model.setLoading(true);
91 model.queryTweets("http://search.twitter.com", sb.toString());
94 private static final Context DEFAULT = Context.findDefault(TwitterClient.class);
96 final TwitterModel model = new TwitterModel(DEFAULT);
97 final List<Tweeters> svdLst = model.getSavedLists();
98 svdLst.add(newTweeters("API Design", "JaroslavTulach"));
99 svdLst.add(newTweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson"));
100 svdLst.add(newTweeters("Microsoft people", "BillGates", "shanselman", "ScottGu"));
101 svdLst.add(newTweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans", "petrjiricka"));
102 svdLst.add(newTweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror"));
104 model.setActiveTweetersName("NetBeans");
106 model.applyBindings();
110 static boolean hasUnsavedChanges(List<String> activeTweeters, List<Tweeters> savedLists, String activeTweetersName) {
111 Tweeters tw = findByName(savedLists, activeTweetersName);
112 if (activeTweeters == null) {
115 return !tw.getUserNames().equals(activeTweeters);
119 static int activeTweetersCount(List<String> activeTweeters) {
120 return activeTweeters.size();
124 static boolean userNameToAddIsValid(
125 String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, List<String> activeTweeters
127 return userNameToAdd != null &&
128 userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
129 !activeTweeters.contains(userNameToAdd);
133 static void deleteList(TwitterModel model) {
134 final List<Tweeters> sl = model.getSavedLists();
135 sl.remove(findByName(sl, model.getActiveTweetersName()));
137 final Tweeters t = new Tweeters(DEFAULT);
141 model.setActiveTweetersName(sl.get(0).getName());
145 static void saveChanges(TwitterModel model) {
146 Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
147 int indx = model.getSavedLists().indexOf(t);
149 t.setName(model.getActiveTweetersName());
150 t.getUserNames().clear();
151 t.getUserNames().addAll(model.getActiveTweeters());
156 static void addUser(TwitterModel model) {
157 String n = model.getUserNameToAdd();
158 model.getActiveTweeters().add(n);
161 static void removeUser(String data, TwitterModel model) {
162 model.getActiveTweeters().remove(data);
165 private static Tweeters findByName(List<Tweeters> list, String name) {
166 for (Tweeters l : list) {
167 if (l.getName() != null && l.getName().equals(name)) {
171 return list.isEmpty() ? new Tweeters(DEFAULT) : list.get(0);
174 private static Tweeters newTweeters(String listName, String... userNames) {
175 Tweeters t = new Tweeters(DEFAULT);
177 t.getUserNames().addAll(Arrays.asList(userNames));