package com.jbidwatcher; /* * Copyright (c) 2000-2007, CyberFOX Software, Inc. All Rights Reserved. * * Developed by mrs (Morgan Schweers) */ import com.jbidwatcher.util.StringTools; import com.jbidwatcher.util.config.JConfig; import com.jbidwatcher.util.xml.XMLParseException; import com.jbidwatcher.util.xml.XMLElement; import com.jbidwatcher.util.xml.XMLSerializeSimple; import com.jbidwatcher.util.xml.XMLInterface; import com.jbidwatcher.ui.util.OptionUI; import com.jbidwatcher.util.http.Http; import com.jbidwatcher.util.Constants; import java.io.*; import java.net.*; import java.util.ArrayList; import java.awt.*; public class UpdaterEntry extends XMLSerializeSimple { protected String _version = ""; protected String _severity = ""; protected String _description = ""; // Optional protected String _url = ""; protected String _changelogURL = ""; protected String _changelog; protected boolean _valid; protected ArrayList<XMLInterface> mConfigChanges; public UpdaterEntry(String packageName, String updateFrom) { StringBuffer loadedUpdate; try { URLConnection uc = Http.net().getPage(updateFrom); loadedUpdate = Http.net().receivePage(uc); _valid = true; } catch(IOException e) { loadedUpdate = null; JConfig.log().handleException("UpdaterEntry: " + e, e); _valid = false; } if(_valid && (loadedUpdate == null || loadedUpdate.length() == 0)) _valid = false; if(_valid) { loadFromString(loadedUpdate, packageName); } } public void loadFromString(StringBuffer sb, String packageName) { if(sb == null || packageName == null) { //noinspection ThrowableInstanceNeverThrown JConfig.log().handleException("loadFromString Failed with a null pointer!", new Exception("Updater got incorrect XML file.")); } else { XMLElement xmlUpdate = new XMLElement(true); xmlUpdate.parseString(sb.toString()); if (xmlUpdate.getTagName().equalsIgnoreCase(packageName)) { fromXML(xmlUpdate); } else { throw new XMLParseException(xmlUpdate.getTagName(), "Updater got incorrect XML file."); } } } public XMLElement toXML() { throw new RuntimeException("toXML not supported by load-only class."); } protected String[] infoTags = { "version", "severity", "description", "url", "config", "knownversion", "changelog" }; protected String[] getTags() { return infoTags; } protected void handleTag(int i, XMLElement curElement) { switch(i) { case 0: _version = curElement.getContents(); break; case 1: _severity = curElement.getContents(); break; case 2: _description = curElement.getContents(); break; case 3: _url = curElement.getContents(); break; case 4: boolean valid = true; // Allow validating individual configuration settings by program version. String vNum = curElement.getProperty("VERSION"); if(vNum != null) { valid = vNum.equals(Constants.PROGRAM_VERS); } // Allow validating individual configuration settings by configuration settings. String checkTrue = curElement.getProperty("CHECKTRUE"); if(checkTrue != null) { if(JConfig.queryConfiguration(checkTrue, "true").equals("false")) valid = false; } if(valid) { String strStamp = curElement.getProperty("STAMP"); if(strStamp == null) { if(mConfigChanges == null) mConfigChanges = new ArrayList<XMLInterface>(5); mConfigChanges.add(curElement); } else { long stamp = Long.parseLong(strStamp); long last = Long.parseLong(JConfig.queryConfiguration("updates.lastConfig", "0")); if(stamp > last) { if(mConfigChanges == null) mConfigChanges = new ArrayList<XMLInterface>(5); mConfigChanges.add(curElement); } } } break; case 5: // If <knownversion>{this version}</...> exists, then don't alert to a new version. String known = curElement.getContents(); if(known.equals(Constants.PROGRAM_VERS)) _version = known; break; case 6: _changelogURL = curElement.getContents(); break; default: // Do absolutely nothing. New tags (for later versions) should be // ignored, and not cause errors. } } public boolean isValid() { return _valid; } public String getVersion() { return _version; } public String getSeverity() { return _severity; } public String getDescription() { return _description; } public String getURL() { return _url; } public URL getChangelogURL() { if (_changelogURL != null && _changelogURL.length() != 0) { try { return new URL(_changelogURL); } catch (MalformedURLException ignored) { // This is ignored, and we return null. } } return null; } public String getChangelog() { URL changelog = getChangelogURL(); if(_changelog == null && changelog != null) { _changelog = StringTools.cat(changelog); } return _changelog; } public static void main(String[] args) { UpdaterEntry ue = new UpdaterEntry(Constants.PROGRAM_NAME.toLowerCase(), "http://www.jbidwatcher.com/jbidwatcher2.xml"); System.out.println("Available version is: " + ue.getVersion()); System.out.println("How strongly encouraged: " + ue.getSeverity()); System.out.println("What is new/necessary: " + ue.getDescription()); System.out.println("The URL to get that version at is: " + ue.getURL()); System.out.println("Changelog URL: " + ue.getChangelogURL().toString()); System.out.println("The changelog is: " + ue.getChangelog()); } public boolean hasConfigurationUpdates() { return mConfigChanges != null; } public void applyConfigurationUpdates() { StringBuffer alert = null; boolean cfgChanged = false; long lastStamp = Long.parseLong(JConfig.queryConfiguration("updates.lastConfig", "0")); for (XMLInterface cfg : mConfigChanges) { String type = cfg.getProperty("TYPE", "config"); if (type.equals("message")) { if (alert == null) { alert = new StringBuffer(cfg.getContents()); } else { alert.append('\n'); alert.append(cfg.getContents()); } } else if (type.equals("config")) { String cfgVar = cfg.getProperty("VARIABLE"); if (cfgVar != null) { // Save old values, in case we need to restore them later. if (JConfig.queryConfiguration(cfgVar) != null) { JConfig.setConfiguration("saved." + cfgVar, JConfig.queryConfiguration(cfgVar)); } JConfig.setConfiguration(cfgVar, cfg.getContents()); cfgChanged = true; } } else if (type.equals("string")) { String cfgVar = cfg.getProperty("STRING"); if (cfgVar != null) { JConfig.setConfiguration("replace." + Constants.PROGRAM_VERS + "." + cfgVar, cfg.getContents()); cfgChanged = true; } } else if (type.equals("restore")) { String cfgVar = cfg.getContents(); if (cfgVar != null) { String oldCfg = JConfig.queryConfiguration("saved." + cfgVar); if (oldCfg != null) { JConfig.setConfiguration(cfgVar, oldCfg); JConfig.kill("saved." + cfgVar); cfgChanged = true; } } } else if (type.equals("delete")) { String cfgVar = cfg.getContents(); String oldCfg = JConfig.queryConfiguration(cfgVar); if (oldCfg != null) { JConfig.kill(cfgVar); cfgChanged = true; } } String strStamp = cfg.getProperty("STAMP"); if (strStamp != null) { long stamp = Long.parseLong(strStamp); if (stamp > lastStamp) lastStamp = stamp; } } JConfig.setConfiguration("updates.lastConfig", Long.toString(lastStamp)); if(cfgChanged) JConfig.updateComplete(); if(alert != null) { OptionUI oui = new OptionUI(); Dimension aboutBoxSize = new Dimension(495, 245); oui.showHTMLDisplay(alert, aboutBoxSize, Constants.PROGRAM_NAME + " News Alert..."); } } }