jaroslav@931: /** jaroslav@931: * Back 2 Browser Bytecode Translator jaroslav@931: * Copyright (C) 2012 Jaroslav Tulach jaroslav@931: * jaroslav@931: * This program is free software: you can redistribute it and/or modify jaroslav@931: * it under the terms of the GNU General Public License as published by jaroslav@931: * the Free Software Foundation, version 2 of the License. jaroslav@931: * jaroslav@931: * This program is distributed in the hope that it will be useful, jaroslav@931: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@931: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@931: * GNU General Public License for more details. jaroslav@931: * jaroslav@931: * You should have received a copy of the GNU General Public License jaroslav@931: * along with this program. Look for COPYING file in the top folder. jaroslav@931: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@931: */ jaroslav@931: package org.apidesign.bck2brwsr.demo.twitter; jaroslav@931: jaroslav@931: import java.util.Arrays; jaroslav@931: import java.util.List; jaroslav@931: import org.apidesign.bck2brwsr.htmlpage.api.*; jaroslav@931: import org.apidesign.bck2brwsr.htmlpage.api.Page; jaroslav@931: import org.apidesign.bck2brwsr.htmlpage.api.Property; jaroslav@931: import org.apidesign.bck2brwsr.htmlpage.api.ComputedProperty; jaroslav@931: jaroslav@931: /** Controller class for access to Twitter. jaroslav@931: * jaroslav@931: * @author Jaroslav Tulach jaroslav@931: */ jaroslav@931: @Page(xhtml="index.html", className="TwitterModel", properties={ jaroslav@931: @Property(name="savedLists", type=TwitterClient.Twttrs.class, array = true), jaroslav@931: @Property(name="activeTweetersName", type=String.class), jaroslav@931: @Property(name="modifiedList", type=TwitterClient.Twttrs.class), jaroslav@931: @Property(name="userNameToAdd", type=String.class), jaroslav@947: @Property(name="currentTweets", type=TwitterClient.Twt.class, array = true) jaroslav@931: }) jaroslav@931: public class TwitterClient { jaroslav@931: @Model(className = "Tweeters", properties = { jaroslav@931: @Property(name="name", type = String.class), jaroslav@931: @Property(name="userNames", type = String.class, array = true) jaroslav@931: }) jaroslav@931: static class Twttrs { jaroslav@931: } jaroslav@947: @Model(className = "Tweet", properties = { jaroslav@947: @Property(name = "from_user", type = String.class), jaroslav@947: @Property(name = "from_user_id", type = int.class), jaroslav@947: @Property(name = "profile_image_url", type = String.class), jaroslav@947: @Property(name = "text", type = String.class), jaroslav@948: @Property(name = "created_at", type = String.class), jaroslav@947: }) jaroslav@947: static final class Twt { jaroslav@947: } jaroslav@947: @Model(className = "TwitterQuery", properties = { jaroslav@947: @Property(array = true, name = "results", type = Twt.class) jaroslav@947: }) jaroslav@947: public static final class TwttrQr { jaroslav@947: } jaroslav@947: jaroslav@954: @OnReceive(url="{root}/search.json?{query}&callback={me}", jsonp="me") jaroslav@947: static void queryTweets(TwitterModel page, TwitterQuery q) { jaroslav@947: page.getCurrentTweets().clear(); jaroslav@947: page.getCurrentTweets().addAll(q.getResults()); jaroslav@947: } jaroslav@947: jaroslav@949: @OnPropertyChange("activeTweeters") jaroslav@947: static void refreshTweets(TwitterModel model) { jaroslav@947: Tweeters people = model.getActiveTweeters(); jaroslav@947: StringBuilder sb = new StringBuilder(); jaroslav@954: sb.append("rpp=25&q="); jaroslav@947: String sep = ""; jaroslav@947: for (String p : people.getUserNames()) { jaroslav@947: sb.append(sep); jaroslav@947: sb.append("from:"); jaroslav@947: sb.append(p); jaroslav@947: sep = " OR "; jaroslav@947: } jaroslav@954: model.queryTweets("http://search.twitter.com", sb.toString()); jaroslav@947: } jaroslav@931: jaroslav@931: private static Tweeters tweeters(String listName, String... userNames) { jaroslav@931: Tweeters t = new Tweeters(); jaroslav@931: t.setName(listName); jaroslav@931: t.getUserNames().addAll(Arrays.asList(userNames)); jaroslav@931: return t; jaroslav@931: } jaroslav@931: jaroslav@931: static { jaroslav@931: final TwitterModel model = new TwitterModel(); jaroslav@931: final List svdLst = model.getSavedLists(); jaroslav@931: svdLst.add(tweeters("API Design", "JaroslavTulach")); jaroslav@931: svdLst.add(tweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson")); jaroslav@931: svdLst.add(tweeters("Microsoft people", "BillGates", "shanselman", "ScottGu")); jaroslav@931: svdLst.add(tweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans")); jaroslav@931: svdLst.add(tweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror")); jaroslav@931: jaroslav@931: model.setActiveTweetersName("NetBeans"); jaroslav@947: jaroslav@931: model.applyBindings(); jaroslav@931: } jaroslav@931: jaroslav@931: @ComputedProperty jaroslav@931: static Tweeters activeTweeters(String activeTweetersName, List savedLists, Tweeters modifiedList) { jaroslav@931: if (modifiedList != null && modifiedList.getName() != null) { jaroslav@931: if (modifiedList.getName().equals(activeTweetersName)) { jaroslav@931: return modifiedList; jaroslav@931: } jaroslav@931: } jaroslav@931: return findByName(savedLists, activeTweetersName); jaroslav@931: } jaroslav@931: jaroslav@950: @OnPropertyChange("activeTweetersName") jaroslav@950: static void clearModifiedList(TwitterModel m) { jaroslav@950: m.setModifiedList(null); jaroslav@950: } jaroslav@950: jaroslav@931: @ComputedProperty jaroslav@931: static boolean hasUnsavedChanges(Tweeters modifiedList) { jaroslav@931: return modifiedList != null; jaroslav@931: } jaroslav@931: jaroslav@931: @ComputedProperty jaroslav@931: static boolean userNameToAddIsValid(String userNameToAdd, String activeTweetersName, List savedLists, Tweeters modifiedList) { jaroslav@931: Tweeters editingList = activeTweeters(activeTweetersName, savedLists, modifiedList); jaroslav@931: return editingList != null && userNameToAdd != null && jaroslav@931: userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") && jaroslav@931: !editingList.getUserNames().contains(userNameToAdd); jaroslav@931: } jaroslav@931: jaroslav@931: @OnFunction jaroslav@931: static void deleteList(TwitterModel model) { jaroslav@931: final List sl = model.getSavedLists(); jaroslav@931: sl.remove(model.getActiveTweeters()); jaroslav@931: if (sl.isEmpty()) { jaroslav@931: final Tweeters t = new Tweeters(); jaroslav@931: t.setName("New"); jaroslav@931: sl.add(t); jaroslav@931: } jaroslav@931: model.setActiveTweetersName(sl.get(0).getName()); jaroslav@931: } jaroslav@931: jaroslav@931: @OnFunction jaroslav@931: static void saveChanges(TwitterModel model) { jaroslav@931: Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName()); jaroslav@931: int indx = model.getSavedLists().indexOf(t); jaroslav@931: assert indx != -1; jaroslav@931: model.getSavedLists().set(indx, model.getModifiedList()); jaroslav@931: model.setModifiedList(null); jaroslav@931: } jaroslav@931: jaroslav@931: @OnFunction jaroslav@931: static void addUser(TwitterModel model) { jaroslav@931: String n = model.getUserNameToAdd(); jaroslav@931: findModifiedList(model).getUserNames().add(n); jaroslav@931: } jaroslav@931: @OnFunction jaroslav@931: static void removeUser(String data, TwitterModel model) { jaroslav@931: findModifiedList(model).getUserNames().remove(data); jaroslav@931: } jaroslav@931: jaroslav@931: private static Tweeters findModifiedList(TwitterModel model) { jaroslav@931: if (model.getModifiedList() == null || model.getModifiedList().getName() == null) { jaroslav@931: model.setModifiedList(model.getActiveTweeters().clone()); jaroslav@931: } jaroslav@931: return model.getModifiedList(); jaroslav@931: } jaroslav@931: private static Tweeters findByName(List list, String name) { jaroslav@931: for (Tweeters l : list) { jaroslav@931: if (l.getName() != null && l.getName().equals(name)) { jaroslav@931: return l; jaroslav@931: } jaroslav@931: } jaroslav@931: return list.isEmpty() ? null : list.get(0); jaroslav@931: } jaroslav@931: }