# HG changeset patch # User Jaroslav Tulach # Date 1365442222 -7200 # Node ID 7fc6b7e9c9827d1a9dc35d079c5bd9c81df7c80b # Parent dad881565d0a8d0f4531169beed843daf8feddf2 Making list of activeTweeters really a list. It is easier to observe its changes. diff -r dad881565d0a -r 7fc6b7e9c982 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Apr 08 18:26:11 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Apr 08 19:30:22 2013 +0200 @@ -48,7 +48,6 @@ import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.ArrayType; -import javax.lang.model.type.DeclaredType; import javax.lang.model.type.MirroredTypeException; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; @@ -596,7 +595,7 @@ } w.write(" try {\n"); w.write(" locked = true;\n"); - w.write(" return " + e.getEnclosingElement().getSimpleName() + '.' + e.getSimpleName() + "("); + w.write(" return " + fqn(ee.getEnclosingElement().asType(), ee) + '.' + e.getSimpleName() + "("); String sep = ""; for (int i = 1; i <= arg; i++) { w.write(sep); diff -r dad881565d0a -r 7fc6b7e9c982 javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java --- a/javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java Mon Apr 08 18:26:11 2013 +0200 +++ b/javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java Mon Apr 08 19:30:22 2013 +0200 @@ -31,7 +31,7 @@ @Page(xhtml="index.html", className="TwitterModel", properties={ @Property(name="savedLists", type=TwitterClient.Twttrs.class, array = true), @Property(name="activeTweetersName", type=String.class), - @Property(name="activeTweeters", type=TwitterClient.Twttrs.class), + @Property(name="activeTweeters", type=String.class, array = true), @Property(name="userNameToAdd", type=String.class), @Property(name="currentTweets", type=TwitterClient.Twt.class, array = true) }) @@ -50,6 +50,28 @@ @Property(name = "created_at", type = String.class), }) static final class Twt { + @ComputedProperty static String html(String text) { + StringBuilder sb = new StringBuilder(320); + for (int pos = 0;;) { + int http = text.indexOf("http", pos); + if (http == -1) { + sb.append(text.substring(pos)); + return sb.toString(); + } + int spc = text.indexOf(' ', http); + if (spc == -1) { + spc = text.length(); + } + sb.append(text.substring(pos, http)); + String url = text.substring(http, spc); + sb.append("").append(url).append(""); + pos = spc; + } + } + + @ComputedProperty static String userUrl(String from_user) { + return "http://twitter.com/" + from_user; + } } @Model(className = "TwitterQuery", properties = { @Property(array = true, name = "results", type = Twt.class) @@ -66,34 +88,32 @@ @OnPropertyChange("activeTweetersName") static void changeTweetersList(TwitterModel model) { Tweeters people = findByName(model.getSavedLists(), model.getActiveTweetersName()); - model.setActiveTweeters(people.clone()); + model.getActiveTweeters().clear(); + model.getActiveTweeters().addAll(people.getUserNames()); } - @OnPropertyChange("activeTweeters") + @OnPropertyChange({ "activeTweeters", "activeTweetersCount" }) static void refreshTweets(TwitterModel model) { - Tweeters people = model.getActiveTweeters(); - if (people != null) { - StringBuilder sb = new StringBuilder(); - sb.append("rpp=25&q="); - String sep = ""; - for (String p : people.getUserNames()) { - sb.append(sep); - sb.append("from:"); - sb.append(p); - sep = " OR "; - } - model.queryTweets("http://search.twitter.com", sb.toString()); + StringBuilder sb = new StringBuilder(); + sb.append("rpp=25&q="); + String sep = ""; + for (String p : model.getActiveTweeters()) { + sb.append(sep); + sb.append("from:"); + sb.append(p); + sep = " OR "; } + model.queryTweets("http://search.twitter.com", sb.toString()); } static { final TwitterModel model = new TwitterModel(); final List svdLst = model.getSavedLists(); - svdLst.add(tweeters("API Design", "JaroslavTulach")); - svdLst.add(tweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson")); - svdLst.add(tweeters("Microsoft people", "BillGates", "shanselman", "ScottGu")); - svdLst.add(tweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans")); - svdLst.add(tweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror")); + svdLst.add(newTweeters("API Design", "JaroslavTulach")); + svdLst.add(newTweeters("Celebrities", "JohnCleese", "MCHammer", "StephenFry", "algore", "StevenSanderson")); + svdLst.add(newTweeters("Microsoft people", "BillGates", "shanselman", "ScottGu")); + svdLst.add(newTweeters("NetBeans", "GeertjanW","monacotoni", "NetBeans", "petrjiricka")); + svdLst.add(newTweeters("Tech pundits", "Scobleizer", "LeoLaporte", "techcrunch", "BoingBoing", "timoreilly", "codinghorror")); model.setActiveTweetersName("NetBeans"); @@ -101,27 +121,32 @@ } @ComputedProperty - static boolean hasUnsavedChanges(Tweeters activeTweeters, List savedLists, String activeTweetersName) { + static boolean hasUnsavedChanges(List activeTweeters, List savedLists, String activeTweetersName) { Tweeters tw = findByName(savedLists, activeTweetersName); if (activeTweeters == null) { return false; } - return !tw.equals(activeTweeters); + return !tw.getUserNames().equals(activeTweeters); + } + + @ComputedProperty + static int activeTweetersCount(List activeTweeters) { + return activeTweeters.size(); } @ComputedProperty static boolean userNameToAddIsValid( - String userNameToAdd, String activeTweetersName, List savedLists, Tweeters activeTweeters + String userNameToAdd, String activeTweetersName, List savedLists, List activeTweeters ) { - return activeTweeters != null && userNameToAdd != null && + return userNameToAdd != null && userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") && - !activeTweeters.getUserNames().contains(userNameToAdd); + !activeTweeters.contains(userNameToAdd); } @OnFunction static void deleteList(TwitterModel model) { final List sl = model.getSavedLists(); - sl.remove(model.getActiveTweeters()); + sl.remove(findByName(sl, model.getActiveTweetersName())); if (sl.isEmpty()) { final Tweeters t = new Tweeters(); t.setName("New"); @@ -135,20 +160,20 @@ Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName()); int indx = model.getSavedLists().indexOf(t); if (indx != -1) { - model.getSavedLists().set(indx, model.getActiveTweeters()); - } else { - model.getSavedLists().add(model.getActiveTweeters()); + t.setName(model.getActiveTweetersName()); + t.getUserNames().clear(); + t.getUserNames().addAll(model.getActiveTweeters()); } } @OnFunction static void addUser(TwitterModel model) { String n = model.getUserNameToAdd(); - model.getActiveTweeters().getUserNames().add(n); + model.getActiveTweeters().add(n); } @OnFunction static void removeUser(String data, TwitterModel model) { - model.getActiveTweeters().getUserNames().remove(data); + model.getActiveTweeters().remove(data); } private static Tweeters findByName(List list, String name) { @@ -160,11 +185,10 @@ return list.isEmpty() ? new Tweeters() : list.get(0); } - private static Tweeters tweeters(String listName, String... userNames) { + private static Tweeters newTweeters(String listName, String... userNames) { Tweeters t = new Tweeters(); t.setName(listName); t.getUserNames().addAll(Arrays.asList(userNames)); return t; } - } diff -r dad881565d0a -r 7fc6b7e9c982 javaquery/demo-twitter/src/main/resources/org/apidesign/bck2brwsr/demo/twitter/index.html --- a/javaquery/demo-twitter/src/main/resources/org/apidesign/bck2brwsr/demo/twitter/index.html Mon Apr 08 18:26:11 2013 +0200 +++ b/javaquery/demo-twitter/src/main/resources/org/apidesign/bck2brwsr/demo/twitter/index.html Mon Apr 08 19:30:22 2013 +0200 @@ -44,7 +44,7 @@ This code based on original knockout.js Twitter example and uses almost unmodified HTML code. It just changes the model. It is written in Java language and it is executed using Bck2Brwsr - virtual machine. The Java source code has about 170 lines and is available + virtual machine. The Java source code has about 190 lines and is available here - in fact it may even be more dense than the original JavaScript model.

@@ -52,14 +52,14 @@
- +
-

Currently viewing user(s):

-
-
    +

    Currently viewing user(s):

    +
    +
    • @@ -79,8 +79,8 @@ - - + +
      diff -r dad881565d0a -r 7fc6b7e9c982 javaquery/demo-twitter/src/test/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClientTest.java --- a/javaquery/demo-twitter/src/test/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClientTest.java Mon Apr 08 18:26:11 2013 +0200 +++ b/javaquery/demo-twitter/src/test/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClientTest.java Mon Apr 08 19:30:22 2013 +0200 @@ -17,6 +17,7 @@ */ package org.apidesign.bck2brwsr.demo.twitter; +import java.util.List; import static org.testng.Assert.*; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -46,11 +47,10 @@ assertFalse(model.isUserNameToAddIsValid(), "Can't add Joe for the 2nd time"); assertEquals(t.getUserNames().size(), 0, "Original tweeters list remains empty"); - Tweeters mod = model.getActiveTweeters(); - assertNotNull(mod, "Modified list is not filled in"); + List mod = model.getActiveTweeters(); assertTrue(model.isHasUnsavedChanges(), "We have modifications"); - assertEquals(mod.getUserNames().size(), 1, "One element in the list"); - assertEquals(mod.getUserNames().get(0), "Joe", "Its name is Joe"); + assertEquals(mod.size(), 1, "One element in the list"); + assertEquals(mod.get(0), "Joe", "Its name is Joe"); assertSame(model.getActiveTweeters(), mod, "Editing list is the modified one"); @@ -58,8 +58,10 @@ assertFalse(model.isHasUnsavedChanges(), "Does not have anything to save"); assertSame(model.getActiveTweeters(), mod, "Still editing the old modified one"); - - assertFalse(model.getSavedLists().contains(t), "No longer contains old list"); } + @Test public void httpAtTheEnd() { + String res = TwitterClient.Twt.html("Ahoj http://kuk"); + assertEquals(res, "Ahoj http://kuk"); + } }