javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 07 Apr 2013 22:32:41 +0200
branchmodel
changeset 947 26f7eeb81aec
parent 931 9a7df12648b9
child 948 35f4f8af296c
permissions -rw-r--r--
Primitive types supported and we can parse the twitter reply
     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="modifiedList", 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         
    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="{url}")
    61     static void queryTweets(TwitterModel page, TwitterQuery q) {
    62         page.getCurrentTweets().clear();
    63         page.getCurrentTweets().addAll(q.getResults());
    64     }
    65     
    66     @OnFunction
    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?callback=?&rpp=25&q=");
    71         String sep = "";
    72         for (String p : people.getUserNames()) {
    73             sb.append(sep);
    74             sb.append("from:");
    75             sb.append(p);
    76             sep = " OR ";
    77         }
    78         model.queryTweets(sb.toString());
    79     }
    80     
    81     private static Tweeters tweeters(String listName, String... userNames) {
    82         Tweeters t = new Tweeters();
    83         t.setName(listName);
    84         t.getUserNames().addAll(Arrays.asList(userNames));
    85         return t;
    86     }
    87     
    88     static {
    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"));
    96 
    97         model.setActiveTweetersName("NetBeans");
    98 
    99         model.applyBindings();
   100     }
   101     
   102     @ComputedProperty
   103     static Tweeters activeTweeters(String activeTweetersName, List<Tweeters> savedLists, Tweeters modifiedList) {
   104         if (modifiedList != null && modifiedList.getName() != null) {
   105             if (modifiedList.getName().equals(activeTweetersName)) {
   106                 return modifiedList;
   107             } else {
   108                 modifiedList.setName(null);
   109             }
   110         }
   111         return findByName(savedLists, activeTweetersName);
   112     }
   113     
   114     @ComputedProperty
   115     static boolean hasUnsavedChanges(Tweeters modifiedList) {
   116         return modifiedList != null;
   117     }
   118     
   119     @ComputedProperty
   120     static boolean userNameToAddIsValid(String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, Tweeters modifiedList) {
   121         Tweeters editingList = activeTweeters(activeTweetersName, savedLists, modifiedList);
   122         return editingList != null && userNameToAdd != null && 
   123             userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
   124             !editingList.getUserNames().contains(userNameToAdd);
   125     }
   126     
   127     @OnFunction
   128     static void deleteList(TwitterModel model) {
   129         final List<Tweeters> sl = model.getSavedLists();
   130         sl.remove(model.getActiveTweeters());
   131         if (sl.isEmpty()) {
   132             final Tweeters t = new Tweeters();
   133             t.setName("New");
   134             sl.add(t);
   135         }
   136         model.setActiveTweetersName(sl.get(0).getName());
   137     }
   138     
   139     @OnFunction
   140     static void saveChanges(TwitterModel model) {
   141         Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
   142         int indx = model.getSavedLists().indexOf(t);
   143         assert indx != -1;
   144         model.getSavedLists().set(indx, model.getModifiedList());
   145         model.setModifiedList(null);
   146     }
   147     
   148     @OnFunction
   149     static void addUser(TwitterModel model) {
   150         String n = model.getUserNameToAdd();
   151         findModifiedList(model).getUserNames().add(n);
   152     }
   153     @OnFunction
   154     static void removeUser(String data, TwitterModel model) {
   155         findModifiedList(model).getUserNames().remove(data);
   156     }
   157     
   158     private static Tweeters findModifiedList(TwitterModel model) {
   159         if (model.getModifiedList() == null || model.getModifiedList().getName() == null) {
   160             model.setModifiedList(model.getActiveTweeters().clone());
   161         }
   162         return model.getModifiedList();
   163     }
   164     private static Tweeters findByName(List<Tweeters> list, String name) {
   165         for (Tweeters l : list) {
   166             if (l.getName() != null && l.getName().equals(name)) {
   167                 return l;
   168             }
   169         }
   170         return list.isEmpty() ? null : list.get(0);
   171     }
   172 }