X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=jarrg-ian.git;a=blobdiff_plain;f=src%2Fcom%2Ftedpearson%2Fypp%2Fmarket%2FMarketUploader.java;h=b20e359e10bda3c58aa1cbb8988f693c5392d647;hp=9aa8f046301e1480e90aaf7ef2c56f61f4958aa5;hb=ef8e7f059efa5abf5e1b080d1c114a85ed9b8e43;hpb=27386c58e010ef63c7eb48172cc9f908225d24a9 diff --git a/src/com/tedpearson/ypp/market/MarketUploader.java b/src/com/tedpearson/ypp/market/MarketUploader.java index 9aa8f04..b20e359 100644 --- a/src/com/tedpearson/ypp/market/MarketUploader.java +++ b/src/com/tedpearson/ypp/market/MarketUploader.java @@ -39,6 +39,8 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis private Window window = null; private JButton findMarket = null; private JLabel resultSummary = null; + private JLabel arbitrageResult = null; + private long startTime = 0; private final static String PCTB_LIVE_HOST_URL = "http://pctb.crabdance.com/"; private final static String PCTB_TEST_HOST_URL = "http://pctb.ilk.org/"; @@ -55,6 +57,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis private boolean uploadToYarrg; private boolean uploadToPCTB; + private boolean showArbitrage; private String islandName = null; private String oceanName = null; @@ -62,6 +65,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis private AccessibleContext sidePanel; private HashMap commodMap; + public PrintStream dtxt = null; private PropertyChangeListener changeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { @@ -72,7 +76,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis int index = text.indexOf(":"); String name = text.substring(0,index); islandName = name; - //System.out.println(islandName); + // if (dtxt!=null) dtxt.println(islandName); sidePanel.removePropertyChangeListener(this); latch.countDown(); } @@ -86,6 +90,21 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis return Integer.parseInt(str); } } + + private void progresslog(String s) { + if (dtxt == null) return; + long now = new Date().getTime(); + dtxt.println("progress "+(now - startTime)+"ms "+s); + } + + private void progressNote(ProgressMonitor pm, String s) { + String arb = null; + if (arbitrageResult != null) + arb = arbitrageResult.getText(); + if (arb != null && arb.length() != 0) + s = "" + arb + "
" + s; + pm.setNote(s); + } /** * An abstract market offer, entailing a commodity being bought or sold by @@ -219,6 +238,14 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis // check if we've been turned off in the control panel Preferences prefs = Preferences.userNodeForPackage(getClass()); + if (prefs.getBoolean("writeDebugFiles", false)) { + try { + dtxt = new PrintStream(new File("jarrg-debug-log.txt")); + } catch (java.io.FileNotFoundException e) { + System.err.println("JARRG: Error opening debug log: "+e); + } + } + if (prefs.getBoolean("useLiveServers", false)) { YARRG_URL = YARRG_LIVE_URL; PCTB_HOST_URL = PCTB_LIVE_HOST_URL; @@ -229,6 +256,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis uploadToYarrg=prefs.getBoolean("uploadToYarrg", true); uploadToPCTB=prefs.getBoolean("uploadToPCTB", true); + showArbitrage=prefs.getBoolean("showArbitrage", true); EventQueueMonitor.addTopLevelWindowListener(this); if (EventQueueMonitor.isGUIInitialized()) { @@ -248,9 +276,10 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis if (window.getAccessibleContext().getAccessibleName().equals("Puzzle Pirates")) frame.setVisible(true); return; } - frame = new JFrame("MarketUploader"); + frame = new JFrame("Jarrg Uploader"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - frame.getContentPane().setLayout(new GridLayout(2,1)); + GridLayout layout = new GridLayout(2,1); + frame.getContentPane().setLayout(layout); //frame.setPreferredSize(new Dimension(200, 60)); findMarket = new JButton("Upload Market Data"); @@ -259,9 +288,11 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis findMarket.setEnabled(false); new Thread() { public void run() { + startTime = new Date().getTime(); resultSummary.setText(""); + arbitrageResult.setText(""); try { - runPCTB(); + runUpload(); } catch(Exception e) { error(e.toString()); e.printStackTrace(); @@ -283,6 +314,13 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis resultSummary = new JLabel("ready"); frame.add(resultSummary); + arbitrageResult = new JLabel(""); + + if (showArbitrage) { + layout.setRows(layout.getRows() + 1); + frame.add(arbitrageResult); + } + frame.pack(); } @@ -358,7 +396,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis html = m.replaceAll(" "); } String whole_msg = "

Error

"+msg+"

PCTB Server said:

"+html+"
"; - System.err.println("###" + whole_msg + "###"); + if (dtxt!=null) dtxt.println("###" + whole_msg + "###"); JOptionPane.showMessageDialog(frame,whole_msg,"Error",JOptionPane.ERROR_MESSAGE); } @@ -371,7 +409,9 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis * * @exception Exception if an error we didn't expect occured */ - private void runPCTB() throws Exception { + private void runUpload() throws Exception { + progresslog("starting"); + String yarrgts = ""; ProgressMonitor pm = new ProgressMonitor(frame,"Processing Market Data","Getting table data",0,100); pm.setMillisToDecideToPopup(0); @@ -379,7 +419,9 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis boolean doneyarrg = false, donepctb = false; if (uploadToYarrg) { + progresslog("yarrg timestamp..."); yarrgts = getYarrgTimestamp(); + progresslog("yarrg timestamp done."); } AccessibleTable accesstable = findMarketTable(); @@ -396,13 +438,23 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis return; } + progresslog("getisland..."); getIsland(); + progresslog("getocean..."); getOcean(); + progresslog("getocean done"); if (latch != null) { latch.await(2, java.util.concurrent.TimeUnit.SECONDS); } + if (islandName == null) { + error("Could not find island name in YPP user interface."); + return; + } + + progresslog("table check..."); + String headings_expected[] = new String[] { "Commodity", "Trading outlet", "Buy price", "Will buy", "Sell price", "Will sell" }; ArrayList> headers = getData(accesstable.getAccessibleColumnHeader()); @@ -425,14 +477,19 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis } } + progresslog("table read..."); + ArrayList> data = getData(accesstable); - if (false) { + if (showArbitrage) { + progresslog("arbitrage..."); calculateArbitrage(data); + progresslog("arbitrage done."); } if (uploadToYarrg && yarrgts != null) { - pm.setNote("Yarrg: Preparing data"); + progresslog("yarrg prepare..."); + progressNote(pm, "Yarrg: Preparing data"); pm.setProgress(10); StringBuilder yarrgsb = new StringBuilder(); @@ -452,17 +509,16 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis yarrgdata = yarrgsb.toString(); - pm.setNote("Yarrg: Uploading"); + progressNote(pm, "Yarrg: Uploading"); + progresslog("yarrg upload..."); - if (islandName != null) { - doneyarrg = runYarrg(yarrgts, oceanName, islandName, yarrgdata); - } else { - System.out.println("Couldn't upload to Yarrg - no island name found"); - } + doneyarrg = runYarrg(yarrgts, oceanName, islandName, yarrgdata); + progresslog("yarrg done."); } if (uploadToPCTB) { - pm.setNote("PCTB: Getting stall names"); + progresslog("pctb prepare..."); + progressNote(pm, "PCTB: Getting stall names"); pm.setProgress(20); if(pm.isCanceled()) { return; @@ -471,7 +527,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis TreeSet sells = new TreeSet(); LinkedHashMap stallMap = getStallMap(data); pm.setProgress(40); - pm.setNote("PCTB: Sorting offers"); + progressNote(pm, "PCTB: Sorting offers"); if(pm.isCanceled()) { return; } @@ -483,12 +539,12 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis } int[] offerCount = getBuySellMaps(data,buys,sells,stallMap,commodMap); //println(buys.toString()); - //System.out.println(sells); - //System.out.println("\n\n\n"+buys); + // if (dtxt!=null) dtxt.println(sells); + // if (dtxt!=null) dtxt.println("\n\n\n"+buys); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); pm.setProgress(60); - pm.setNote("PCTB: Sending data"); + progressNote(pm, "PCTB: Sending data"); if(pm.isCanceled()) { return; } @@ -500,14 +556,18 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis dos.writeBytes(getAbbrevStallList(stallMap)); writeBuySellOffers(buys,sells,offerCount,out); out.finish(); + progresslog("pctb send..."); InputStream in = sendInitialData(new ByteArrayInputStream(outStream.toByteArray())); + progresslog("pctb sent."); if (in == null) return; pm.setProgress(80); if(pm.isCanceled()) { return; } - pm.setNote("PCTB: Waiting ..."); + progressNote(pm, "PCTB: Waiting ..."); + progresslog("pctb finish..."); donepctb = finishUpload(in); + progresslog("pctb done."); } pm.setProgress(100); @@ -519,6 +579,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis } else { resultSummary.setText("uploaded nowhere!"); } + progresslog("done."); } /** @@ -546,13 +607,13 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis 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 (dtxt!=null) dtxt.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); + // if (dtxt!=null) dtxt.println(table); return table; } @@ -569,7 +630,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis private Accessible descendNodes(Accessible parent, int[] path) { for(int i=0;i") + 5; int last = sb.indexOf(""); xml = sb.substring(first,last); - //System.out.println(xml); + //if (dtxt!=null) { + // dtxt.println(">>"); + // dtxt.println(sb);; + // dtxt.println("||"); + // dtxt.println(xml); + // dtxt.println("<<"); + //} + // if (dtxt!=null) dtxt.println(xml); Reader reader = new CharArrayReader(xml.toCharArray()); Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(reader)); NodeList maps = d.getElementsByTagName("CommodMap"); @@ -724,7 +792,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis buySellCount[1]++; } } catch(IllegalArgumentException e) { - System.err.println("Error: Unsupported Commodity \"" + offer.get(0) + "\""); + if (dtxt!=null) dtxt.println("Error: Unsupported Commodity \"" + offer.get(0) + "\""); } } if (buySellCount[0]==0 && buySellCount[1]==0) { @@ -894,7 +962,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis */ private boolean finishUpload(InputStream in) throws IOException { String html = readstreamstring(in); - //System.out.println(html); + // if (dtxt!=null) dtxt.println(html); Matcher m; Pattern params = Pattern.compile("(?s).+?.+?"); @@ -929,7 +997,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis Pattern done = Pattern.compile("Your data has been integrated into the database. Thank you!"); m = done.matcher(complete); if(m.find()) { - System.out.println("FILE upload successful!!!"); + if (dtxt!=null) dtxt.println("FILE upload successful!!!"); return true; } else { error_html("Something was wrong with the final upload parameters!", complete); @@ -979,32 +1047,41 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis BufferedReader br = new BufferedReader(new InputStreamReader(in)); String yarrgresult; while((yarrgresult = br.readLine()) != null) { - System.out.println(yarrgresult); + if (dtxt!=null) dtxt.println(yarrgresult); } return true; } private int calculateArbitrageCommodity(ArrayList> arb_bs) { - System.out.println("ARBITRAGE?"); + // if (dtxt!=null) dtxt.println("ARBITRAGE?"); int profit = 0; SortedSet buys = arb_bs.get(0); SortedSet sells = arb_bs.get(1); while (true) { int[] buy, sell; try { - buy = buys.first(); + // NB "sell" means they sell, ie we buy sell = sells.last(); + buy = buys.first(); } catch (NoSuchElementException e) { break; } + + int unitprofit = buy[0] - sell[0]; int count = buy[1] < sell[1] ? buy[1] : sell[1]; - System.out.println(" buy @"+buy[0]+" x"+buy[1]+" sell @"+sell[0]+" x"+sell[1]+" => x"+count); - profit += count * (buy[0] - sell[0]); + // if (dtxt!=null) dtxt.println(" sell @"+sell[0]+" x"+sell[1]+" buy @"+buy[0]+" x"+buy[1] + // +" => x"+count+" @"+unitprofit); + + if (unitprofit <= 0) + break; + + profit += count * unitprofit; buy[1] -= count; sell[1] -= count; if (buy[1]==0) buys.remove(buy); - if (sell[1]==0) buys.remove(sell); + if (sell[1]==0) sells.remove(sell); } + // if (dtxt!=null) dtxt.println(" PROFIT "+profit); return profit; } @@ -1016,8 +1093,8 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis } } - private @SuppressWarnings("unchecked") void calculateArbitrage(ArrayList> data) - { + private @SuppressWarnings("unchecked") + void calculateArbitrage(ArrayList> data) { int arbitrage = 0; ArrayList> arb_bs = null; String lastcommod = null; @@ -1025,15 +1102,15 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis for (ArrayList row : data) { String thiscommod = row.get(0); - System.out.println("ROW "+row.toString()); + // if (dtxt!=null) dtxt.println("ROW "+row.toString()); if (lastcommod == null || !thiscommod.equals(lastcommod)) { if (lastcommod != null) arbitrage += calculateArbitrageCommodity(arb_bs); - //System.out.println("ROW rdy"); + // if (dtxt!=null) dtxt.println("ROW rdy"); arb_bs = new ArrayList>(2); arb_bs.add(0, new TreeSet(compar)); arb_bs.add(1, new TreeSet(compar)); - System.out.println("ROW init"); + // if (dtxt!=null) dtxt.println("ROW init"); lastcommod = thiscommod; } for (int bs = 0; bs < 2; bs++) { @@ -1041,13 +1118,18 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis if (pricestr == null) continue; int[] entry = new int[2]; - //System.out.println("ROW BS "+bs); + // if (dtxt!=null) dtxt.println("ROW BS "+bs); entry[0] = parseQty(pricestr); entry[1] = parseQty(row.get(bs*2 + 3)); arb_bs.get(bs).add(entry); } } arbitrage += calculateArbitrageCommodity(arb_bs); + if (arbitrage != 0) { + arbitrageResult.setText("arbitrage: "+arbitrage+" poe"); + } else { + arbitrageResult.setText("no arbitrage"); + } } }