@Override
  protected void refreshFromRemote() throws IOException {
    CachedUrlResolver urlResolver = new CachedUrlResolver();
    String urlRef = getUrl().getRef();
    String partNum = PartFactory.getInstance().scrapeText(urlRef, startId, endId).toUpperCase();
    String queryUrl = queryUrlTemplate.replaceAll("\\{PART\\}", partNum);
    String price = null;
    String queryContent = urlResolver.get(new URL(queryUrl));
    String title = PartFactory.getInstance().scrapeText(queryContent, startTitle, endTitle);
    setTitle(title);
    price = PartFactory.getInstance().scrapeText(queryContent, startPrice, endPrice);
    if (price != null && price.length() == 0) {
      HttpURLConnection conn = (HttpURLConnection) new URL(userDataUrl).openConnection();
      conn.connect();
      Map<String, List<String>> headerFields = conn.getHeaderFields();
      List<String> setCookies = headerFields.get("Set-Cookie");
      String cookies = "";
      if (setCookies != null) {
        for (String setCookie : setCookies) {
          cookies += setCookie.split(";")[0] + ";";
        }
      }
      String detailUrl = detailQueryTemplate.replaceAll("\\{PART\\}", partNum);
      urlResolver.setBasicAuth("firebom@firepick.org", "McSecret123");
      urlResolver.setCookies(cookies);
      String detailContent = urlResolver.get(new URL(detailUrl));
      String[] details = PartFactory.getInstance().scrapeText(detailContent, startDetail, endDetail).split(",");
      String detailItemString = PartFactory.getInstance().scrapeText(urlRef, startDetailItem, endDetailIndex);
      int detailItem = 0;
      try {
        detailItem = Integer.parseInt(detailItemString) - 1;
      }
      catch (NumberFormatException e) {
        // do nothing
      }
      String detailPriceUrl = detailPriceQueryTemplate.replaceAll("\\{DETAIL\\}", details[detailItem]).replaceAll("\\{PART\\}", partNum);
      urlResolver.setCookies(cookies);
      String detailPriceContent = urlResolver.get(new URL(detailPriceUrl));
      price = PartFactory.getInstance().scrapeText(detailPriceContent, startDetailPrice, endDetailPrice);
    }
    if (price != null) {
      setPackageCost(Double.parseDouble(price));
    }
    String packageUnits = PartFactory.getInstance().scrapeText(queryContent, startPackageUnits, endPackageUnits);
    if (packageUnits != null) {
      double value = Double.parseDouble(packageUnits);
      if (value == 0) {
        value = 1;
      }
      setPackageUnits(value);
    }

    setId(partNum);
  }