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 org.apidesign.bck2brwsr.htmlpage.api.*;
23 import org.apidesign.bck2brwsr.htmlpage.api.Page;
24 import org.apidesign.bck2brwsr.htmlpage.api.Property;
25 import org.apidesign.bck2brwsr.htmlpage.api.ComputedProperty;
27 /** Controller class for access to Twitter.
29 * @author Jaroslav Tulach
31 @Page(xhtml="index.html", className="TwitterModel", properties={
32 @Property(name="savedLists", type=Tweeters.class, array = true),
33 @Property(name="activeTweetersName", type=String.class),
34 @Property(name="activeTweeters", type=String.class, array = true),
35 @Property(name="userNameToAdd", type=String.class),
36 @Property(name="currentTweets", type=Tweet.class, array = true)
38 public class TwitterClient {
39 @Model(className = "Tweeters", properties = {
40 @Property(name="name", type = String.class),
41 @Property(name="userNames", type = String.class, array = true)
45 @Model(className = "Tweet", properties = {
46 @Property(name = "from_user", type = String.class),
47 @Property(name = "from_user_id", type = int.class),
48 @Property(name = "profile_image_url", type = String.class),
49 @Property(name = "text", type = String.class),
50 @Property(name = "created_at", type = String.class),
52 static final class Twt {
53 @ComputedProperty static String html(String text) {
54 StringBuilder sb = new StringBuilder(320);
56 int http = text.indexOf("http", pos);
58 sb.append(text.substring(pos));
61 int spc = text.indexOf(' ', http);
65 sb.append(text.substring(pos, http));
66 String url = text.substring(http, spc);
67 sb.append("<a href='").append(url).append("'>").append(url).append("</a>");
72 @ComputedProperty static String userUrl(String from_user) {
73 return "http://twitter.com/" + from_user;
76 @Model(className = "TwitterQuery", properties = {
77 @Property(array = true, name = "results", type = Twt.class)
79 public static final class TwttrQr {
82 @OnReceive(url="{root}/search.json?{query}&callback={me}", jsonp="me")
83 static void queryTweets(TwitterModel page, TwitterQuery q) {
84 page.getCurrentTweets().clear();
85 page.getCurrentTweets().addAll(q.getResults());
88 @OnPropertyChange("activeTweetersName")
89 static void changeTweetersList(TwitterModel model) {
90 Tweeters people = findByName(model.getSavedLists(), model.getActiveTweetersName());
91 model.getActiveTweeters().clear();
92 model.getActiveTweeters().addAll(people.getUserNames());
95 @OnPropertyChange({ "activeTweeters", "activeTweetersCount" })
96 static void refreshTweets(TwitterModel model) {
97 StringBuilder sb = new StringBuilder();
98 sb.append("rpp=25&q=");
100 for (String p : model.getActiveTweeters()) {
106 model.queryTweets("http://search.twitter.com", sb.toString());
110 final TwitterModel model = new TwitterModel();
111 final List<Tweeters> svdLst = model.getSavedLists();
112 svdLst.add(newTweeters("API Design", "JaroslavTulach"));
113 svdLst.add(newTweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson"));
114 svdLst.add(newTweeters("Microsoft people", "BillGates", "shanselman", "ScottGu"));
115 svdLst.add(newTweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans", "petrjiricka"));
116 svdLst.add(newTweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror"));
118 model.setActiveTweetersName("NetBeans");
120 model.applyBindings();
124 static boolean hasUnsavedChanges(List<String> activeTweeters, List<Tweeters> savedLists, String activeTweetersName) {
125 Tweeters tw = findByName(savedLists, activeTweetersName);
126 if (activeTweeters == null) {
129 return !tw.getUserNames().equals(activeTweeters);
133 static int activeTweetersCount(List<String> activeTweeters) {
134 return activeTweeters.size();
138 static boolean userNameToAddIsValid(
139 String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, List<String> activeTweeters
141 return userNameToAdd != null &&
142 userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
143 !activeTweeters.contains(userNameToAdd);
147 static void deleteList(TwitterModel model) {
148 final List<Tweeters> sl = model.getSavedLists();
149 sl.remove(findByName(sl, model.getActiveTweetersName()));
151 final Tweeters t = new Tweeters();
155 model.setActiveTweetersName(sl.get(0).getName());
159 static void saveChanges(TwitterModel model) {
160 Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
161 int indx = model.getSavedLists().indexOf(t);
163 t.setName(model.getActiveTweetersName());
164 t.getUserNames().clear();
165 t.getUserNames().addAll(model.getActiveTweeters());
170 static void addUser(TwitterModel model) {
171 String n = model.getUserNameToAdd();
172 model.getActiveTweeters().add(n);
175 static void removeUser(String data, TwitterModel model) {
176 model.getActiveTweeters().remove(data);
179 private static Tweeters findByName(List<Tweeters> list, String name) {
180 for (Tweeters l : list) {
181 if (l.getName() != null && l.getName().equals(name)) {
185 return list.isEmpty() ? new Tweeters() : list.get(0);
188 private static Tweeters newTweeters(String listName, String... userNames) {
189 Tweeters t = new Tweeters();
191 t.getUserNames().addAll(Arrays.asList(userNames));