ko-archetype/src/main/resources/archetype-resources/src/main/java/TwitterClient.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 29 May 2013 19:36:31 +0200
changeset 1222 345274016cb9
parent 1213 022099dee442
permissions -rw-r--r--
Replacing Context in archetype
jaroslav@1202
     1
package ${package};
jaroslav@1202
     2
jaroslav@1202
     3
import java.util.Arrays;
jaroslav@1202
     4
import java.util.List;
jaroslav@1202
     5
import net.java.html.json.ComputedProperty;
jaroslav@1202
     6
import net.java.html.json.Function;
jaroslav@1202
     7
import net.java.html.json.Model;
jaroslav@1202
     8
import net.java.html.json.OnPropertyChange;
jaroslav@1202
     9
import net.java.html.json.OnReceive;
jaroslav@1202
    10
import net.java.html.json.Property;
jaroslav@1202
    11
jaroslav@1202
    12
@Model(className="TwitterModel", properties={
jaroslav@1202
    13
    @Property(name="savedLists", type=Tweeters.class, array = true),
jaroslav@1202
    14
    @Property(name="activeTweetersName", type=String.class),
jaroslav@1202
    15
    @Property(name="activeTweeters", type=String.class, array = true),
jaroslav@1202
    16
    @Property(name="userNameToAdd", type=String.class),
jaroslav@1213
    17
    @Property(name="loading", type=boolean.class),
jaroslav@1202
    18
    @Property(name="currentTweets", type=Tweet.class, array = true)
jaroslav@1202
    19
})
jaroslav@1202
    20
public class TwitterClient {
jaroslav@1202
    21
    @Model(className = "Tweeters", properties = {
jaroslav@1202
    22
        @Property(name="name", type = String.class),
jaroslav@1202
    23
        @Property(name="userNames", type = String.class, array = true)
jaroslav@1202
    24
    })
jaroslav@1202
    25
    static class Twttrs {
jaroslav@1202
    26
    }
jaroslav@1202
    27
    @Model(className = "Tweet", properties = {
jaroslav@1202
    28
        @Property(name = "from_user", type = String.class),
jaroslav@1202
    29
        @Property(name = "from_user_id", type = int.class),
jaroslav@1202
    30
        @Property(name = "profile_image_url", type = String.class),
jaroslav@1202
    31
        @Property(name = "text", type = String.class),
jaroslav@1202
    32
        @Property(name = "created_at", type = String.class),
jaroslav@1202
    33
    })
jaroslav@1202
    34
    static final class Twt {
jaroslav@1202
    35
        @ComputedProperty static String html(String text) {
jaroslav@1202
    36
            StringBuilder sb = new StringBuilder(320);
jaroslav@1202
    37
            for (int pos = 0;;) {
jaroslav@1202
    38
                int http = text.indexOf("http", pos);
jaroslav@1202
    39
                if (http == -1) {
jaroslav@1202
    40
                    sb.append(text.substring(pos));
jaroslav@1202
    41
                    return sb.toString();
jaroslav@1202
    42
                }
jaroslav@1202
    43
                int spc = text.indexOf(' ', http);
jaroslav@1202
    44
                if (spc == -1) {
jaroslav@1202
    45
                    spc = text.length();
jaroslav@1202
    46
                }
jaroslav@1202
    47
                sb.append(text.substring(pos, http));
jaroslav@1202
    48
                String url = text.substring(http, spc);
jaroslav@1202
    49
                sb.append("<a href='").append(url).append("'>").append(url).append("</a>");
jaroslav@1202
    50
                pos = spc;
jaroslav@1202
    51
            }
jaroslav@1202
    52
        }
jaroslav@1202
    53
        
jaroslav@1202
    54
        @ComputedProperty static String userUrl(String from_user) {
jaroslav@1202
    55
            return "http://twitter.com/" + from_user;
jaroslav@1202
    56
        }
jaroslav@1202
    57
    }
jaroslav@1202
    58
    @Model(className = "TwitterQuery", properties = {
jaroslav@1202
    59
        @Property(array = true, name = "results", type = Twt.class)
jaroslav@1202
    60
    })
jaroslav@1202
    61
    public static final class TwttrQr {
jaroslav@1202
    62
    }
jaroslav@1202
    63
    
jaroslav@1202
    64
    @OnReceive(url="{root}/search.json?{query}&callback={me}", jsonp="me")
jaroslav@1202
    65
    static void queryTweets(TwitterModel page, TwitterQuery q) {
jaroslav@1202
    66
        page.getCurrentTweets().clear();
jaroslav@1202
    67
        page.getCurrentTweets().addAll(q.getResults());
jaroslav@1213
    68
        page.setLoading(false);
jaroslav@1202
    69
    }
jaroslav@1202
    70
    
jaroslav@1202
    71
    @OnPropertyChange("activeTweetersName")
jaroslav@1202
    72
    static void changeTweetersList(TwitterModel model) {
jaroslav@1202
    73
        Tweeters people = findByName(model.getSavedLists(), model.getActiveTweetersName());        
jaroslav@1202
    74
        model.getActiveTweeters().clear();
jaroslav@1202
    75
        model.getActiveTweeters().addAll(people.getUserNames());
jaroslav@1202
    76
    }
jaroslav@1202
    77
    
jaroslav@1202
    78
    @OnPropertyChange({ "activeTweeters", "activeTweetersCount" })
jaroslav@1202
    79
    static void refreshTweets(TwitterModel model) {
jaroslav@1202
    80
        StringBuilder sb = new StringBuilder();
jaroslav@1202
    81
        sb.append("rpp=25&q=");
jaroslav@1202
    82
        String sep = "";
jaroslav@1202
    83
        for (String p : model.getActiveTweeters()) {
jaroslav@1202
    84
            sb.append(sep);
jaroslav@1202
    85
            sb.append("from:");
jaroslav@1202
    86
            sb.append(p);
jaroslav@1202
    87
            sep = " OR ";
jaroslav@1202
    88
        }
jaroslav@1213
    89
        model.setLoading(true);
jaroslav@1202
    90
        model.queryTweets("http://search.twitter.com", sb.toString());
jaroslav@1202
    91
    }
jaroslav@1202
    92
    
jaroslav@1202
    93
    static {
jaroslav@1222
    94
        final TwitterModel model = new TwitterModel();
jaroslav@1202
    95
        final List<Tweeters> svdLst = model.getSavedLists();
jaroslav@1202
    96
        svdLst.add(newTweeters("API Design", "JaroslavTulach"));
jaroslav@1202
    97
        svdLst.add(newTweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson"));
jaroslav@1202
    98
        svdLst.add(newTweeters("Microsoft people", "BillGates", "shanselman", "ScottGu"));
jaroslav@1202
    99
        svdLst.add(newTweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans", "petrjiricka"));
jaroslav@1202
   100
        svdLst.add(newTweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror"));
jaroslav@1202
   101
jaroslav@1202
   102
        model.setActiveTweetersName("NetBeans");
jaroslav@1202
   103
jaroslav@1202
   104
        model.applyBindings();
jaroslav@1202
   105
    }
jaroslav@1202
   106
    
jaroslav@1202
   107
    @ComputedProperty
jaroslav@1202
   108
    static boolean hasUnsavedChanges(List<String> activeTweeters, List<Tweeters> savedLists, String activeTweetersName) {
jaroslav@1202
   109
        Tweeters tw = findByName(savedLists, activeTweetersName);
jaroslav@1202
   110
        if (activeTweeters == null) {
jaroslav@1202
   111
            return false;
jaroslav@1202
   112
        }
jaroslav@1202
   113
        return !tw.getUserNames().equals(activeTweeters);
jaroslav@1202
   114
    }
jaroslav@1202
   115
    
jaroslav@1202
   116
    @ComputedProperty
jaroslav@1202
   117
    static int activeTweetersCount(List<String> activeTweeters) {
jaroslav@1202
   118
        return activeTweeters.size();
jaroslav@1202
   119
    }
jaroslav@1202
   120
    
jaroslav@1202
   121
    @ComputedProperty
jaroslav@1202
   122
    static boolean userNameToAddIsValid(
jaroslav@1202
   123
        String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, List<String> activeTweeters
jaroslav@1202
   124
    ) {
jaroslav@1202
   125
        return userNameToAdd != null && 
jaroslav@1202
   126
            userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
jaroslav@1202
   127
            !activeTweeters.contains(userNameToAdd);
jaroslav@1202
   128
    }
jaroslav@1202
   129
    
jaroslav@1202
   130
    @Function
jaroslav@1202
   131
    static void deleteList(TwitterModel model) {
jaroslav@1202
   132
        final List<Tweeters> sl = model.getSavedLists();
jaroslav@1202
   133
        sl.remove(findByName(sl, model.getActiveTweetersName()));
jaroslav@1202
   134
        if (sl.isEmpty()) {
jaroslav@1222
   135
            final Tweeters t = new Tweeters();
jaroslav@1202
   136
            t.setName("New");
jaroslav@1202
   137
            sl.add(t);
jaroslav@1202
   138
        }
jaroslav@1202
   139
        model.setActiveTweetersName(sl.get(0).getName());
jaroslav@1202
   140
    }
jaroslav@1202
   141
    
jaroslav@1202
   142
    @Function
jaroslav@1202
   143
    static void saveChanges(TwitterModel model) {
jaroslav@1202
   144
        Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
jaroslav@1202
   145
        int indx = model.getSavedLists().indexOf(t);
jaroslav@1202
   146
        if (indx != -1) {
jaroslav@1202
   147
            t.setName(model.getActiveTweetersName());
jaroslav@1202
   148
            t.getUserNames().clear();
jaroslav@1202
   149
            t.getUserNames().addAll(model.getActiveTweeters());
jaroslav@1202
   150
        }
jaroslav@1202
   151
    }
jaroslav@1202
   152
    
jaroslav@1202
   153
    @Function
jaroslav@1202
   154
    static void addUser(TwitterModel model) {
jaroslav@1202
   155
        String n = model.getUserNameToAdd();
jaroslav@1202
   156
        model.getActiveTweeters().add(n);
jaroslav@1202
   157
    }
jaroslav@1202
   158
    @Function
jaroslav@1202
   159
    static void removeUser(String data, TwitterModel model) {
jaroslav@1202
   160
        model.getActiveTweeters().remove(data);
jaroslav@1202
   161
    }
jaroslav@1202
   162
    
jaroslav@1202
   163
    private static Tweeters findByName(List<Tweeters> list, String name) {
jaroslav@1202
   164
        for (Tweeters l : list) {
jaroslav@1202
   165
            if (l.getName() != null && l.getName().equals(name)) {
jaroslav@1202
   166
                return l;
jaroslav@1202
   167
            }
jaroslav@1202
   168
        }
jaroslav@1222
   169
        return list.isEmpty() ? new Tweeters() : list.get(0);
jaroslav@1202
   170
    }
jaroslav@1202
   171
    
jaroslav@1202
   172
    private static Tweeters newTweeters(String listName, String... userNames) {
jaroslav@1222
   173
        Tweeters t = new Tweeters();
jaroslav@1202
   174
        t.setName(listName);
jaroslav@1202
   175
        t.getUserNames().addAll(Arrays.asList(userNames));
jaroslav@1202
   176
        return t;
jaroslav@1202
   177
    }
jaroslav@1202
   178
}