javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 04 Apr 2013 13:12:17 +0200
branchmodel
changeset 931 9a7df12648b9
child 947 26f7eeb81aec
permissions -rw-r--r--
Knockout.js Twitter client example rewritten to Bck2Brwsr (just missing JSON access to tweets)
     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=String.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     
    46     private static Tweeters tweeters(String listName, String... userNames) {
    47         Tweeters t = new Tweeters();
    48         t.setName(listName);
    49         t.getUserNames().addAll(Arrays.asList(userNames));
    50         return t;
    51     }
    52     
    53     static {
    54         final TwitterModel model = new TwitterModel();
    55         final List<Tweeters> svdLst = model.getSavedLists();
    56         svdLst.add(tweeters("API Design", "JaroslavTulach"));
    57         svdLst.add(tweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson"));
    58         svdLst.add(tweeters("Microsoft people", "BillGates", "shanselman", "ScottGu"));
    59         svdLst.add(tweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans"));
    60         svdLst.add(tweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror"));
    61 
    62         model.setActiveTweetersName("NetBeans");
    63         
    64         model.applyBindings();
    65     }
    66     
    67     @ComputedProperty
    68     static Tweeters activeTweeters(String activeTweetersName, List<Tweeters> savedLists, Tweeters modifiedList) {
    69         if (modifiedList != null && modifiedList.getName() != null) {
    70             if (modifiedList.getName().equals(activeTweetersName)) {
    71                 return modifiedList;
    72             } else {
    73                 modifiedList.setName(null);
    74             }
    75         }
    76         return findByName(savedLists, activeTweetersName);
    77     }
    78     
    79     @ComputedProperty
    80     static boolean hasUnsavedChanges(Tweeters modifiedList) {
    81         return modifiedList != null;
    82     }
    83     
    84     @ComputedProperty
    85     static boolean userNameToAddIsValid(String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, Tweeters modifiedList) {
    86         Tweeters editingList = activeTweeters(activeTweetersName, savedLists, modifiedList);
    87         return editingList != null && userNameToAdd != null && 
    88             userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
    89             !editingList.getUserNames().contains(userNameToAdd);
    90     }
    91     
    92     @OnFunction
    93     static void deleteList(TwitterModel model) {
    94         final List<Tweeters> sl = model.getSavedLists();
    95         sl.remove(model.getActiveTweeters());
    96         if (sl.isEmpty()) {
    97             final Tweeters t = new Tweeters();
    98             t.setName("New");
    99             sl.add(t);
   100         }
   101         model.setActiveTweetersName(sl.get(0).getName());
   102     }
   103     
   104     @OnFunction
   105     static void saveChanges(TwitterModel model) {
   106         Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
   107         int indx = model.getSavedLists().indexOf(t);
   108         assert indx != -1;
   109         model.getSavedLists().set(indx, model.getModifiedList());
   110         model.setModifiedList(null);
   111     }
   112     
   113     @OnFunction
   114     static void addUser(TwitterModel model) {
   115         String n = model.getUserNameToAdd();
   116         findModifiedList(model).getUserNames().add(n);
   117     }
   118     @OnFunction
   119     static void removeUser(String data, TwitterModel model) {
   120         findModifiedList(model).getUserNames().remove(data);
   121     }
   122     
   123     private static Tweeters findModifiedList(TwitterModel model) {
   124         if (model.getModifiedList() == null || model.getModifiedList().getName() == null) {
   125             model.setModifiedList(model.getActiveTweeters().clone());
   126         }
   127         return model.getModifiedList();
   128     }
   129     private static Tweeters findByName(List<Tweeters> list, String name) {
   130         for (Tweeters l : list) {
   131             if (l.getName() != null && l.getName().equals(name)) {
   132                 return l;
   133             }
   134         }
   135         return list.isEmpty() ? null : list.get(0);
   136     }
   137 }