javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 08 Apr 2013 18:26:11 +0200
branchmodel
changeset 955 dad881565d0a
parent 954 6448c284fe21
child 956 7fc6b7e9c982
permissions -rw-r--r--
Simplifying code by using @OnPropertyChange a bit more
     1 /**
     2  * Back 2 Browser Bytecode Translator
     3  * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     4  *
     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.
     8  *
     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.
    13  *
    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.
    17  */
    18 package org.apidesign.bck2brwsr.demo.twitter;
    19 
    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;
    26 
    27 /** Controller class for access to Twitter.
    28  * 
    29  * @author Jaroslav Tulach
    30  */
    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)
    37 })
    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)
    42     })
    43     static class Twttrs {
    44     }
    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),
    51     })
    52     static final class Twt {
    53     }
    54     @Model(className = "TwitterQuery", properties = {
    55         @Property(array = true, name = "results", type = Twt.class)
    56     })
    57     public static final class TwttrQr {
    58     }
    59     
    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());
    64     }
    65     
    66     @OnPropertyChange("activeTweetersName")
    67     static void changeTweetersList(TwitterModel model) {
    68         Tweeters people = findByName(model.getSavedLists(), model.getActiveTweetersName());        
    69         model.setActiveTweeters(people.clone());
    70     }
    71     
    72     @OnPropertyChange("activeTweeters")
    73     static void refreshTweets(TwitterModel model) {
    74         Tweeters people = model.getActiveTweeters();
    75         if (people != null) {
    76             StringBuilder sb = new StringBuilder();
    77             sb.append("rpp=25&q=");
    78             String sep = "";
    79             for (String p : people.getUserNames()) {
    80                 sb.append(sep);
    81                 sb.append("from:");
    82                 sb.append(p);
    83                 sep = " OR ";
    84             }
    85             model.queryTweets("http://search.twitter.com", sb.toString());
    86         }
    87     }
    88     
    89     static {
    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"));
    97 
    98         model.setActiveTweetersName("NetBeans");
    99 
   100         model.applyBindings();
   101     }
   102     
   103     @ComputedProperty
   104     static boolean hasUnsavedChanges(Tweeters activeTweeters, List<Tweeters> savedLists, String activeTweetersName) {
   105         Tweeters tw = findByName(savedLists, activeTweetersName);
   106         if (activeTweeters == null) {
   107             return false;
   108         }
   109         return !tw.equals(activeTweeters);
   110     }
   111     
   112     @ComputedProperty
   113     static boolean userNameToAddIsValid(
   114         String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, Tweeters activeTweeters
   115     ) {
   116         return activeTweeters != null && userNameToAdd != null && 
   117             userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
   118             !activeTweeters.getUserNames().contains(userNameToAdd);
   119     }
   120     
   121     @OnFunction
   122     static void deleteList(TwitterModel model) {
   123         final List<Tweeters> sl = model.getSavedLists();
   124         sl.remove(model.getActiveTweeters());
   125         if (sl.isEmpty()) {
   126             final Tweeters t = new Tweeters();
   127             t.setName("New");
   128             sl.add(t);
   129         }
   130         model.setActiveTweetersName(sl.get(0).getName());
   131     }
   132     
   133     @OnFunction
   134     static void saveChanges(TwitterModel model) {
   135         Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
   136         int indx = model.getSavedLists().indexOf(t);
   137         if (indx != -1) {
   138             model.getSavedLists().set(indx, model.getActiveTweeters());
   139         } else {
   140             model.getSavedLists().add(model.getActiveTweeters());
   141         }
   142     }
   143     
   144     @OnFunction
   145     static void addUser(TwitterModel model) {
   146         String n = model.getUserNameToAdd();
   147         model.getActiveTweeters().getUserNames().add(n);
   148     }
   149     @OnFunction
   150     static void removeUser(String data, TwitterModel model) {
   151         model.getActiveTweeters().getUserNames().remove(data);
   152     }
   153     
   154     private static Tweeters findByName(List<Tweeters> list, String name) {
   155         for (Tweeters l : list) {
   156             if (l.getName() != null && l.getName().equals(name)) {
   157                 return l;
   158             }
   159         }
   160         return list.isEmpty() ? new Tweeters() : list.get(0);
   161     }
   162     
   163     private static Tweeters tweeters(String listName, String... userNames) {
   164         Tweeters t = new Tweeters();
   165         t.setName(listName);
   166         t.getUserNames().addAll(Arrays.asList(userNames));
   167         return t;
   168     }
   169     
   170 }