From 3cff51a7f2bf5a5d9b78482f408da1b70037994c Mon Sep 17 00:00:00 2001 From: Owen Dunn Date: Sun, 6 Dec 2009 15:13:48 +0000 Subject: [PATCH] Initial commit of Yarrg code --- src/PCTB.xml | 47 + .../myjavatools/web/ClientHttpRequest.java | 511 +++++++++ .../AWTEventMonitor$AWTEventsListener.class | Bin 0 -> 13611 bytes .../accessibility/util/AWTEventMonitor.class | Bin 0 -> 5928 bytes ...ntMonitor$AccessibilityEventListener.class | Bin 0 -> 4910 bytes .../util/AccessibilityEventMonitor.class | Bin 0 -> 2073 bytes .../util/AccessibilityListenerList.class | Bin 0 -> 2591 bytes .../util/ComponentEvtDispatchThread.class | Bin 0 -> 1824 bytes .../sun/java/accessibility/util/EventID.class | Bin 0 -> 1273 bytes .../util/EventQueueMonitor.class | Bin 0 -> 8035 bytes .../util/EventQueueMonitorItem.class | Bin 0 -> 484 bytes .../util/GUIInitializedListener.class | Bin 0 -> 219 bytes .../util/GUIInitializedMulticaster.class | Bin 0 -> 1508 bytes ...SwingEventMonitor$SwingEventListener.class | Bin 0 -> 34979 bytes .../util/SwingEventMonitor.class | Bin 0 -> 10855 bytes .../util/TopLevelWindowListener.class | Bin 0 -> 277 bytes .../util/TopLevelWindowMulticaster.class | Bin 0 -> 1705 bytes .../java/accessibility/util/Translator.class | Bin 0 -> 9472 bytes .../util/java/awt/ButtonTranslator.class | Bin 0 -> 969 bytes .../util/java/awt/CheckboxTranslator.class | Bin 0 -> 1443 bytes .../util/java/awt/LabelTranslator.class | Bin 0 -> 957 bytes .../util/java/awt/ListTranslator.class | Bin 0 -> 1237 bytes .../java/awt/TextComponentTranslator.class | Bin 0 -> 619 bytes src/com/tedpearson/util/update/Updater.java | 189 ++++ .../tedpearson/ypp/market/ControlPanel.java | 59 ++ src/com/tedpearson/ypp/market/Installer.java | 345 +++++++ .../tedpearson/ypp/market/MarketUploader.java | 967 ++++++++++++++++++ 27 files changed, 2118 insertions(+) create mode 100644 src/PCTB.xml create mode 100644 src/com/myjavatools/web/ClientHttpRequest.java create mode 100644 src/com/sun/java/accessibility/util/AWTEventMonitor$AWTEventsListener.class create mode 100644 src/com/sun/java/accessibility/util/AWTEventMonitor.class create mode 100644 src/com/sun/java/accessibility/util/AccessibilityEventMonitor$AccessibilityEventListener.class create mode 100644 src/com/sun/java/accessibility/util/AccessibilityEventMonitor.class create mode 100644 src/com/sun/java/accessibility/util/AccessibilityListenerList.class create mode 100644 src/com/sun/java/accessibility/util/ComponentEvtDispatchThread.class create mode 100644 src/com/sun/java/accessibility/util/EventID.class create mode 100644 src/com/sun/java/accessibility/util/EventQueueMonitor.class create mode 100644 src/com/sun/java/accessibility/util/EventQueueMonitorItem.class create mode 100644 src/com/sun/java/accessibility/util/GUIInitializedListener.class create mode 100644 src/com/sun/java/accessibility/util/GUIInitializedMulticaster.class create mode 100644 src/com/sun/java/accessibility/util/SwingEventMonitor$SwingEventListener.class create mode 100644 src/com/sun/java/accessibility/util/SwingEventMonitor.class create mode 100644 src/com/sun/java/accessibility/util/TopLevelWindowListener.class create mode 100644 src/com/sun/java/accessibility/util/TopLevelWindowMulticaster.class create mode 100644 src/com/sun/java/accessibility/util/Translator.class create mode 100644 src/com/sun/java/accessibility/util/java/awt/ButtonTranslator.class create mode 100644 src/com/sun/java/accessibility/util/java/awt/CheckboxTranslator.class create mode 100644 src/com/sun/java/accessibility/util/java/awt/LabelTranslator.class create mode 100644 src/com/sun/java/accessibility/util/java/awt/ListTranslator.class create mode 100644 src/com/sun/java/accessibility/util/java/awt/TextComponentTranslator.class create mode 100644 src/com/tedpearson/util/update/Updater.java create mode 100644 src/com/tedpearson/ypp/market/ControlPanel.java create mode 100644 src/com/tedpearson/ypp/market/Installer.java create mode 100644 src/com/tedpearson/ypp/market/MarketUploader.java diff --git a/src/PCTB.xml b/src/PCTB.xml new file mode 100644 index 0000000..72a093b --- /dev/null +++ b/src/PCTB.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/myjavatools/web/ClientHttpRequest.java b/src/com/myjavatools/web/ClientHttpRequest.java new file mode 100644 index 0000000..f16c71c --- /dev/null +++ b/src/com/myjavatools/web/ClientHttpRequest.java @@ -0,0 +1,511 @@ +package com.myjavatools.web; + +import java.net.URLConnection; +import java.net.URL; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.io.File; +import java.io.InputStream; +import java.util.Random; +import java.io.OutputStream; +import java.io.FileInputStream; +import java.util.Iterator; + +/** + *

Title: Client HTTP Request class

+ *

Description: this class helps to send POST HTTP requests with various form data, + * including files. Cookies can be added to be included in the request.

+ *

Modified by Ted Pearson(ted@tedpearson.com) 5/4/09

+ * + * @author Vlad Patryshev + * @version 1.0 + */ +public class ClientHttpRequest { + URLConnection connection; + OutputStream os = null; + Map cookies = new HashMap(); + + protected void connect() throws IOException { + if (os == null) os = connection.getOutputStream(); + } + + protected void write(char c) throws IOException { + connect(); + os.write(c); + } + + protected void write(String s) throws IOException { + connect(); + os.write(s.getBytes()); + } + + protected void newline() throws IOException { + connect(); + write("\r\n"); + } + + protected void writeln(String s) throws IOException { + connect(); + write(s); + newline(); + } + + private static Random random = new Random(); + + protected static String randomString() { + return Long.toString(random.nextLong(), 36); + } + + String boundary = "---------------------------" + randomString() + randomString() + randomString(); + + private void boundary() throws IOException { + write("--"); + write(boundary); + } + + /** + * Creates a new multipart POST HTTP request on a freshly opened URLConnection + * + * @param connection an already open URL connection + * @throws IOException + */ + public ClientHttpRequest(URLConnection connection) throws IOException { + this.connection = connection; + connection.setDoOutput(true); + connection.setRequestProperty("Content-Type", + "multipart/form-data; boundary=" + boundary); + } + + /** + * Creates a new multipart POST HTTP request for a specified URL + * + * @param url the URL to send request to + * @throws IOException + */ + public ClientHttpRequest(URL url) throws IOException { + this(url.openConnection()); + } + + /** + * Creates a new multipart POST HTTP request for a specified URL string + * + * @param urlString the string representation of the URL to send request to + * @throws IOException + */ + public ClientHttpRequest(String urlString) throws IOException { + this(new URL(urlString)); + } + + + private void postCookies() { + StringBuffer cookieList = new StringBuffer(); + + for (Iterator i = cookies.entrySet().iterator(); i.hasNext();) { + Map.Entry entry = (Map.Entry)(i.next()); + cookieList.append(entry.getKey().toString() + "=" + entry.getValue()); + + if (i.hasNext()) { + cookieList.append("; "); + } + } + if (cookieList.length() > 0) { + connection.setRequestProperty("Cookie", cookieList.toString()); + } + } + + /** + * adds a cookie to the requst + * @param name cookie name + * @param value cookie value + * @throws IOException + */ + public void setCookie(String name, String value) throws IOException { + cookies.put(name, value); + } + + /** + * adds cookies to the request + * @param cookies the cookie "name-to-value" map + * @throws IOException + */ + public void setCookies(Map cookies) throws IOException { + if (cookies == null) return; + this.cookies.putAll(cookies); + } + + /** + * adds cookies to the request + * @param cookies array of cookie names and values (cookies[2*i] is a name, cookies[2*i + 1] is a value) + * @throws IOException + */ + public void setCookies(String[] cookies) throws IOException { + if (cookies == null) return; + for (int i = 0; i < cookies.length - 1; i+=2) { + setCookie(cookies[i], cookies[i+1]); + } + } + + private void writeName(String name) throws IOException { + newline(); + write("Content-Disposition: form-data; name=\""); + write(name); + write('"'); + } + + /** + * adds a string parameter to the request + * @param name parameter name + * @param value parameter value + * @throws IOException + */ + public void setParameter(String name, String value) throws IOException { + boundary(); + writeName(name); + newline(); newline(); + writeln(value); + } + + private static void pipe(InputStream in, OutputStream out) throws IOException { + byte[] buf = new byte[500000]; + int nread; + int navailable; + int total = 0; + synchronized (in) { + while((nread = in.read(buf, 0, buf.length)) >= 0) { + out.write(buf, 0, nread); + total += nread; + } + } + out.flush(); + buf = null; + } + + /** + * adds a file parameter to the request + * @param name parameter name + * @param filename the name of the file + * @param is input stream to read the contents of the file from + * @throws IOException + */ + public void setParameter(String name, String filename, InputStream is) throws IOException { + String type = connection.guessContentTypeFromName(filename); + if (type == null) type = "application/octet-stream"; + setParameter(name, filename, is, type); + } + + /** + * adds a file parameter to the request + * @param name parameter name + * @param filename the name of the file + * @param is input stream to read the contents of the file from + * @param type Content-Type of the file + * @throws IOException + */ + public void setParameter(String name, String filename, InputStream is, String type) throws IOException { + boundary(); + writeName(name); + write("; filename=\""); + write(filename); + write('"'); + newline(); + write("Content-Type: "); + writeln(type); + newline(); + pipe(is, os); + newline(); + } + + /** + * adds a file parameter to the request + * @param name parameter name + * @param file the file to upload + * @throws IOException + */ + public void setParameter(String name, File file) throws IOException { + setParameter(name, file.getPath(), new FileInputStream(file)); + } + + /** + * adds a parameter to the request; if the parameter is a File, the file is uploaded, otherwise the string value of the parameter is passed in the request + * @param name parameter name + * @param object parameter value, a File or anything else that can be stringified + * @throws IOException + */ + public void setParameter(String name, Object object) throws IOException { + if (object instanceof File) { + setParameter(name, (File) object); + } else { + setParameter(name, object.toString()); + } + } + + /** + * adds parameters to the request + * @param parameters "name-to-value" map of parameters; if a value is a file, the file is uploaded, otherwise it is stringified and sent in the request + * @throws IOException + */ + public void setParameters(Map parameters) throws IOException { + if (parameters == null) return; + for (Iterator i = parameters.entrySet().iterator(); i.hasNext();) { + Map.Entry entry = (Map.Entry)i.next(); + setParameter(entry.getKey().toString(), entry.getValue()); + } + } + + /** + * adds parameters to the request + * @param parameters array of parameter names and values (parameters[2*i] is a name, parameters[2*i + 1] is a value); if a value is a file, the file is uploaded, otherwise it is stringified and sent in the request + * @throws IOException + */ + public void setParameters(Object[] parameters) throws IOException { + if (parameters == null) return; + for (int i = 0; i < parameters.length - 1; i+=2) { + setParameter(parameters[i].toString(), parameters[i+1]); + } + } + + /** + * posts the requests to the server, with all the cookies and parameters that were added + * @return input stream with the server response + * @throws IOException + */ + public InputStream post() throws IOException { + boundary(); + writeln("--"); + os.close(); + InputStream tis; + try { + tis = connection.getInputStream(); + } catch (IOException e) { + tis = ((java.net.HttpURLConnection) connection).getErrorStream(); + } + return tis; + } + + /** + * posts the requests to the server, with all the cookies and parameters that were added before (if any), and with parameters that are passed in the argument + * @param parameters request parameters + * @return input stream with the server response + * @throws IOException + * @see setParameters + */ + public InputStream post(Map parameters) throws IOException { + setParameters(parameters); + return post(); + } + + /** + * posts the requests to the server, with all the cookies and parameters that were added before (if any), and with parameters that are passed in the argument + * @param parameters request parameters + * @return input stream with the server response + * @throws IOException + * @see setParameters + */ + public InputStream post(Object[] parameters) throws IOException { + setParameters(parameters); + return post(); + } + + /** + * posts the requests to the server, with all the cookies and parameters that were added before (if any), and with cookies and parameters that are passed in the arguments + * @param cookies request cookies + * @param parameters request parameters + * @return input stream with the server response + * @throws IOException + * @see setParameters + * @see setCookies + */ + public InputStream post(Map cookies, Map parameters) throws IOException { + setCookies(cookies); + setParameters(parameters); + return post(); + } + + /** + * posts the requests to the server, with all the cookies and parameters that were added before (if any), and with cookies and parameters that are passed in the arguments + * @param cookies request cookies + * @param parameters request parameters + * @return input stream with the server response + * @throws IOException + * @see setParameters + * @see setCookies + */ + public InputStream post(String[] cookies, Object[] parameters) throws IOException { + setCookies(cookies); + setParameters(parameters); + return post(); + } + + /** + * post the POST request to the server, with the specified parameter + * @param name parameter name + * @param value parameter value + * @return input stream with the server response + * @throws IOException + * @see setParameter + */ + public InputStream post(String name, Object value) throws IOException { + setParameter(name, value); + return post(); + } + + /** + * post the POST request to the server, with the specified parameters + * @param name1 first parameter name + * @param value1 first parameter value + * @param name2 second parameter name + * @param value2 second parameter value + * @return input stream with the server response + * @throws IOException + * @see setParameter + */ + public InputStream post(String name1, Object value1, String name2, Object value2) throws IOException { + setParameter(name1, value1); + return post(name2, value2); + } + + /** + * post the POST request to the server, with the specified parameters + * @param name1 first parameter name + * @param value1 first parameter value + * @param name2 second parameter name + * @param value2 second parameter value + * @param name3 third parameter name + * @param value3 third parameter value + * @return input stream with the server response + * @throws IOException + * @see setParameter + */ + public InputStream post(String name1, Object value1, String name2, Object value2, String name3, Object value3) throws IOException { + setParameter(name1, value1); + return post(name2, value2, name3, value3); + } + + /** + * post the POST request to the server, with the specified parameters + * @param name1 first parameter name + * @param value1 first parameter value + * @param name2 second parameter name + * @param value2 second parameter value + * @param name3 third parameter name + * @param value3 third parameter value + * @param name4 fourth parameter name + * @param value4 fourth parameter value + * @return input stream with the server response + * @throws IOException + * @see setParameter + */ + public InputStream post(String name1, Object value1, String name2, Object value2, String name3, Object value3, String name4, Object value4) throws IOException { + setParameter(name1, value1); + return post(name2, value2, name3, value3, name4, value4); + } + + /** + * posts a new request to specified URL, with parameters that are passed in the argument + * @param parameters request parameters + * @return input stream with the server response + * @throws IOException + * @see setParameters + */ + public static InputStream post(URL url, Map parameters) throws IOException { + return new ClientHttpRequest(url).post(parameters); + } + + /** + * posts a new request to specified URL, with parameters that are passed in the argument + * @param parameters request parameters + * @return input stream with the server response + * @throws IOException + * @see setParameters + */ + public static InputStream post(URL url, Object[] parameters) throws IOException { + return new ClientHttpRequest(url).post(parameters); + } + + /** + * posts a new request to specified URL, with cookies and parameters that are passed in the argument + * @param cookies request cookies + * @param parameters request parameters + * @return input stream with the server response + * @throws IOException + * @see setCookies + * @see setParameters + */ + public static InputStream post(URL url, Map cookies, Map parameters) throws IOException { + return new ClientHttpRequest(url).post(cookies, parameters); + } + + /** + * posts a new request to specified URL, with cookies and parameters that are passed in the argument + * @param cookies request cookies + * @param parameters request parameters + * @return input stream with the server response + * @throws IOException + * @see setCookies + * @see setParameters + */ + public static InputStream post(URL url, String[] cookies, Object[] parameters) throws IOException { + return new ClientHttpRequest(url).post(cookies, parameters); + } + + /** + * post the POST request specified URL, with the specified parameter + * @param name parameter name + * @param value parameter value + * @return input stream with the server response + * @throws IOException + * @see setParameter + */ + public static InputStream post(URL url, String name1, Object value1) throws IOException { + return new ClientHttpRequest(url).post(name1, value1); + } + + /** + * post the POST request to specified URL, with the specified parameters + * @param name1 first parameter name + * @param value1 first parameter value + * @param name2 second parameter name + * @param value2 second parameter value + * @return input stream with the server response + * @throws IOException + * @see setParameter + */ + public static InputStream post(URL url, String name1, Object value1, String name2, Object value2) throws IOException { + return new ClientHttpRequest(url).post(name1, value1, name2, value2); + } + + /** + * post the POST request to specified URL, with the specified parameters + * @param name1 first parameter name + * @param value1 first parameter value + * @param name2 second parameter name + * @param value2 second parameter value + * @param name3 third parameter name + * @param value3 third parameter value + * @return input stream with the server response + * @throws IOException + * @see setParameter + */ + public static InputStream post(URL url, String name1, Object value1, String name2, Object value2, String name3, Object value3) throws IOException { + return new ClientHttpRequest(url).post(name1, value1, name2, value2, name3, value3); + } + + /** + * post the POST request to specified URL, with the specified parameters + * @param name1 first parameter name + * @param value1 first parameter value + * @param name2 second parameter name + * @param value2 second parameter value + * @param name3 third parameter name + * @param value3 third parameter value + * @param name4 fourth parameter name + * @param value4 fourth parameter value + * @return input stream with the server response + * @throws IOException + * @see setParameter + */ + public static InputStream post(URL url, String name1, Object value1, String name2, Object value2, String name3, Object value3, String name4, Object value4) throws IOException { + return new ClientHttpRequest(url).post(name1, value1, name2, value2, name3, value3, name4, value4); + } +} diff --git a/src/com/sun/java/accessibility/util/AWTEventMonitor$AWTEventsListener.class b/src/com/sun/java/accessibility/util/AWTEventMonitor$AWTEventsListener.class new file mode 100644 index 0000000000000000000000000000000000000000..167bb3ff7c77ea9c0689e55f9a207eafc5c2fd44 GIT binary patch literal 13611 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 literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/AccessibilityEventMonitor$AccessibilityEventListener.class b/src/com/sun/java/accessibility/util/AccessibilityEventMonitor$AccessibilityEventListener.class new file mode 100644 index 0000000000000000000000000000000000000000..d96c32f71ae95c969f86b49749abfe9440683763 GIT binary patch literal 4910 zcmcInYjhN68GgRa?#^a1A&{`Z0-*s?F1u;A(1Mf{5JIrg5Lyzb6fd1@CS-6k6L)7x zQmL(#-t5I|t02`<3#pgZmg**eQlJ{N{6+2iWr7!Pz_6tY!%Be zT#e5nr6LVSPBZdxNIpg+$*6pc$>{^t_#6(aco3hj=GsFcJS_LVpx}`jEW#I69KoX@ zJf`AtJRv7f%Ey-!JXMXS@r;6JRWxHTgfGkYS5$lzUy~y~zK(Awcuv9d3ce|@GLh8N z>E?s_A-%cJ(5-ay-6?z6NI7HegSvIV=rYreVHqibIbD({p5$u0T^?!^sO}lFoI%4e z69U0IP0MsP3skLIy;s2BZuc7kbzP=qbZ3V8j8w1Qm*h%)mz~g)d-aql=eb3{Gias- z7H&->jC9)UGn1w>)^W(NoT36+r$t3v(FSSvb|vhgcsgUnUA^?ulktpWCgayK+i6op zJJo#cPF@U+nr&KXM^7g6OO#dT*u!1MAtQOOY4zJ9T&dsh!J&^hac_|)g~@-X!17h@ z=4iZJsl3#r(IycRx0nX_20KX0)gF2aud79FYbF&-uyZR0q32D0D(udqg zE@niJlQOLX+zZ*s{=IrKbJc#~Y{)W3a{ECq_XKXv0pm)^aa!%gS6RCGMsF4Hjjj<` zcJ*$z?d+gG`a4Dw#;{}B7FAJu>`W?Q>@a28Ey+h;F|~5p&?>D^@GT8Tv7ZPPjdFAC z8qVZZB73qQwlC?_!W*T__c<2@Pa_^|D$-ab{2K^B3@v9B}u(ywKWeg zF)i|PV@yDyMcr=dH5B)H2UGTl*ILvAhO?9XgP_Q2Q<_4B{0vW*Yplj=Dyiv$dQZm4 z7`eO=i0J+OGil$ps$zed{-|53>S;;&Hj5E0ny%~2C2dLgdEG!@b_|BepX{Hth9m)8+-mv>d8o=tIOTs1FYt7Oyoe(Ho;wME5eEg(Y1SXGcl6>C^`K#fGotw|wIBVlu@Le69KrlK9 zv0EXes=LZqX$VX=~qr7)D@e;(yC44m={~T z_9Ci}LXC2ig?hv%7RSz?xbnB6m?cnn>`^j%jA9-~EuO$UJc&k*SKt{}Y?H^jAa)t` zzLTn`Sd2~BOogQ?Teu=^YUkX?cTF^Q1~mc`(2C+zck4MGecoj~&m+yTmhgNSTgk{L zZzws2Z*vwT!!5LHQ!ID+oF`H|1*88j02c*g2Ko<2oTc!|-wn&o$ zA{+?&Ph9zHQHfTH0bZomC-@cl5*m0XT7Z|agg2sQoTB%}>9JSnhLg1JRaeo?o(cs; zx6sb*R4~TV9aPyzPV2A(A0bvt7y)O?W%97axoi#~kouRYN zQphBob^eB(#Y^3c&YD}q$#d2eoprf_vv@(gL1%@p9pU~xo%IKT z{2rb4M>^n7bk?8gtoI1?U;Zb~68I=SmNTf6u9e|j8*@`B6r}-b5hE{6|IRG>2h;PP zB{#=I=%?`%0A=->C-vn;1Uy;R1vR}nl7OS&}7O~id*?{mv5kb@m1yK>g z29CFgT6Bn6*d^+)N6h92#vG(YJsuWw@w5ozsF;tFVj(VyMi;-kJY))PxrBSLo4E0F z13l=am*vNeOxG%=^kMA5UPj#>Bylf3&J^B{0qo-_$lT-S4C!UL>n62~k9wAG@p{)e zRPCc3{s{!$B5&|qfcsue54tP2mw2-tpP&>;Rf|vJQ{4C3gb$zQst@;L1K%pwW9$PT GLg>Gg7z(fe literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/AccessibilityEventMonitor.class b/src/com/sun/java/accessibility/util/AccessibilityEventMonitor.class new file mode 100644 index 0000000000000000000000000000000000000000..205df7fe5de4e2f9585084c0c0c3cff10fc67e0c GIT binary patch literal 2073 zcmbVMZBrXn6n<`iY_e_(gcohaTH3S)Dx}p`Z4+xTg^Gr>ni%Dqo6Rk3XW8xSZYcZ} z|A1c=W}qW8`mr+9?dJhB!W@Z}#gJrKJ1%@lOE356z zru6G()1f6-@hsD6n7*y_j&U&Du*u~a$?Lu*(OfWFt<%t7pNZi|cP#YxDk|K<5xDvm zz5-Le-1N3&|6JrFW>(-@r*yZ$bQz!NZn5J|n&{Vy?D`SL9*ugLO+^6X-L4UY;_M1N zZ8r!_$2s!m)DCd&1m;ir#~mAedcFUS8nkpgKD=qXIZlXae%F%#fAy$yxQjZ0GNYOZ z0v~b@3~|Ty;(CQzfl?^z+yT literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/AccessibilityListenerList.class b/src/com/sun/java/accessibility/util/AccessibilityListenerList.class new file mode 100644 index 0000000000000000000000000000000000000000..6fcb895c08587ade7bf59a34ffd404f441ca2e35 GIT binary patch literal 2591 zcmb`I-E$LF7{;HI-EFoZKnVm5kQ#wXo1_FQR%uJLtrRM0!G;eD2&BojE^d;Nj}BEY zbf%-@j9-kyg&k)c9EW=0g`dR%t=>7~$fcM51^y4qoyI0|EHar(;mI&&kgr9YeA`96%F}=ot3n z`2db0qhmzQkLoz4WeGnaBRxs;VFO{I=aTr%>t zUV)%xR%=GdsASj*H1(M!vz8W6+B;4OsDtH#A+RxHmW!p+(FPG07)v7sRT4rrFRj-*=s^2>$11~4Qgf>nYHSd%_ zxV_`PskeA62g~&m(`VMh0$bWWCmpnM)oQPt7BtwjW<@~DJDUY_2CueIVdIaiEgd4?c0vs5sy2M0@-rCk~fA-S)rP73T? znI5(*V=8C$SElMkp8L?1yfIxf%O!!WD@IPj1NF&Cqax6}T+3Jxr*K++UKD7FnblaS zT#J<_W3}07gNsk1TV_O|>h@yYBFL5%w~k`{I1|KKoTHpqp_fs5><}+e(=p4{RJA8Y z*2^Kzqnmf4vB;$Z|5>SYWLAeu)mpBUC+o0RCGO?wIK$Yv>1m@x86~|2ZcW#g*`dZ_ zuQFfux2E_F^Ht%Oy;F=He%V=Gvmy(Ut5kBc`SSFvK-`;@8)euNWqE2?3VVC|@V_MN z=Vctt6%9Pfx2y$#58I@+*qf8`Vyi<)$?@CDQJNNlZ7_ZlBK{40-$VJDV;>&jcLSeD zppB1N2iCETaTIjy8DS?!0=ux=^_5~PeQELUpnS!SR%%-!7OCZfyD zOPclNKlbnQ?AJZ}_qhA7GF6Rx_9zFXhf$?lUBH$^XISm}1?mkn&H2Qf>Iox6w3y8~*W|&_m6O2yl8`D9BENokgs_i48v|f5oo* z+HItrYavO%ao$5}zCmi< zCB>7|&*LOjWyvKUg+5x*MP`!J6Ae-(|5%$C|IYtS%9plrXa%W^-Lg+@BqTVyt6uC% z-avC$O)p^GoO(B`esb^6sP9t@x!WW|TiQxQvl&Js+R|qT%Vi>tXmT7a5N@2Ec{H;u z3(z9kD!4<~#KTPz?iAr(B9vDMcbaG~6JZ521T>2pUgvm@y?5{`u5ol7Z{Q2OiCdig z9dFsN(+;Qx>^lwEcU;(G+`Zq1eU|EMQnAAyz39y>m=-Gdt^@WMd`Hg`Mn>LD-Xp^ zLID+};XU@==gaZ|5A-2bcohZq%T!v77I7z0_t+XN`{wZ<3nq^yZ*m(I>u5~ptzLfX eVmzw+=?Y8vEqwBw6ZSjjJW=u~>EWCYy?+B4c`m{L literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/ComponentEvtDispatchThread.class b/src/com/sun/java/accessibility/util/ComponentEvtDispatchThread.class new file mode 100644 index 0000000000000000000000000000000000000000..94f7f54d8b7b919051198edb932e202eb57f23f2 GIT binary patch literal 1824 zcmbVNTW=dh6#i!7WQns$>Nbs=KvQ#1nzW{rrjQ#1Cn*U|+7c6Ud11Yt#?#unW<8sW zO1ViO1kZiofhQ#VfP~Z*g$SfJr4mAw_%%Er@qjtAc4CtRRbXo_XU>`Ld~@a-`~F`) z-bNEn;O#IDS~-|>Z7aWIc~aZ8#gNL$62n;1b_?;6@5BR4%eFSM@_G&DOoC7%Fd;7p0Ki`l+&>aL54ky7@9oap}t>p<2FSdtMay1Ra~qPU?Vh{ z1ji^U)^NI6M+wjKi%Mjt*KAQ#(sd{-yy*I#EoP)XUH7!cy66jE%)3+}*E^}nnCM2- zz)L13@v?!0i7CVw`szgY12-{^83X4`yn15s2TG&OrW?~U36R(4+*0~c~jWUtO8z$bwTMQ%r|K1o51i*oS zs#nQy>OpvW%FGa@J=@yYz5~+Q6)m}XhVz-r!q&IjkhQu-`dPK4VmP!95X0FAYI6^# zStSaT>CAsVjNZu5EVP!0PhF{#=~R$~P(zMbBWGmiRZ5tBb@ns@!6dPLr>$q@~KuxVBGwBl|>~gqPU9OL|g`kUQ&y8nLq3)IWeJ zQ^R@cu>&O0E>9F(qP}ZGSHp%H-+?8>&_%zV`olpC5T*VISrcS)8e5JJ{s49(@b^$3 z)~oy-G;<5RWOrAi@Gu@Bi{fzfCU?0abWm-fTuJNc z79yKCRIbdGE9dC29aOL=LTJM`aDvdxJzl08+LzGJ#p?M$Aqn|q% z=0%M2ccHk#Rqo?`zKW0d8ouCHah<=1ulO~5%|F05{6l=lKgJFI34Y?A;x_**D0hth d@u-lsa&z3lqj-$UtFP^GJV9QDCj(Yb{S8UM@6-SQ literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/EventID.class b/src/com/sun/java/accessibility/util/EventID.class new file mode 100644 index 0000000000000000000000000000000000000000..4690b9c3dd0577969b13ae14b4c41de282b77637 GIT binary patch literal 1273 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 N{8z8gT~sAc{Xe#lFzx^V literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/EventQueueMonitorItem.class b/src/com/sun/java/accessibility/util/EventQueueMonitorItem.class new file mode 100644 index 0000000000000000000000000000000000000000..f4f33aa1c7944c91a5495074a911b3a8b9317635 GIT binary patch literal 484 zcmbVI%TB{E5F9&cOGBWgg#b5>Z4vl{IDn840tqQlA*ynAf(5S9M9QPUkMQ^m4iypy zK7fxxtW$1qLe{Rmhru0rwc}Sl!d*t{*02krlC+k-|`AnGSTM^9NDnIud2WMWG6Hmc%+w($idxNuau~ zsXSotI)4~+hh%Y-Tq}l#uVZyyj02SpWDpV3@{>?TLz!w*|A2OWt1|{mO=v9VGAYtf zooGY%evPnghIQd!%|#V87jvjH?ELE~49)WCk&JIdKNzWy{H;!RhzJ!6o8of8L-sTj%$EL7e3F26w+#(_HN7(!cb^eS+{(?oqy;&O?r6>uY MNj8kuQrX-32C8{*AOHXW literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/GUIInitializedListener.class b/src/com/sun/java/accessibility/util/GUIInitializedListener.class new file mode 100644 index 0000000000000000000000000000000000000000..35fb9980d1153ce1faf4af608600e48966be16be GIT binary patch literal 219 zcmZvVF$%&!6h!AI(P#v*v+x31=yu*fB_LRc_M3GHKdc)_HUT}Fg$M9ZViFK6EN1vK z{KvfBk0*RAF$ysVF$@tA#%aZ|WyjL+U0(?Pd~qg3$Gj?(-m=kz+3pno{Oq}O+UjDJ z$yyTDD!+=dvZ9SbDy7Sk6E^H_qH=7+f0{7q03&TG4oRk!BTT!hqc*j+?mN{d5WGe{ P015~JdhLaN;~v5fVJJNx literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/GUIInitializedMulticaster.class b/src/com/sun/java/accessibility/util/GUIInitializedMulticaster.class new file mode 100644 index 0000000000000000000000000000000000000000..45a60068d941365b8fa17c92699047f4081b9ada GIT binary patch literal 1508 zcmbVLTW=CU7(G+&uu`oRr9xY+7ucmmlWJ;cn`o^Kk@}#u#>WLVI%ZiCSTOoe`~klB zgo&|U5>uZ{{87d;yI5#aOaPLZ`7U$5Gw1vE_n&V+5Wq54;z(dA#^p)`R}=JIQ^xf; zqR6QwAAzp+C6#DIP!I^OOGmn!0=IINS7z5Nc3f!}x4V|(R%F|?9II6t8OZMo1h<-X zOJKSp9qUo2QMFooX4R%=rqZmL_P*JY%I-UZ?n~JgC{=3BMzP&-ie62#Rve$-xiRYx zq!^F)(Y^en1qIe7zZz~?jb@j<5H=gtwCmgwRG{ooNXMkLJ4x67BYo1ZI4BT*((JTq z)&r?VVt!;-SJWJ6&~Qq_S0~?w)4HvO2knzX# zwOhRVY|r~RhH?Z}N2{10DHbmAOH6<>2_TH1dOWQptulSe8_|uz0mMfhr!dVm&K)qA zUchOd7X37w!3-^4P~s6pou~n`g%YF>`;fberS(skIz-?rf&x5;{+$Pfk{)o8oNnL( zZhFNu|8l=rjQ(^Vc!Px$v6yarL6~Sg8b0H&cWKoFNclVgcm*iC!+75>4%6KpAqlrgEA?En0$|~-D2DCvt!$Q_s&qc TEHdnw`epf7eH0uLrR3$mS8H38 literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/SwingEventMonitor$SwingEventListener.class b/src/com/sun/java/accessibility/util/SwingEventMonitor$SwingEventListener.class new file mode 100644 index 0000000000000000000000000000000000000000..945cd7f6af391423c02ed9f898d36e3bd54768a0 GIT binary patch literal 34979 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 a{%;k&#?OGv#=8`fPe9F@*dR7C>;C~5F{i2k literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/SwingEventMonitor.class b/src/com/sun/java/accessibility/util/SwingEventMonitor.class new file mode 100644 index 0000000000000000000000000000000000000000..cd870916db81223ee004fc5018ba8699657b2a80 GIT binary patch literal 10855 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 literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/TopLevelWindowMulticaster.class b/src/com/sun/java/accessibility/util/TopLevelWindowMulticaster.class new file mode 100644 index 0000000000000000000000000000000000000000..f92650c82126a6c9ecf78e9c8c7744e6cb467ce3 GIT binary patch literal 1705 zcmbVLT~8B16g^W)>$WQh(gN}=Ds&epC=f}-1n~<~d{6@MaocXSR@FBh(<`*y$n6Tm zH{FUU&|9<|^LcH*WO_SB$!4a%=#~w8*YGSEN6EPV+Nuf^ie+~{U#&U$fYT_K&1%&u zS+?aLh866%Z;NK#wD&Bh;vQ_*Y~Lyytj8+|2t#1FZBg7W31s|J0Gpm^_+~|5AbO^8 z;O9f^f_#NI5a^qhds^u47uo4NMEHT@10syecMeTVOPFJuSGgw-fxemNNp&?WN4M zRSZ-7*eYmD07=B90*rbYZ7~;QHGS>~;v-WrT;Z7F4CqK;4t-orMwk0>m63#@f&`H( z3c=I-5g3YK_ZZ9jBibj#j?txmMLY%u-6uhlswaTXv#Ld0!%{$(4X@)L-3W%cM~_Lt z+mj?(Nf`W3vP_Z{0Z&v$-ZoQ#%)EeKRywda|q?#p$(r&Pe4`_hR z7W{0`KUr!v=%3&|9US2s(W}Qa{XLSBL^QOYP~Jh+j-lwEk#1;Bnk>2r^n|Z{iZngd bk7w*tv4w7o2Fge_sxcK9N8l!-7;gOqm>hx7 literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/Translator.class b/src/com/sun/java/accessibility/util/Translator.class new file mode 100644 index 0000000000000000000000000000000000000000..e288f0aa794b5b81fe24bbdd15c9a499dd608596 GIT binary patch literal 9472 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 literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/java/awt/ButtonTranslator.class b/src/com/sun/java/accessibility/util/java/awt/ButtonTranslator.class new file mode 100644 index 0000000000000000000000000000000000000000..e8743fbaedaad80bddc515af2107075c910f9af8 GIT binary patch literal 969 zcmbVK+iuf95Ivi?apM?D(x%)mEu|zu)K4Ixph^^|K(f+`q?E`UF% zoZn_gb9PaMdykxijl2R zgwn;+1rn`@n~DE&nF6xJsSXCZcH zAZinc238HkGpa68k82?AonmQ9!zu2b)3E&lXMJ32a5S|wGz${zxM&b}ikSBNg33Ib Pmosdv37bm==gWTp2=m`Q literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/java/awt/CheckboxTranslator.class b/src/com/sun/java/accessibility/util/java/awt/CheckboxTranslator.class new file mode 100644 index 0000000000000000000000000000000000000000..4cd774134d268efc2496425c20d7e39874ab8012 GIT binary patch literal 1443 zcmbtUYflqF6g@*9OWRSTQjmuap7x<#U*My>q+m>FAfW_}F)`C+1B**H>24K&ivL21 zsfizqpZ!tBJF^pLA(19-vUlgs-h1x3ch2tbKRQ1o85Xt6t7@}ow*JkLeICXoYd04X>+oI;uPP*b* z!rc)KNBVj*8tgkh!$QUK4o$yVHxI-IVG7H#ec!1$t`mGRn}Or%{f~iJ-nXsyHScJ< zA?m&>07=~uTQXP?Uh>TdI6^o8n1kzD&%aenhxv)tYM+}lxui3Ed z7mmytIzPyw92LhUT;>=+hT}dSP|5H}+D6au5RVMZa?IhefhQbK@r8d%_1 z#1cd4KTeen@1pEe3CP1!y>*Ulvvy!x0d?L>V^gY7Dt*H+*@Y??jPlF1^7`5;!*n;2 zph7cU;3{QC#O^LBtt+XOa>Q7+P!ToTr6nmzFDL$8FBC{ZwefCc^EJcN1&t`FU>qs> z2goZ1CIvyZk35r}Oz!5tgMFn%53Z1ntIav|)0&3?NaHGb^fe$uRwlot=pK5GQF2cu z{|%8}h_(>>j8x$m@fM6%g)j6z#7xtV1|*{xmI!MZBUn-RgCT~-k6{RdbW2*-Fsv)h zDj!Il6zM$$4#}>!kxiYD9l@xESk+{?hA6afgc5Ph3CF>y>w()5G!*-}ap)cOP}EkXneC#y&_>V0iiVJpX$>X>DfsCa3<_(mL^88oj`8*I&H|22_ah0Sy47Hw6oxCCvd%RE08qJn( zs3IQsynU6*xTm4nG<3c>jnsoM(p8_nn(X&6(Zj9h{f;KIk927qDRB0aK^ltpQdc!5 zhS}7TT~y$>c!V{Enc+JAj_u+xYA)6>XXA;BCRz+z|GPPc_PF`4Ak6 zP|;X6y+KzTDe`E=LvK}!zkVSMCBO6LozJjlHhn#M2P?4YXVjksruRg)N|8q=qqEfh z0d`DI0WR6HNj}F-^4%c-Gnl1_;TCFSb@4Mgb#b+Qio$Oc&tQG0aGc`B7)AAxqK>(o zVwcbbs&R9Qr)MaQWH{#TH8txPo`oSc=h4y{m^UI8u$VJ$nwaK1L3vWm?wA_uQq7Xl GeESbHjM^Ol literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/java/awt/ListTranslator.class b/src/com/sun/java/accessibility/util/java/awt/ListTranslator.class new file mode 100644 index 0000000000000000000000000000000000000000..e3a7d9f9a2ec6d2f3ca5900bb14741fd17a770e7 GIT binary patch literal 1237 zcmbVL+iuf95IvhXNt3$ijT8v?UP3MqLxGkORC*yuksOe4C=xt5&MIu>#3hqY$%p)C))?!Vj~a(axMXGiQJP`hI{YuA`EIj`PY~NRqjjz@-#4Tu$N& z=2KX}qH>p%n@i#<@(C0YC^E$Fi>{FC4AFdHhe6x+TAX3h6kYzf-)Zt*!*041nK3=b zc6aQaQ2rpO$ydT>STh~3WBC29v1`Av4cl?J?~A5zg?w-HrEmxFx6&|$FB?6(>$|q} zdKHFDo6F5Xg3B#wOKx$=P|O!hRqfp$<^H})MdH57qfYXp=S-gfe(EWbxuKxy9s#B- zuita{BcZZpPm(IDwslM(t>Y9jI!d_4FcFSsFan)cR!+dsaRWCKSk`e1w{_gXijGwk zxvOIh_ZU|HbFwtRVVOs3Py-D3s5J+Dx^}m1JZbK7M-tn#@auh7iq|f$2l61TykJ-u zVLv3L`ZKdpv#MrwyRo@tRvDH?SrWnKMyMZXC2F@?wEK~kUs0V;(e5qo5u`jBD%-~EIV(#)FGU|1Z&G0+h`#&LSA>WhLTf;8Dl@(el| zow4FKurKrz!4%ne5M04D{p;Zc%wU#0rj$ljC4ZpX5jvMCIbs&SBKiZ`K4Kp+UfM%^ zABpFO!Lfr+K{TnNrO%WVB4r5+SVs&G2w?+RY$1KN=rL0B98MEH!x@|% a^id9cK-)v=sB*}mc8r5|$RQixpZg7Kc0I@d literal 0 HcmV?d00001 diff --git a/src/com/sun/java/accessibility/util/java/awt/TextComponentTranslator.class b/src/com/sun/java/accessibility/util/java/awt/TextComponentTranslator.class new file mode 100644 index 0000000000000000000000000000000000000000..5d2e7091d98ae7255d9ecd4c95c7e4b9ef4e1e25 GIT binary patch literal 619 zcmbtRO-sW-5Pj38jjh$%`g!o8h_nTpn;?p)MNh?phT?S_7hOrSl5Dj8EA=9H@CW## z#MxS`3R1y6yvLiFH?zaMzCFJniw!Il;b5kK3aTz*XRW(VCmgw$6D(=AJo&k$3Bh*ZK5L530)V D&g7w> literal 0 HcmV?d00001 diff --git a/src/com/tedpearson/util/update/Updater.java b/src/com/tedpearson/util/update/Updater.java new file mode 100644 index 0000000..cd396c5 --- /dev/null +++ b/src/com/tedpearson/util/update/Updater.java @@ -0,0 +1,189 @@ +package com.tedpearson.util.update; + +import java.net.*; +import java.io.*; +import java.util.prefs.*; +import java.awt.Component; +import javax.swing.JOptionPane; +import javax.swing.*; + +/* + TODO: + show update window with progress bar when updating (optionally) +*/ + +public class Updater { + private int version = -1; + private URL downloadURL; + private static Updater updater = new Updater(); + + public static Updater getUpdater() { + return updater; + } + + public boolean checkForUpdate( + Component parentComponent, + String updateUrl, + int currentVersion) { + return checkForUpdate(parentComponent, updateUrl, "this program", currentVersion, true); + } + + + /** + * Just check to see if there is an update. + */ + public boolean checkForUpdate( + Component parentComponent, + String updateUrl, + String program, + int currentVersion, + boolean promptUser) { + String node = "com/tedpearson/update"; + Preferences prefs = Preferences.userRoot().node(node); + String update = prefs.get(updateUrl,""); + if(update.equals("Never")) { + return false; + } + if(!update.equals("Yes")) { + if(!promptUser) { + return false; + } + // first, confirm user wants to allow updates + int option = JOptionPane.showOptionDialog(parentComponent, + "Do you want to let " + program + " check for updates when it opens?", + "Check for Updates?", + 0, JOptionPane.QUESTION_MESSAGE, + null, new String[] {"Yes","This Time","Not Now","Never"},"Yes"); + switch(option) { + case 2: + return false; + case 3: + prefs.put(updateUrl,"Never"); + return false; + case 0: + prefs.put(updateUrl,"Yes"); + case 1: + } + } + // query the server to check the version number + accessVersion(parentComponent, updateUrl); + // System.out.println(version+","+currentVersion); + if(version > currentVersion) { + return true; + } else { + return false; + } + } + + public void checkAndUpdate( + Component parentComponent, + String updateUrl, + String program, + int currentVersion, + boolean promptUser, + String jar) { + if(checkForUpdate(parentComponent, updateUrl, program, currentVersion, promptUser)) { + updateJar(parentComponent, updateUrl, currentVersion, promptUser, jar); + } + } + + public void checkAndUpdate( + Component parentComponent, + String updateUrl, + int currentVersion) { + if(checkForUpdate(parentComponent, updateUrl, currentVersion)) { + updateJar(parentComponent, updateUrl, currentVersion); + } + } + + public void updateJar( + Component parentComponent, + String updateUrl, + int currentVersion) { + updateJar(parentComponent, updateUrl, currentVersion, true, null); + } + + public void updateJar( + Component parentComponent, + String updateUrl, + int currentVersion, + boolean promptUser, + String jar) { + try { + accessVersion(parentComponent, updateUrl); + // download new version + File temp = File.createTempFile("com.tedpearson.updater.download",null); + temp.deleteOnExit(); + URLConnection conn = downloadURL.openConnection(); + ProgressMonitorInputStream pmis = new ProgressMonitorInputStream( + parentComponent, + "Downloading program update", + conn.getInputStream() + ); + ProgressMonitor pm = pmis.getProgressMonitor(); + pm.setMillisToDecideToPopup(0); + pm.setMillisToPopup(0); + if(!promptUser) { + pm.setMillisToDecideToPopup(Integer.MAX_VALUE); + pm.setMillisToPopup(Integer.MAX_VALUE); + } + pm.setMaximum(conn.getHeaderFieldInt("Content-Length",0)); + copyFile(pmis, new FileOutputStream(temp)); + // replace old with new. + if(jar == null) { + jar = getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); + } + jar = jar.replaceAll("%20"," "); + copyFile(new FileInputStream(temp), new FileOutputStream(new File(jar))); + // remove temp file + temp.delete(); + // launch new version and quit this one. + ProcessBuilder pb = new ProcessBuilder("java","-jar",jar); + pb.start(); + System.exit(0); + // no new version + } catch(Exception e) { + // errors. + e.printStackTrace(); + // show error here. + if(promptUser) { + JOptionPane.showMessageDialog(parentComponent, "There was an error while trying to update.", + "Error", JOptionPane.ERROR_MESSAGE); + } + } + } + + private void accessVersion(Component parentComponent, String updateUrl) { + if(version != -1) return; + try { + URL url = new URL(updateUrl); + BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); + version = Integer.parseInt(br.readLine()); + downloadURL = new URL(br.readLine()); + } catch(Exception e) { + // errors. + e.printStackTrace(); + // show error here. + JOptionPane.showMessageDialog(parentComponent, "There was an error while trying to update.", + "Error", JOptionPane.ERROR_MESSAGE); + } + } + + /** + * Utility method to copy a file. I can't believe java doesn't have anything + * built-in to do something this simple with less code. Other than channels, that is. + * + * @param in stream to read file from + * @param out stream to write file to + */ + public static void copyFile(InputStream in, OutputStream out) throws IOException { + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + + } + in.close(); + out.close(); + } +} \ No newline at end of file diff --git a/src/com/tedpearson/ypp/market/ControlPanel.java b/src/com/tedpearson/ypp/market/ControlPanel.java new file mode 100644 index 0000000..a00e734 --- /dev/null +++ b/src/com/tedpearson/ypp/market/ControlPanel.java @@ -0,0 +1,59 @@ +package com.tedpearson.ypp.market; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.prefs.*; + +/** +* ControlPanel is a simple management utility that sets +* a preference for whether the PCTB client is to launch or not. +*/ +public class ControlPanel extends JFrame { + public static void main(String[] args) { + new ControlPanel(); + } + + public ControlPanel() { + super("PCTB Control Panel"); + final Preferences prefs = Preferences.userNodeForPackage(getClass()); + final JCheckBox cb = new JCheckBox("Launch PCTB Uploader when YPP starts?", prefs.getBoolean("launchAtStartup", true)); + final JCheckBox toPCTB = new JCheckBox("Upload to PCTB?", prefs.getBoolean("uploadToPCTB", true)); + final JCheckBox toYarrg = new JCheckBox("Upload to Yarrg?", prefs.getBoolean("uploadToYarrg", true)); + + final JRadioButton live = new JRadioButton("Use live servers"); + final JRadioButton testing = new JRadioButton("Use testing servers"); + + live.setSelected(prefs.getBoolean("useLiveServers", false)); + testing.setSelected(!prefs.getBoolean("useLiveServers", false)); + + ButtonGroup liveortest = new ButtonGroup(); + liveortest.add(live); + liveortest.add(testing); + + setLayout(new GridLayout(6,1)); + add(cb); + add(toPCTB); + add(toYarrg); + add(live); + add(testing); + + JButton but = new JButton("Save"); + add(but); + but.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + prefs.putBoolean("launchAtStartup", cb.isSelected()); + prefs.putBoolean("uploadToPCTB", toPCTB.isSelected()); + prefs.putBoolean("uploadToYarrg", toYarrg.isSelected()); + prefs.putBoolean("useLiveServers", live.isSelected()); + System.exit(0); + } + }); + pack(); + setLocationRelativeTo(null); + setVisible(true); + setSize(getWidth() + 10, getHeight() + 10); + setDefaultCloseOperation(EXIT_ON_CLOSE); + getRootPane().setDefaultButton(but); + } +} diff --git a/src/com/tedpearson/ypp/market/Installer.java b/src/com/tedpearson/ypp/market/Installer.java new file mode 100644 index 0000000..a7621b8 --- /dev/null +++ b/src/com/tedpearson/ypp/market/Installer.java @@ -0,0 +1,345 @@ +package com.tedpearson.ypp.market; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import javax.swing.border.*; +import java.io.*; +import com.tedpearson.util.update.*; +import java.util.Properties; +import java.net.URLDecoder; + +/* + allow adding islands/oceans + implement uploads to YAARG +*/ + +/** +* An Installer for PCTB Java Client. +*/ +public class Installer extends JFrame { + public final static int VERSION = 8; + private JLabel label; + private JProgressBar progress; + private JButton install, uninstall; + private static String os = System.getProperty("os.name"); + private static String home = System.getProperty("java.home"); + private static String user_home = System.getProperty("user.home"); + private boolean installed = false; + private boolean uninstalled = false; + private static PrintWriter pw; + + public static void debug(String str) { + try { + pw.println(str); + pw.flush(); + }catch(Exception e) { + + } + } + + public static void main(String[] args) { + /* + try{ + pw = new PrintWriter("C:/Users/Public/ERRORS"); + }catch(Exception e) { + + } + */ + new Installer(args); + } + + /** + * Checks if we have permission to write to the Java Home folder + * that runs YPP. Pops up an error message and exits if we don't have access, + * or on Mac OS X, re-runs the installer using applescript to authenticate. + */ + private void checkPermission(String[] args) { + File a11y = null; + a11y = new File(getJavaHome(),"lib"); + if(os.equals("Mac OS X")) { + if(!a11y.canWrite()) { + JOptionPane.showMessageDialog(null,"Please authenticate as an Administrator, when prompted, to continue installation."); + try { + String installer = URLDecoder.decode(getClass().getProtectionDomain().getCodeSource().getLocation() + .getPath(), "URT-8"); + Runtime.getRuntime().exec(new String[]{"osascript","-e","do shell script \"java -jar " + + installer + "\" with administrator privileges"}); + } catch(Exception e) { + e.printStackTrace(); + } + System.exit(0); + } + } else { + // clean up after myself + if(os.contains("Vista")) { + File tempDir = new File(System.getProperty("java.io.tmpdir")); + for(File f : tempDir.listFiles()) { + if(f.getName().startsWith("PCTB-lib")) { + for(File g : f.listFiles()) { + g.delete(); + } + f.delete(); + } + } + } + // first check for YPP java + boolean canWrite = true; + File test = new File(a11y, "test_pctb"); + try { + test.createNewFile(); + test.delete(); + } catch(IOException e) { + canWrite = false; + } + if(!canWrite || !a11y.canWrite()) { + if(os.contains("Vista")) { + if(args.length == 1 && args[0].equals("--elevate")) { + JOptionPane.showMessageDialog(null,"Please run this installer while logged in as an Administrator."); + System.exit(0); + } + try { + String installer = URLDecoder.decode(getClass().getProtectionDomain().getCodeSource().getLocation() + .getPath(), "UTF-8").replaceFirst("/",""); + ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/C", "elevate javaw -jar \"" + installer + + "\" --elevate"); + // create temp lib directory + File temp = File.createTempFile("PCTB-lib",null); + temp.delete(); + temp.mkdir(); + File elevate = new File(temp, "elevate.cmd"); + OutputStream out = new FileOutputStream(elevate); + InputStream in = getClass().getResourceAsStream("/lib/elevate.cmd"); + Updater.copyFile(in, out); + + elevate = new File(temp, "elevate.vbs"); + out = new FileOutputStream(elevate); + in = getClass().getResourceAsStream("/lib/elevate.vbs"); + Updater.copyFile(in, out); + + pb.directory(temp); + Process p = pb.start(); + } catch(Exception e) { + e.printStackTrace(); + } + System.exit(0); + } else { + JOptionPane.showMessageDialog(null,"Please run this installer while logged in as an Administrator."); + System.exit(0); + } + } + } + } + + /** + * Create the installer GUI + */ + public Installer(String[] args) { + super("PCTB Installer"); + + Updater.getUpdater().checkAndUpdate(null, "http://tedpearson.com/market/version", + "the PCTB Uploader client", VERSION, true, + getClass().getProtectionDomain().getCodeSource().getLocation().getPath()); + + // gui: simple window with status area and progress bar + checkPermission(args); + label = new JLabel("Ready to install!"); + add(label,BorderLayout.NORTH); + progress = new JProgressBar(); + progress.setBorder(new EmptyBorder(10,0,10,0)); + add(progress,BorderLayout.CENTER); + String buttonText = "Install"; + install = new JButton(buttonText); + JPanel buttons = new JPanel(); + add(buttons,BorderLayout.SOUTH); + install.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if(installed) { + System.exit(0); + } + try { + install.setEnabled(false); + uninstall.setEnabled(false); + install(); + } catch(IOException err) { + err.printStackTrace(); + JOptionPane.showMessageDialog(Installer.this, "Error during installation."); + setButtonStatus(false,false); + label.setText("Install failed!"); + } + } + }); + uninstall = new JButton("Uninstall"); + buttons.add(uninstall); + buttons.add(install); + uninstall.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if(uninstalled) { + System.exit(0); + } + try { + install.setEnabled(false); + uninstall.setEnabled(false); + uninstall(); + } catch(IOException err) { + err.printStackTrace(); + JOptionPane.showMessageDialog(Installer.this, "Error during installation."); + setButtonStatus(false,false); + label.setText("Uninstall failed!"); + } + } + }); + getRootPane().setBorder(new EmptyBorder(10,10,10,10)); + getRootPane().setDefaultButton(install); + pack(); + setSize(300,getHeight()); + setLocationRelativeTo(null); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setVisible(true); + } + + /** + * Uninstalls the client. Throws an IOException ir errors occur. + * (removes the PCTB class from assistive tech, deletes the jar) + */ + private void uninstall() throws IOException { + label.setText("Uninstalling..."); + progress.setIndeterminate(true); + // remove from assistive tech + File java_home = getJavaHome(); + File a11y = new File(java_home,"lib/accessibility.properties"); + if(a11y.exists()) { + Properties p = new Properties(); + p.load(new FileInputStream(a11y)); + String tech = p.getProperty("assistive_technologies"); + tech = tech.replace("com.tedpearson.ypp.market.MarketUploader", ""); + p.setProperty("assistive_technologies", tech); + p.store(new FileOutputStream(a11y),"Last Modified by PCTB-Installer"); + } + // remove jar + File jar = new File(java_home, "lib/ext/PCTB-Uploader.jar"); + jar.delete(); + setButtonStatus(false,true); + } + + /** + * Utility method to find the Java Home folder that runs YPP. On Windows, it could be + * inside the YPP folder. + */ + private File getJavaHome() { + File java_home = new File(home); + if(os.contains("Windows")) { + File defaultLocation = null; + // check for javavm inside YPP folder, otherwise default location + if(os.contains("Vista")) { + String user = System.getProperty("user.name"); + defaultLocation = new File("C:\\Users\\" + user + "\\AppData\\Roaming\\Three Rings Design\\Puzzle Pirates\\"); + } else if(os.contains("XP")) { + defaultLocation = new File("C:\\Program Files\\Three Rings Design\\Puzzle Pirates\\"); + } + if(defaultLocation != null && defaultLocation.exists()) { + File java_vm = new File(defaultLocation, "java_vm"); + if(java_vm.exists()) { + // this is where we want to install instead + java_home = new File(defaultLocation, "java_vm"); + } + } + } + return java_home; + } + + /** + * Installs the client. + */ + private void install() throws IOException { + label.setText("Installing..."); + progress.setIndeterminate(true); + File java_home = getJavaHome(); + File controlPanel = new File(user_home); + JFileChooser chooser = new JFileChooser(controlPanel); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + chooser.setDialogTitle("Choose location for Control Panel"); + chooser.setApproveButtonText("Install Control Panel here"); + int state = chooser.showOpenDialog(this); + if(state == JFileChooser.APPROVE_OPTION) { + controlPanel = chooser.getSelectedFile(); + } else { + setButtonStatus(false,false); + label.setText("Install failed!"); + return; + } + InputStream in = getClass().getResourceAsStream("/PCTB-ControlPanel.jar"); + File newFile = new File(controlPanel, "PCTB-ControlPanel.jar"); + newFile.createNewFile(); + OutputStream out = new FileOutputStream(newFile); + Updater.copyFile(in, out); + String search = "assistive_technologies"; + String value = "com.tedpearson.ypp.market.MarketUploader"; + File a11y = new File(java_home,"lib/accessibility.properties"); + boolean skipA11y = false; + Properties p = new Properties(); + if(a11y.exists()) { + // if already contains our modification, ignore + // else add our modification + p.load(new FileInputStream(a11y)); + String tech = p.getProperty(search); + if(tech == null || tech.trim().equals("")) { + // add it! + p.setProperty(search, value); + p.store(new FileOutputStream(a11y),"Last Modified by PCTB-Installer"); + } else if(!tech.contains(value)) { + p.setProperty(search, tech+","+value); + p.store(new FileOutputStream(a11y),"Last Modified by PCTB-Installer"); + } + } else { + // create file with our modification + a11y.createNewFile(); + p.setProperty(search, value); + p.store(new FileOutputStream(a11y),"Last Modified by PCTB-Installer"); + } + + // install program + // copy jar from resource to new file in ext + //String installer = getClass().getProtectionDomain().getCodeSource().getLocation() + // .getPath().replaceAll("%20"," "); + //new FileInputStream(installer); + in = getClass().getResourceAsStream("/PCTB-Uploader.jar"); + newFile = new File(java_home, "lib/ext/PCTB-Uploader.jar"); + newFile.createNewFile(); + out = new FileOutputStream(newFile); + Updater.copyFile(in, out); + JOptionPane.showMessageDialog(this, "Install successful!\n\nWhen you open a new YPP client, you'll see\n" + + "the upload client window alongside YPP.\n\n" + + "To stop the window from appearing, use\n" + + "the Control Panel to disable it, or uninstall.", "Success!", JOptionPane.INFORMATION_MESSAGE); + setButtonStatus(true,false); + } + + /** + * Cleanup after an install, uninstall, or error. Buttons, statuses, and such + */ + private void setButtonStatus(boolean installQ, boolean uninstallQ) { + progress.setIndeterminate(false); + progress.setValue(100); + install.setEnabled(true); + uninstall.setEnabled(true); + String q = "Quit"; + if(installQ) { + install.setText(q); + installed = true; + label.setText("Install complete!"); + } else { + install.setText("Install"); + installed = false; + } + + if(uninstallQ) { + uninstall.setText(q); + uninstalled = true; + label.setText("Uninstall successful."); + } else { + uninstall.setText("Uninstall"); + uninstalled = false; + } + } +} \ No newline at end of file diff --git a/src/com/tedpearson/ypp/market/MarketUploader.java b/src/com/tedpearson/ypp/market/MarketUploader.java new file mode 100644 index 0000000..8e0c109 --- /dev/null +++ b/src/com/tedpearson/ypp/market/MarketUploader.java @@ -0,0 +1,967 @@ +package com.tedpearson.ypp.market; + +import java.awt.*; +import java.awt.event.*; + +import javax.accessibility.*; +import javax.swing.*; + +import com.sun.java.accessibility.util.*; + +import java.util.*; +import java.io.*; +import java.util.*; +import java.net.URL; +import org.w3c.dom.*; +import javax.xml.parsers.DocumentBuilderFactory; +import org.xml.sax.InputSource; +import java.util.zip.GZIPOutputStream; +import com.myjavatools.web.ClientHttpRequest; +import java.util.regex.*; +import java.util.prefs.Preferences; +import java.beans.*; +import com.tedpearson.util.update.*; + +/* + TODO: + allow adding new islands + allow adding new oceans +*/ + +/** +* MarketUploader is a class that handles the uploading of market data from +* Yohoho! Puzzle Pirates. Currently, it must be launched in the save Java +* Virtual Machine as YPP. This is handled by a sister "helper" class, +* {@link MarketUploaderRunner}. +*

+* MarketUploader initializes after the main YPP window has initialized. It +* provides a simple window with a "Capture Market Data" button displayed. +* Upon clicking this button, a progress dialog is displayed, and the data +* is processed and submitted to the Pirate Commodities Trader with Bleach (PCTB) +* web server. If any errors occur, an error dialog is shown, and processing +* returns, the button becoming re-enabled. +* +* @see MarketUploaderRunner +*/ +public class MarketUploader implements TopLevelWindowListener, GUIInitializedListener { + private JFrame frame = null; + private Window window = null; + private JButton findMarket = null; + + private final static String PCTB_LIVE_HOST_URL = "http://pctb.crabdance.com/"; + private final static String PCTB_TEST_HOST_URL = "http://pctb.ilk.org/"; + private String PCTB_HOST_URL; + + // Yarrg protocol parameters + private final static String YARRG_CLIENTNAME = "jpctb greenend"; + private final static String YARRG_CLIENTVERSION = "0.1"; + private final static String YARRG_CLIENTFIXES = ""; + private final static String YARRG_LIVE_URL = "http://upload.yarrg.chiark.net/commod-update-receiver"; + private final static String YARRG_TEST_URL = "http://upload.yarrg.chiark.net/test/commod-update-receiver"; + private String YARRG_URL; + + private boolean uploadToYarrg; + private boolean uploadToPCTB; + + private String islandName = null; + private String oceanName = null; + private java.util.concurrent.CountDownLatch latch = null; + + private AccessibleContext sidePanel; + private HashMap commodMap; + private HashMap islandNumbers = new HashMap(); + { + String[] nums = new String[] + {"","Viridian","Midnight","Hunter","Cobalt","Sage","Ice","Malachite","Crimson","Opal"}; + for(int i=1;irecord, determining the shoppe Id from + * stallMap and the commodity Id from commodMap. + * priceIndex should be the index of the price in the record + * (the quantity will be priceIndex + 1). + * + * @param record the record with data to create the offer from + * @param stallMap a map containing the ids of the various stalls + * @param commodMap a map containing the ids of the various commodities + * @param priceIndex the index of the price in the record + */ + public Offer(ArrayList record, LinkedHashMap stallMap, HashMap commodMap, + int priceIndex) { + Integer commodId = commodMap.get(record.get(0)); + if(commodId == null) { + throw new IllegalArgumentException(); + } + commodity = commodId.intValue(); + price = Integer.parseInt(record.get(priceIndex)); + String qty = record.get(priceIndex+1); + if(qty.equals(">1000")) { + quantity = 1001; + } else { + quantity = Integer.parseInt(record.get(priceIndex+1)); + } + shoppe = stallMap.get(record.get(1)).intValue(); + } + + /** + * Returns a human-readable version of this offer, useful for debugging + * + * @return human-readable offer + */ + public String toString() { + return "[C:" + commodity + ",$" + price + ",Q:" + quantity + ",S:" + shoppe + "]"; + } + } + + /** + * An offer from a shoppe or stall to buy a certain quantity of a commodity + * for a certain price. If placed in an ordered Set, sorts by commodity index ascending, + * then by buy price descending, and finally by stall id ascending. + */ + class Buy extends Offer implements Comparable { + /** + * Creates a new Buy offer from the given record + * using the other parameters to determine stall id and commodity id of the offer. + * + * @param record the record with data to create the offer from + * @param stallMap a map containing the ids of the various stalls + * @param commodMap a map containing the ids of the various commodities + */ + public Buy(ArrayList record, LinkedHashMap stallMap, HashMap commodMap) { + super(record,stallMap,commodMap,2); + } + + /** + * Sorts by commodity index ascending, then price descending, then stall id ascending. + */ + public int compareTo(Buy buy) { + // organize by: commodity index, price, stall index + if(commodity == buy.commodity) { + // organize by price, then by stall index + if(price == buy.price) { + // organize by stall index + return shoppe>buy.shoppe ? 1 : -1; + } else if(price > buy.price) { + return -1; + } else { + return 1; + } + } else if(commodity > buy.commodity) { + return 1; + } else { + return -1; + } + } + } + + /** + * An offer from a shoppe or stall to sell a certain quantity of a commodity + * for a certain price. If placed in an ordered Set, sorts by commodity index ascending, + * then by sell price ascending, and finally by stall id ascending. + */ + class Sell extends Offer implements Comparable { + /** + * Creates a new Sell offer from the given record + * using the other parameters to determine stall id and commodity id of the offer. + * + * @param record the record with data to create the offer from + * @param stallMap a map containing the ids of the various stalls + * @param commodMap a map containing the ids of the various commodities + */ + public Sell(ArrayList record, LinkedHashMap stallMap, HashMap commodMap) { + super(record,stallMap,commodMap,4); + } + + /** + * Sorts by commodity index ascending, then price ascending, then stall id ascending. + */ + public int compareTo(Sell sell) { + // organize by: commodity index, price, stall index + if(commodity == sell.commodity) { + // organize by price, then by stall index + if(price == sell.price) { + // organize by stall index + return shoppe>sell.shoppe ? 1 : -1; + } else if(price > sell.price) { + return 1; + } else { + return -1; + } + } else if(commodity > sell.commodity) { + return 1; + } else { + return -1; + } + } + } + + /** + * Entry point. Remove modified files and replace with backups. + * Register the jar file we are running from to be deleted upon quit. + * Finally, conditionally set up the GUI. + */ + public MarketUploader() { + // check if we've been turned off in the control panel + Preferences prefs = Preferences.userNodeForPackage(getClass()); + boolean launch = prefs.getBoolean("launchAtStartup", true); + if(!launch) { + return; + } + + if (prefs.getBoolean("useLiveServers", false)) { + YARRG_URL = YARRG_LIVE_URL; + PCTB_HOST_URL = PCTB_LIVE_HOST_URL; + } else { + YARRG_URL = YARRG_TEST_URL; + PCTB_HOST_URL = PCTB_TEST_HOST_URL; + } + + uploadToYarrg=prefs.getBoolean("uploadToYarrg", true); + uploadToPCTB=prefs.getBoolean("uploadToPCTB", true); + + EventQueueMonitor.addTopLevelWindowListener(this); + if (EventQueueMonitor.isGUIInitialized()) { + createGUI(); + } else { + EventQueueMonitor.addGUIInitializedListener(this); + } + } + + /** + * Set up the GUI, with its window and one-button interface. Only initialize + * if we're running alongside a Window named "Puzzle Pirates" though. + */ + private void createGUI() { + if (frame != null && window != null) { + if (window.getAccessibleContext().getAccessibleName().equals("Puzzle Pirates")) frame.setVisible(true); + return; + } + frame = new JFrame("MarketUploader"); + frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + frame.getContentPane().setLayout(new FlowLayout()); + //frame.setPreferredSize(new Dimension(200, 60)); + + findMarket = new JButton("Upload Market Data"); + findMarket.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + findMarket.setEnabled(false); + new Thread() { + public void run() { + try { + runPCTB(); + } catch(Exception e) { + error(e.toString()); + e.printStackTrace(); + } finally { + if(sidePanel != null) { + // remove it if it's still attached + sidePanel.removePropertyChangeListener(changeListener); + } + } + //findMarketTable(); + findMarket.setEnabled(true); + } + }.start(); + } + }); + frame.add(findMarket); + frame.pack(); + } + + /** + * Finds the island name from the /who tab, sets global islandName variable + */ + private void getIsland() { + + // If the league tracker is there, we can skip the faff + // and ask for its tooltip, since we're on a boat + + Accessible leagueTracker = descendNodes(window,new int[] {0,1,0,0,2,1,1,1}); + try { + islandName = ((JLabel)leagueTracker).getToolTipText(); + } catch (NullPointerException e) { + + // evidently we're actually on an island + + islandName = null; + AccessibleContext chatArea = descendNodes(window,new int[] {0,1,0,0,0,2,0,0,2}).getAccessibleContext(); + // attach the property change listener to the outer sunshine panel if the "ahoy" tab + // is not active, otherwise attach it to the scroll panel in the "ahoy" tab. + if(!"com.threerings.piracy.client.AttentionListPanel". + equals(descendNodes(window,new int[] {0,1,0,0,2,2,0}).getClass().getCanonicalName())) { + sidePanel = descendNodes(window,new int[] {0,1,0,0,2,2}).getAccessibleContext(); + } else { + sidePanel = descendNodes(window,new int[] {0,1,0,0,2,2,0,0,0}).getAccessibleContext(); + } + sidePanel.addPropertyChangeListener(changeListener); + latch = new java.util.concurrent.CountDownLatch(1); + // make the Players Online ("/who") panel appear + AccessibleEditableText chat = chatArea.getAccessibleEditableText(); + chat.setTextContents("/w"); + int c = chatArea.getAccessibleAction().getAccessibleActionCount(); + for(int i=0;imsg. + * + * @param msg a String describing the error that occured. + */ + private void error(String msg) { + JOptionPane.showMessageDialog(frame,msg,"Error",JOptionPane.ERROR_MESSAGE); + } + + /** + * Run the data collection process, and upload the results. This is the method + * that calls most of the other worker methods for the process. If an error occurs, + * the method will call the error method and return early, freeing up the button + * to be clicked again. + * + * @exception Exception if an error we didn't expect occured + */ + private void runPCTB() throws Exception { + String yarrgts = ""; + ProgressMonitor pm = new ProgressMonitor(frame,"Processing Market Data","Getting table data",0,100); + pm.setMillisToDecideToPopup(0); + pm.setMillisToPopup(0); + + if (uploadToYarrg) { + yarrgts = getYarrgTimestamp(); + } + + AccessibleTable t = findMarketTable(); + if(t == null) { + error("Market table not found! Please open the Buy/Sell Commodities interface."); + return; + } + if(t.getAccessibleRowCount() == 0) { + error("No data found, please wait for the table to have data first!"); + return; + } + if(!isDisplayAll()) { + error("Please select \"All\" from the Display: popup menu."); + return; + } + + getIsland(); + getOcean(); + + latch.await(2, java.util.concurrent.TimeUnit.SECONDS); + + ArrayList> data = getData(t); + + if (uploadToYarrg) { + pm.setNote("Preparing data for Yarrg"); + pm.setProgress(10); + + StringBuilder yarrgsb = new StringBuilder(); + String yarrgdata; // string containing what we'll feed to yarrg + + for (ArrayList row : data) { + if (row.size() > 6) { + row.remove(6); + } + for (String rowitem : row) { + yarrgsb.append(rowitem != null ? rowitem : ""); + yarrgsb.append("\t"); + } + yarrgsb.setLength(yarrgsb.length()-1); // chop + yarrgsb.append("\n"); + } + + yarrgdata = yarrgsb.toString(); + + pm.setNote("Uploading to Yarrg"); + + if (islandName != null) { + runYarrg(yarrgts, oceanName, islandName, yarrgdata); + } else { + System.out.println("Couldn't upload to Yarrg - no island name found"); + } + } + + pm.setNote("Getting stall names"); + pm.setProgress(20); + if(pm.isCanceled()) { + return; + } + TreeSet buys = new TreeSet(); + TreeSet sells = new TreeSet(); + LinkedHashMap stallMap = getStallMap(data); + pm.setProgress(40); + pm.setNote("Sorting offers"); + if(pm.isCanceled()) { + return; + } + // get commod map + + HashMap commodMap = getCommodMap(); + if(commodMap == null) { + return; + } + int[] offerCount = getBuySellMaps(data,buys,sells,stallMap,commodMap); + //println(buys.toString()); + //System.out.println(sells); + //System.out.println("\n\n\n"+buys); + + if (uploadToPCTB) { + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + pm.setProgress(60); + pm.setNote("Sending data"); + if(pm.isCanceled()) { + return; + } + GZIPOutputStream out = new GZIPOutputStream(outStream); + //FileOutputStream out = new FileOutputStream(new File("output.text")); + DataOutputStream dos = new DataOutputStream(out); + dos.writeBytes("005\n"); + dos.writeBytes(stallMap.size()+"\n"); + dos.writeBytes(getAbbrevStallList(stallMap)); + writeBuySellOffers(buys,sells,offerCount,out); + out.finish(); + InputStream in = sendInitialData(new ByteArrayInputStream(outStream.toByteArray())); + pm.setProgress(80); + if(pm.isCanceled()) { + return; + } + pm.setNote("Waiting for PCTB..."); + finishUpload(in); + } + pm.setProgress(100); + } + + /** + * Get the offer data out of the table and cache it in an ArrayList. + * + * @param table the AccessibleTable containing the market data + * @return an array of record arrays, each representing a row of the table + */ + private ArrayList> getData(AccessibleTable table) { + ArrayList> data = new ArrayList>(); + for (int i = 0; i < table.getAccessibleRowCount(); i++) { + ArrayList row = new ArrayList(); + for (int j = 0; j < table.getAccessibleColumnCount(); j++) { + row.add(table.getAccessibleAt(i, j).getAccessibleContext().getAccessibleName()); + } + data.add(row); + } + return data; + } + + /** + * @return the table containing market data if it exists, otherwise null + */ + public AccessibleTable findMarketTable() { + Accessible node1 = window; + Accessible node = descendNodes(node1,new int[] {0,1,0,0,0,0,1,0,0,1,0,0}); // commod market + // commod market: {0,1,0,0,0,0,1,0,0,1,0} {0,1,0,0,0,0,1,0,1,0,0,1,0,0}) + //System.out.println(node); + if (!(node instanceof JTable)) { + node = descendNodes(node1,new int[] {0,1,0,0,0,0,1,0,1,0,0,1,0,0}); // commod market + } + if (!(node instanceof JTable)) return null; + AccessibleTable table = node.getAccessibleContext().getAccessibleTable(); + //System.out.println(table); + return table; + } + + /** + * Utility method to descend through several levels of Accessible children + * at once. + * + * @param parent the node on which to start the descent + * @param path an array of ints, each int being the index of the next + * accessible child to descend. + * @return the Accessible reached by following the descent path, + * or null if the desired path was invalid. + */ + private Accessible descendNodes(Accessible parent, int[] path) { + for(int i=0;iAccessible "node". + * + * @param parent the node with children + * @param childNum the index of the child of parent to return + * @return the childNum child of parent or null + * if the child is not found. + */ + private Accessible descend(Accessible parent, int childNum) { + if (childNum >= parent.getAccessibleContext().getAccessibleChildrenCount()) return null; + return parent.getAccessibleContext().getAccessibleChild(childNum); + } + + public static void main(String[] args) { + new MarketUploader(); + } + + /** + * Set the global window variable after the YPP window is created, + * remove the top level window listener, and start the GUI + */ + public void topLevelWindowCreated(Window w) { + window = w; + EventQueueMonitor.removeTopLevelWindowListener(this); + createGUI(); + } + + /** + * Returns true if the "Display:" menu on the commodities interface in YPP is set to "All" + * + * @return true if all commodities are displayed, otherwise false + */ + private boolean isDisplayAll() { + Accessible button = descendNodes(window,new int[] {0,1,0,0,0,0,1,0,0,0,1}); + if(!(button instanceof JButton)) { + button = descendNodes(window,new int[] {0,1,0,0,0,0,1,0,1,0,0,0,1}); + } + String display = button.getAccessibleContext().getAccessibleName(); + if(!display.equals("All")) { + return false; + } + return true; + } + + public void topLevelWindowDestroyed(Window w) {} + + public void guiInitialized() { + createGUI(); + } + + /** + * Gets the list of commodities and their associated commodity ids. + * On the first run, the data is downloaded from the PCTB server. + * After the first run, the data is cached using Preferences. + *

+ * Potential issues: When more commodities are added to the server, this + * program will currently break unless the user deletes the preferences + * file or we give them a new release with a slighly different storage + * location for the data. + * + * @return a map where the key is the commodity and the value is the commodity id. + */ + private HashMap getCommodMap() { + if(commodMap != null) { + return commodMap; + } + HashMap map = new HashMap(); + Preferences prefs = Preferences.userNodeForPackage(getClass()); + String xml; + try { + URL host = new URL(PCTB_HOST_URL + "commodmap.php"); + BufferedReader br = new BufferedReader(new InputStreamReader(host.openStream())); + StringBuilder sb = new StringBuilder(); + String str; + while((str = br.readLine()) != null) { + sb.append(str); + } + int first = sb.indexOf("

") + 5;
+			int last = sb.indexOf("");
+			xml = sb.substring(first,last);
+			//System.out.println(xml);
+			Reader reader = new CharArrayReader(xml.toCharArray());
+			Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(reader));
+			NodeList maps = d.getElementsByTagName("c");
+			for(int i=0;iLinkedHashMap where the key is the stall name
+	*	and the value is the generated stall id (position in the list).
+	*	

+ * The reason this method returns a LinkedHashMap instead of a simple HashMap is the need + * for iterating over the stall names in insertion order for output to the server. + * + * @param offers the list of records from the commodity buy/sell interface + * @return an iterable ordered map of the stall names and generated stall ids + */ + private LinkedHashMap getStallMap(ArrayList> offers) { + int count = 0; + LinkedHashMap map = new LinkedHashMap(); + for(ArrayList offer : offers) { + String shop = offer.get(1); + if(!map.containsKey(shop)) { + count++; + map.put(shop,count); + } + } + return map; + } + + /** + * Gets a sorted list of Buys and Sells from the list of records. buys and sells + * should be pre-initialized and passed into the method to receive the data. + * Returns a 2-length int array with the number of buys and sells found. + * + * @param offers the data found from the market table in-game + * @param buys an empty initialized TreeSet<Offer> to + * hold the Buy offers. + * @param sells an empty initialized TreeSet<Offer> to + * hold the Sell offers. + * @param stalls the map of stalls to their ids + * @param commodMap the map of commodities to their ids + * @return a 2-length int[] array containing the number of buys and sells, respectively + */ + private int[] getBuySellMaps(ArrayList> offers, TreeSet buys, + TreeSet sells, LinkedHashMap stalls, HashMap commodMap) { + int[] buySellCount = new int[2]; + for(ArrayList offer : offers) { + try { + if(offer.get(2) != null) { + buys.add(new Buy(offer,stalls,commodMap)); + buySellCount[0]++; + } + if(offer.get(4) != null) { + sells.add(new Sell(offer,stalls,commodMap)); + buySellCount[1]++; + } + } catch(IllegalArgumentException e) { + // System.err.println("Error: Unsupported Commodity \"" + offer.get(0) + "\""); + } + } + return buySellCount; + } + + /** + * Prepares the list of stalls for writing to the output stream. + * The String returned by this method is ready to be written + * directly to the stream. + *

+ * All shoppe names are left as they are. Stall names are abbreviated just before the + * apostrophe in the possessive, with an "^" and a letter matching the stall's type + * appended. Example: "Burninator's Ironworking Stall" would become "Burninator^I". + * + * @param stallMap the map of stalls and stall ids in an iterable order + * @return a String containing the list of stalls in format ready + * to be written to the output stream. + */ + private String getAbbrevStallList(LinkedHashMap stallMap) { + // set up some mapping + HashMap types = new HashMap(); + types.put("Apothecary Stall", "A"); + types.put("Distilling Stall", "D"); + types.put("Furnishing Stall", "F"); + types.put("Ironworking Stall", "I"); + types.put("Shipbuilding Stall", "S"); + types.put("Tailoring Stall", "T"); + types.put("Weaving Stall", "W"); + + StringBuilder sb = new StringBuilder(); + for(String name : stallMap.keySet()) { + int index = name.indexOf("'s"); + String finalName = name; + String type = null; + if (index > 0) { + finalName = name.substring(0,index); + if(index + 2 < name.length()) { + String end = name.substring(index+2,name.length()).trim(); + type = types.get(end); + } + } + if(type==null) { + sb.append(name+"\n"); + } else { + sb.append(finalName+"^"+type+"\n"); + } + } + return sb.toString(); + } + + /** + * Writes a list of offers in correct format to the output stream. + *

+ * The format is thus: (all numbers are 2-byte integers in little-endian format) + * (number of offers of this type, aka buy/sell) + * (commodity ID) (number of offers for this commodity) [shopID price qty][shopID price qty]... + * + * @param out the output stream to write the data to + * @param offers the offers to write + */ + private void writeOffers(OutputStream out, TreeSet offers) throws IOException { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + if(offers.size() == 0) { + // nothing to write, and "0" has already been written + return; + } + int commodity = offers.first().commodity; + int count = 0; + for(Offer offer : offers) { + if(commodity != offer.commodity) { + // write out buffer + writeBufferedOffers(out,buffer.toByteArray(),commodity,count); + buffer.reset(); + commodity = offer.commodity; + count = 0; + } + writeLEShort(offer.shoppe,buffer); // stall index + writeLEShort(offer.price,buffer); // buy price + writeLEShort(offer.quantity,buffer); // buy qty + count++; + } + writeBufferedOffers(out,buffer.toByteArray(),commodity,count); + } + + /** + * Writes the buffered data to the output strea for one commodity. + * + * @param out the stream to write to + * @param buffer the buffered data to write + * @param commodity the commmodity id to write before the buffered data + * @param count the number of offers for this commodity to write before the data + */ + private void writeBufferedOffers(OutputStream out, byte[] buffer, int commodity, int count) throws IOException { + writeLEShort(commodity,out); // commod index + writeLEShort(count,out); // offer count + out.write(buffer); // the buffered offers + } + + /** + * Writes the buy and sell offers to the outputstream by calling other methods. + * + * @param buys list of Buy offers to write + * @param sells list of Sell offers to write + * @param offerCount 2-length int array containing the number of buys and sells to write out + * @param out the stream to write to + */ + private void writeBuySellOffers(TreeSet buys, + TreeSet sells, int[] offerCount, OutputStream out) throws IOException { + // # buy offers + writeLEShort(offerCount[0],out); + writeOffers(out,buys); + // # sell offers + writeLEShort(offerCount[1],out); + writeOffers(out,sells); + } + + /** + * Sends the data to the server via multipart-formdata POST, + * with the gzipped data as a file upload. + * + * @param file an InputStream open to the gzipped data we want to send + */ + private InputStream sendInitialData(InputStream file) throws IOException { + ClientHttpRequest http = new ClientHttpRequest(PCTB_HOST_URL + "upload.php"); + http.setParameter("marketdata","marketdata.gz",file,"application/gzip"); + return http.post(); + } + + /** + * Utility method to write a 2-byte int in little-endian form to an output stream. + * + * @param num an integer to write + * @param out stream to write to + */ + private void writeLEShort(int num, OutputStream out) throws IOException { + out.write(num & 0xFF); + out.write((num >>> 8) & 0xFF); + } + + /** + * Reads the response from the server, and selects the correct parameters + * which are sent in a GET request to the server asking it to confirm + * the upload and accept the data into the database. Notably, the island id + * and ocean id are determined, while other parameter such as the filename + * are determined from the hidden form fields. + * + * @param in stream of data from the server to read + */ + private void finishUpload(InputStream in) throws IOException { + StringBuilder sb = new StringBuilder(); + BufferedReader br = new BufferedReader(new InputStreamReader(in)); + String str; + while((str = br.readLine()) != null) { + sb.append(str+"\n"); + } + String html = sb.toString(); + //System.out.println(html); + String topIsland = "0", ocean, islandNum, action, forceReload, filename; + Matcher m; + Pattern whoIsland = Pattern.compile("