javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 08 Apr 2013 16:51:30 +0200
branchmodel
changeset 954 6448c284fe21
parent 950 445d5f1d4177
child 955 dad881565d0a
permissions -rw-r--r--
Support for JSONP
     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         @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("activeTweeters")
    67     static void refreshTweets(TwitterModel model) {
    68         Tweeters people = model.getActiveTweeters();
    69         StringBuilder sb = new StringBuilder();
    70         sb.append("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("http://search.twitter.com", 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             }
   108         }
   109         return findByName(savedLists, activeTweetersName);
   110     }
   111     
   112     @OnPropertyChange("activeTweetersName")
   113     static void clearModifiedList(TwitterModel m) {
   114         m.setModifiedList(null);
   115     }
   116     
   117     @ComputedProperty
   118     static boolean hasUnsavedChanges(Tweeters modifiedList) {
   119         return modifiedList != null;
   120     }
   121     
   122     @ComputedProperty
   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);
   128     }
   129     
   130     @OnFunction
   131     static void deleteList(TwitterModel model) {
   132         final List<Tweeters> sl = model.getSavedLists();
   133         sl.remove(model.getActiveTweeters());
   134         if (sl.isEmpty()) {
   135             final Tweeters t = new Tweeters();
   136             t.setName("New");
   137             sl.add(t);
   138         }
   139         model.setActiveTweetersName(sl.get(0).getName());
   140     }
   141     
   142     @OnFunction
   143     static void saveChanges(TwitterModel model) {
   144         Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
   145         int indx = model.getSavedLists().indexOf(t);
   146         assert indx != -1;
   147         model.getSavedLists().set(indx, model.getModifiedList());
   148         model.setModifiedList(null);
   149     }
   150     
   151     @OnFunction
   152     static void addUser(TwitterModel model) {
   153         String n = model.getUserNameToAdd();
   154         findModifiedList(model).getUserNames().add(n);
   155     }
   156     @OnFunction
   157     static void removeUser(String data, TwitterModel model) {
   158         findModifiedList(model).getUserNames().remove(data);
   159     }
   160     
   161     private static Tweeters findModifiedList(TwitterModel model) {
   162         if (model.getModifiedList() == null || model.getModifiedList().getName() == null) {
   163             model.setModifiedList(model.getActiveTweeters().clone());
   164         }
   165         return model.getModifiedList();
   166     }
   167     private static Tweeters findByName(List<Tweeters> list, String name) {
   168         for (Tweeters l : list) {
   169             if (l.getName() != null && l.getName().equals(name)) {
   170                 return l;
   171             }
   172         }
   173         return list.isEmpty() ? null : list.get(0);
   174     }
   175 }