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=TwitterClient.Twttrs.class, array = true),
33 @Property(name="activeTweetersName", type=String.class),
34 @Property(name="activeTweeters", type=TwitterClient.Twttrs.class),
35 @Property(name="userNameToAdd", type=String.class),
36 @Property(name="currentTweets", type=TwitterClient.Twt.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 {
54 @Model(className = "TwitterQuery", properties = {
55 @Property(array = true, name = "results", type = Twt.class)
57 public static final class TwttrQr {
60 @OnReceive(url="{root}/search.json?{query}&callback={me}", jsonp="me")
61 static void queryTweets(TwitterModel page, TwitterQuery q) {
62 page.getCurrentTweets().clear();
63 page.getCurrentTweets().addAll(q.getResults());
66 @OnPropertyChange("activeTweetersName")
67 static void changeTweetersList(TwitterModel model) {
68 Tweeters people = findByName(model.getSavedLists(), model.getActiveTweetersName());
69 model.setActiveTweeters(people.clone());
72 @OnPropertyChange("activeTweeters")
73 static void refreshTweets(TwitterModel model) {
74 Tweeters people = model.getActiveTweeters();
76 StringBuilder sb = new StringBuilder();
77 sb.append("rpp=25&q=");
79 for (String p : people.getUserNames()) {
85 model.queryTweets("http://search.twitter.com", sb.toString());
90 final TwitterModel model = new TwitterModel();
91 final List<Tweeters> svdLst = model.getSavedLists();
92 svdLst.add(tweeters("API Design", "JaroslavTulach"));
93 svdLst.add(tweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson"));
94 svdLst.add(tweeters("Microsoft people", "BillGates", "shanselman", "ScottGu"));
95 svdLst.add(tweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans"));
96 svdLst.add(tweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror"));
98 model.setActiveTweetersName("NetBeans");
100 model.applyBindings();
104 static boolean hasUnsavedChanges(Tweeters activeTweeters, List<Tweeters> savedLists, String activeTweetersName) {
105 Tweeters tw = findByName(savedLists, activeTweetersName);
106 if (activeTweeters == null) {
109 return !tw.equals(activeTweeters);
113 static boolean userNameToAddIsValid(
114 String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, Tweeters activeTweeters
116 return activeTweeters != null && userNameToAdd != null &&
117 userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
118 !activeTweeters.getUserNames().contains(userNameToAdd);
122 static void deleteList(TwitterModel model) {
123 final List<Tweeters> sl = model.getSavedLists();
124 sl.remove(model.getActiveTweeters());
126 final Tweeters t = new Tweeters();
130 model.setActiveTweetersName(sl.get(0).getName());
134 static void saveChanges(TwitterModel model) {
135 Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
136 int indx = model.getSavedLists().indexOf(t);
138 model.getSavedLists().set(indx, model.getActiveTweeters());
140 model.getSavedLists().add(model.getActiveTweeters());
145 static void addUser(TwitterModel model) {
146 String n = model.getUserNameToAdd();
147 model.getActiveTweeters().getUserNames().add(n);
150 static void removeUser(String data, TwitterModel model) {
151 model.getActiveTweeters().getUserNames().remove(data);
154 private static Tweeters findByName(List<Tweeters> list, String name) {
155 for (Tweeters l : list) {
156 if (l.getName() != null && l.getName().equals(name)) {
160 return list.isEmpty() ? new Tweeters() : list.get(0);
163 private static Tweeters tweeters(String listName, String... userNames) {
164 Tweeters t = new Tweeters();
166 t.getUserNames().addAll(Arrays.asList(userNames));