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="modifiedList", 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="{url}")
61 static void queryTweets(TwitterModel page, TwitterQuery q) {
62 page.getCurrentTweets().clear();
63 page.getCurrentTweets().addAll(q.getResults());
66 @OnPropertyChange("activeTweeters")
67 static void refreshTweets(TwitterModel model) {
68 Tweeters people = model.getActiveTweeters();
69 StringBuilder sb = new StringBuilder();
70 sb.append("http://search.twitter.com/search.json?rpp=25&q=");
72 for (String p : people.getUserNames()) {
78 model.queryTweets(sb.toString());
81 private static Tweeters tweeters(String listName, String... userNames) {
82 Tweeters t = new Tweeters();
84 t.getUserNames().addAll(Arrays.asList(userNames));
89 final TwitterModel model = new TwitterModel();
90 final List<Tweeters> svdLst = model.getSavedLists();
91 svdLst.add(tweeters("API Design", "JaroslavTulach"));
92 svdLst.add(tweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson"));
93 svdLst.add(tweeters("Microsoft people", "BillGates", "shanselman", "ScottGu"));
94 svdLst.add(tweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans"));
95 svdLst.add(tweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror"));
97 model.setActiveTweetersName("NetBeans");
99 model.applyBindings();
103 static Tweeters activeTweeters(String activeTweetersName, List<Tweeters> savedLists, Tweeters modifiedList) {
104 if (modifiedList != null && modifiedList.getName() != null) {
105 if (modifiedList.getName().equals(activeTweetersName)) {
109 return findByName(savedLists, activeTweetersName);
112 @OnPropertyChange("activeTweetersName")
113 static void clearModifiedList(TwitterModel m) {
114 m.setModifiedList(null);
118 static boolean hasUnsavedChanges(Tweeters modifiedList) {
119 return modifiedList != null;
123 static boolean userNameToAddIsValid(String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, Tweeters modifiedList) {
124 Tweeters editingList = activeTweeters(activeTweetersName, savedLists, modifiedList);
125 return editingList != null && userNameToAdd != null &&
126 userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
127 !editingList.getUserNames().contains(userNameToAdd);
131 static void deleteList(TwitterModel model) {
132 final List<Tweeters> sl = model.getSavedLists();
133 sl.remove(model.getActiveTweeters());
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 model.getSavedLists().set(indx, model.getModifiedList());
148 model.setModifiedList(null);
152 static void addUser(TwitterModel model) {
153 String n = model.getUserNameToAdd();
154 findModifiedList(model).getUserNames().add(n);
157 static void removeUser(String data, TwitterModel model) {
158 findModifiedList(model).getUserNames().remove(data);
161 private static Tweeters findModifiedList(TwitterModel model) {
162 if (model.getModifiedList() == null || model.getModifiedList().getName() == null) {
163 model.setModifiedList(model.getActiveTweeters().clone());
165 return model.getModifiedList();
167 private static Tweeters findByName(List<Tweeters> list, String name) {
168 for (Tweeters l : list) {
169 if (l.getName() != null && l.getName().equals(name)) {
173 return list.isEmpty() ? null : list.get(0);