import javax.xml.parsers.DocumentBuilderFactory;
import org.xml.sax.InputSource;
import java.util.zip.GZIPOutputStream;
-import com.myjavatools.web.ClientHttpRequest;
+import net.chiark.yarrg.ClientHttpRequest;
import java.util.regex.*;
import java.util.prefs.Preferences;
import java.beans.*;
-import com.tedpearson.util.update.*;
/**
* MarketUploader is a class that handles the uploading of market
// 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_CLIENTVERSION =
+ com.tedpearson.ypp.market.Version.version;
+ private final static String YARRG_CLIENTFIXES = "bug-094";
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;
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;
JOptionPane.showMessageDialog(frame,msg,"Error",JOptionPane.ERROR_MESSAGE);
}
+ private void error_html(String msg, String html) {
+ //System.err.println("===" + html + "===");
+
+ Pattern body = Pattern.compile("<body>(.*)</body>", Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
+ Matcher m = body.matcher(html);
+ if (m.find()) {
+ html = m.group(1);
+ Pattern fixup = Pattern.compile("<(\\w+) */>");;
+ m = fixup.matcher(html);
+ html = m.replaceAll("<$1>");
+ m = Pattern.compile("[\\r\\n]+").matcher(html);
+ html = m.replaceAll(" ");
+ }
+ String whole_msg = "<html><h1>Error</h1>"+msg+"<h1>PCTB Server said:</h1><blockquote>"+html+"</blockquote>";
+ //System.err.println("###" + whole_msg + "###");
+
+ JOptionPane.showMessageDialog(frame,whole_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,
ArrayList<ArrayList<String>> data = getData(t);
- if (uploadToYarrg) {
+ if (uploadToYarrg && yarrgts != null) {
pm.setNote("Preparing data for Yarrg");
pm.setProgress(10);
GZIPOutputStream out = new GZIPOutputStream(outStream);
//FileOutputStream out = new FileOutputStream(new File("output.text"));
DataOutputStream dos = new DataOutputStream(out);
- dos.writeBytes("005\n");
+ dos.writeBytes("005y\n");
dos.writeBytes(stallMap.size()+"\n");
dos.writeBytes(getAbbrevStallList(stallMap));
writeBuySellOffers(buys,sells,offerCount,out);
out.finish();
InputStream in = sendInitialData(new ByteArrayInputStream(outStream.toByteArray()));
+ if (in == null) return;
pm.setProgress(80);
if(pm.isCanceled()) {
return;
//System.out.println(xml);
Reader reader = new CharArrayReader(xml.toCharArray());
Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(reader));
- NodeList maps = d.getElementsByTagName("c");
+ NodeList maps = d.getElementsByTagName("CommodMap");
for(int i=0;i<maps.getLength();i++) {
NodeList content = maps.item(i).getChildNodes();
Integer num = Integer.parseInt(content.item(1).getTextContent());
buySellCount[1]++;
}
} catch(IllegalArgumentException e) {
- // System.err.println("Error: Unsupported Commodity \"" + offer.get(0) + "\"");
+ System.err.println("Error: Unsupported Commodity \"" + offer.get(0) + "\"");
}
}
+ if (buySellCount[0]==0 && buySellCount[1]==0) {
+ error("No (valid) offers for PCTB?!");
+ throw new IllegalArgumentException();
+ }
return buySellCount;
}
writeOffers(out,sells);
}
+ private String readstreamstring(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");
+ }
+ return sb.toString();
+ }
+
/**
* Sends the data to the server via multipart-formdata POST,
* with the gzipped data as a file upload.
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();
+ if (!http.post()) {
+ String err = readstreamstring(http.resultstream());
+ error("Error sending initial data:\n"+err);
+ return null;
+ }
+ return http.resultstream();
}
/**
* @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();
+ String html = readstreamstring(in);
//System.out.println(html);
String topIsland = "0", ocean, islandNum, action, forceReload, filename;
Matcher m;
islandName +"\" on " + myOceansList.length + " oceans:","Choose Ocean",
JOptionPane.QUESTION_MESSAGE, null, myOceansList, null);
if(option == null) {
- error("Unable to determine the current island!");
+ error_html("Unable to determine the current island!", html);
return;
}
ocean = islandNumbers.get(option).toString();
ocean = myOceanNums.get(0).toString();
}
} else {
- error("Unknown island!");
+ error_html("Unknown island or other problem!", html);
return;
}
} else {
- error("Unable to determine island name from the client!");
+ error_html("Unable to determine island name from the client!", html);
return;
}
} else {
Pattern oceanIslandNum = Pattern.compile("islands\\[" + ocean + "\\]\\[\\d+\\]=new Option\\(\"" + islandName + "\",(\\d+)");
m = oceanIslandNum.matcher(html);
if(!m.find()) {
- error("This does not seem to be a valid island! Unable to upload.");
+ error_html("This does not seem to be a valid island! Unable to upload.", html);
return;
}
islandNum = m.group(1);
Pattern params = Pattern.compile("(?s)<input type=\"hidden\" name=\"action\" value=\"([^\"]+)\" />.+?<input type=\"hidden\" name=\"forcereload\" value=\"([^\"]+)\" />.+?<input type=\"hidden\" name=\"filename\" value=\"([^\"]+)\" />");
m = params.matcher(html);
if(!m.find()) {
- error("The PCTB server returned unusual data. Maybe you're using an old version of the uploader?");
+ error_html("The PCTB server returned unusual data. Maybe you're using an old version of the uploader?",
+ html);
return;
}
action = m.group(1);
filename = m.group(3);
URL get = new URL(PCTB_HOST_URL + "upload.php?topisland=" + topIsland + "&ocean=" + ocean + "&island="
+ islandNum + "&action=" + action + "&forcereload=" + forceReload + "&filename=" + filename);
- // System.out.println(get);
- BufferedReader br2 = new BufferedReader(new InputStreamReader(get.openStream()));
- sb = new StringBuilder();
- while((str = br2.readLine()) != null) {
- sb.append(str+"\n");
- }
+ String complete = readstreamstring(get.openStream());
Pattern done = Pattern.compile("Your data has been integrated into the database. Thank you!");
- m = done.matcher(sb.toString());
+ m = done.matcher(complete);
if(m.find()) {
//System.out.println("FILE upload successful!!!");
} else {
- error("Something was wrong with the final upload parameters!");
- System.err.println(sb.toString());
- System.err.println(html);
+ error_html("Something was wrong with the final upload parameters!", complete);
}
}
+ private InputStream post_for_yarrg(ClientHttpRequest http) throws IOException {
+ if (!http.post()) {
+ String err = readstreamstring(http.resultstream());
+ error("<html><h1>Error reported by YARRG server</h1>\n" + err);
+ return null;
+ }
+ return http.resultstream();
+ }
+
private String getYarrgTimestamp() throws IOException {
ClientHttpRequest http = new ClientHttpRequest (YARRG_URL);
http.setParameter("clientname", YARRG_CLIENTNAME);
http.setParameter("clientversion", YARRG_CLIENTVERSION);
http.setParameter("clientfixes", YARRG_CLIENTFIXES);
http.setParameter("requesttimestamp", "y");
- InputStream in = http.post();
+ InputStream in = post_for_yarrg(http);
+ if (in == null) return null;
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String tsresult = br.readLine();
return tsresult.substring(3, tsresult.length()-1);
http.setParameter("ocean", ocean);
http.setParameter("island", island);
http.setParameter("data", "deduped.tsv.gz", file, "application/octet-stream");
- InputStream in = http.post();
+ InputStream in = post_for_yarrg(http);
+ if (in == null) return;
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String yarrgresult;
while((yarrgresult = br.readLine()) != null) {