javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java
2 * Back 2 Browser Bytecode Translator
3 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, version 2 of the License.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. Look for COPYING file in the top folder.
16 * If not, see http://opensource.org/licenses/GPL-2.0.
18 package org.apidesign.bck2brwsr.demo.twitter;
20 import java.util.Arrays;
21 import java.util.List;
22 import net.java.html.json.ComputedProperty;
23 import net.java.html.json.Context;
24 import net.java.html.json.Function;
25 import net.java.html.json.Model;
26 import net.java.html.json.OnPropertyChange;
27 import net.java.html.json.OnReceive;
28 import net.java.html.json.Property;
30 /** Controller class for access to Twitter.
32 * @author Jaroslav Tulach
34 @Model(className="TwitterModel", properties={
35 @Property(name="savedLists", type=Tweeters.class, array = true),
36 @Property(name="activeTweetersName", type=String.class),
37 @Property(name="activeTweeters", type=String.class, array = true),
38 @Property(name="userNameToAdd", type=String.class),
39 @Property(name="currentTweets", type=Tweet.class, array = true)
41 public class TwitterClient {
42 @Model(className = "Tweeters", properties = {
43 @Property(name="name", type = String.class),
44 @Property(name="userNames", type = String.class, array = true)
48 @Model(className = "Tweet", properties = {
49 @Property(name = "from_user", type = String.class),
50 @Property(name = "from_user_id", type = int.class),
51 @Property(name = "profile_image_url", type = String.class),
52 @Property(name = "text", type = String.class),
53 @Property(name = "created_at", type = String.class),
55 static final class Twt {
56 @ComputedProperty static String html(String text) {
57 StringBuilder sb = new StringBuilder(320);
59 int http = text.indexOf("http", pos);
61 sb.append(text.substring(pos));
64 int spc = text.indexOf(' ', http);
68 sb.append(text.substring(pos, http));
69 String url = text.substring(http, spc);
70 sb.append("<a href='").append(url).append("'>").append(url).append("</a>");
75 @ComputedProperty static String userUrl(String from_user) {
76 return "http://twitter.com/" + from_user;
79 @Model(className = "TwitterQuery", properties = {
80 @Property(array = true, name = "results", type = Twt.class)
82 public static final class TwttrQr {
85 @OnReceive(url="{root}/search.json?{query}&callback={me}", jsonp="me")
86 static void queryTweets(TwitterModel page, TwitterQuery q) {
87 page.getCurrentTweets().clear();
88 page.getCurrentTweets().addAll(q.getResults());
91 @OnPropertyChange("activeTweetersName")
92 static void changeTweetersList(TwitterModel model) {
93 Tweeters people = findByName(model.getSavedLists(), model.getActiveTweetersName());
94 model.getActiveTweeters().clear();
95 model.getActiveTweeters().addAll(people.getUserNames());
98 @OnPropertyChange({ "activeTweeters", "activeTweetersCount" })
99 static void refreshTweets(TwitterModel model) {
100 StringBuilder sb = new StringBuilder();
101 sb.append("rpp=25&q=");
103 for (String p : model.getActiveTweeters()) {
109 model.queryTweets("http://search.twitter.com", sb.toString());
112 private static final Context DEFAULT = Context.findDefault(TwitterClient.class);
114 final TwitterModel model = new TwitterModel(DEFAULT);
115 final List<Tweeters> svdLst = model.getSavedLists();
116 svdLst.add(newTweeters("API Design", "JaroslavTulach"));
117 svdLst.add(newTweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson"));
118 svdLst.add(newTweeters("Microsoft people", "BillGates", "shanselman", "ScottGu"));
119 svdLst.add(newTweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans", "petrjiricka"));
120 svdLst.add(newTweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror"));
122 model.setActiveTweetersName("NetBeans");
124 model.applyBindings();
128 static boolean hasUnsavedChanges(List<String> activeTweeters, List<Tweeters> savedLists, String activeTweetersName) {
129 Tweeters tw = findByName(savedLists, activeTweetersName);
130 if (activeTweeters == null) {
133 return !tw.getUserNames().equals(activeTweeters);
137 static int activeTweetersCount(List<String> activeTweeters) {
138 return activeTweeters.size();
142 static boolean userNameToAddIsValid(
143 String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, List<String> activeTweeters
145 return userNameToAdd != null &&
146 userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
147 !activeTweeters.contains(userNameToAdd);
151 static void deleteList(TwitterModel model) {
152 final List<Tweeters> sl = model.getSavedLists();
153 sl.remove(findByName(sl, model.getActiveTweetersName()));
155 final Tweeters t = new Tweeters(DEFAULT);
159 model.setActiveTweetersName(sl.get(0).getName());
163 static void saveChanges(TwitterModel model) {
164 Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
165 int indx = model.getSavedLists().indexOf(t);
167 t.setName(model.getActiveTweetersName());
168 t.getUserNames().clear();
169 t.getUserNames().addAll(model.getActiveTweeters());
174 static void addUser(TwitterModel model) {
175 String n = model.getUserNameToAdd();
176 model.getActiveTweeters().add(n);
179 static void removeUser(String data, TwitterModel model) {
180 model.getActiveTweeters().remove(data);
183 private static Tweeters findByName(List<Tweeters> list, String name) {
184 for (Tweeters l : list) {
185 if (l.getName() != null && l.getName().equals(name)) {
189 return list.isEmpty() ? new Tweeters(DEFAULT) : list.get(0);
192 private static Tweeters newTweeters(String listName, String... userNames) {
193 Tweeters t = new Tweeters(DEFAULT);
195 t.getUserNames().addAll(Arrays.asList(userNames));