private HashMap<Date, Double> readTideDataFromService() {
        
		// Log a message
		logger
        .debug("readTideDataFromService called and params are currently :");
		logger.debug("-> Location = " + tideLocation);
		logger.debug("-> Location URL Fragment = " + tideLocationUrlFragment);
		logger.debug("-> Start Date = " + startDateTime);
		logger.debug("-> End Date = " + endDateTime);
		logger.debug("-> Number of minutes between points = "
                     + numberOfMinutesBetweenDataPoints);
        
		// This is the HashMap that will be returned
		HashMap<Date, Double> dataFromServices = new HashMap<Date, Double>();
        
		// Create a Calendar that will hold the start time
		Calendar dateRangeStartCal = Calendar.getInstance();
		dateRangeStartCal.setTime(startDateTime);
        
		// Create a matching Calendar that will hold the end time
		Calendar dateRangeEndCal = Calendar.getInstance();
		dateRangeEndCal.setTime(endDateTime);
        
		// Let's open both ends of the range by a week to make sure we get
		// enough data
		dateRangeStartCal.add(Calendar.MINUTE, -2
                              * numberOfMinutesBetweenDataPoints);
		dateRangeEndCal.add(Calendar.MINUTE,
                            (2 * numberOfMinutesBetweenDataPoints));
		logger.debug("Opened the query window up to search between "
                     + dateRangeStartCal.getTime() + " to "
                     + dateRangeEndCal.getTime());
        
		// Now we need to extract some information from the date range to build
		// the correct URL
		String startYear = dateRangeStartCal.get(Calendar.YEAR) + "";
		String startMonth = (dateRangeStartCal.get(Calendar.MONTH) + 1) + "";
		String startDay = dateRangeStartCal.get(Calendar.DAY_OF_MONTH) + "";
		String startHour = dateRangeStartCal.get(Calendar.HOUR_OF_DAY) + "";
		String startMin = dateRangeStartCal.get(Calendar.MINUTE) + "";
		int numberOfDays = ((dateRangeEndCal.get(Calendar.YEAR) - dateRangeStartCal
                             .get(Calendar.YEAR)) * 365)
        + (dateRangeEndCal.get(Calendar.DAY_OF_YEAR) - (dateRangeStartCal
                                                        .get(Calendar.DAY_OF_YEAR)));
		String glen = numberOfDays + "";
        
		// Now create the URL that will read in the data from the web site
		URL tideDataUrl = null;
		try {
			tideDataUrl = new URL("http://tbone.biol.sc.edu/tide/tideshow.cgi?"
                                  + "tplotdir=horiz;" + "gx=640;" + "gy=240;"
                                  + "caltype=ndp;" + "type=mrare;" + "interval=00%3A30;"
                                  + "glen="
                                  + glen
                                  + ";"
                                  + "fontsize=%2B0;"
                                  + "units=feet;"
                                  + "cleanout=1;"
                                  + "year="
                                  + startYear
                                  + ";"
                                  + "month="
                                  + startMonth
                                  + ";"
                                  + "day="
                                  + startDay
                                  + ";"
                                  + "hour="
                                  + startHour
                                  + ";"
                                  + "min="
                                  + startMin
                                  + ";"
                                  + "tzone=utc;"
                                  + "ampm24=24;"
                                  + "colortext=black;"
                                  + "colordatum=white;"
                                  + "colormsl=yellow;"
                                  + "colortics=red;"
                                  + "colorday=skyblue;"
                                  + "colornight=deep-%3Cbr%20%2F%3Eskyblue;"
                                  + "colorebb=seagreen;"
                                  + "colorflood=blue;"
                                  + "site="
                                  + tideLocationUrlFragment);
			logger.debug("readTideDataFromService: URL to use: " + tideDataUrl);
		} catch (MalformedURLException ex) {
			logger
            .error("MalforedURLException creating the URL to read tide data: "
                   + ex.getMessage());
		}
		// Open a buffered reader to the URL
		BufferedReader in = null;
		try {
			in = new BufferedReader(new InputStreamReader(tideDataUrl
                                                          .openStream()));
		} catch (IOException e) {
			logger
            .error("IOException caught trying to open "
                   + "buffered reader to URL for tide data: "
                   + e.getMessage());
		}
        
		// Compile some patterns to be used for matching and data extraction
		// from the results
		Pattern pattern = Pattern
        .compile("^(\\d{4})-(\\d{2})-(\\d{2})\\s+(\\d{2}):(\\d{2})\\s+(\\S+)\\s+(-*\\d+\\.\\d+)$");
        
		try {
			// The line to be read
			String inputLine = null;
            
			// The variables (Strings) to be extracted
			String year = null;
			String month = null;
			String day = null;
			String hour = null;
			String minute = null;
			String zone = null;
			String dataString = null;
            
			// Loop over all lines read from the URL
			while ((inputLine = in.readLine()) != null) {
				// Check to see if a date can be pulled from the line
				Matcher m = pattern.matcher(inputLine);
				if (m.matches()) {
					// Grab the year
					year = m.group(1);
					// Grab the month
					month = m.group(2);
					// Grab the day
					day = m.group(3);
					// Grab the hour
					hour = m.group(4);
					// Grab the minute
					minute = m.group(5);
					// Grab the timezone
					zone = m.group(6);
					// Grab the data
					dataString = m.group(7);
                    
					// Create a calendar with the parsed information
					Calendar dataPointCalendar = Calendar.getInstance();
                    
					// First grab the old timezone
					String timeZoneID = dataPointCalendar.getTimeZone().getID();
                    
					// This calendar is now in local time, but the stuff read
					// from the URL is in UTC. So, set the timezone to be UTC.
					dataPointCalendar.setTimeZone(TimeZone.getTimeZone("UTC"));
                    
					// Now assign the values to the Calendar that were parsed
					// from the line
					dataPointCalendar
                    .set(Calendar.YEAR, Integer.parseInt(year));
					dataPointCalendar.set(Calendar.MONTH, Integer
                                          .parseInt(month) - 1);
					dataPointCalendar.set(Calendar.DAY_OF_MONTH, Integer
                                          .parseInt(day));
					dataPointCalendar.set(Calendar.HOUR_OF_DAY, Integer
                                          .parseInt(hour));
					dataPointCalendar.set(Calendar.MINUTE, Integer
                                          .parseInt(minute));
                    
					// Since seconds are not returned, zero them out
					dataPointCalendar.set(Calendar.SECOND, 0);
                    
					// I have to call a get method here to make sure the changes
					// in the date actually take. Seems very hackish, but hey,
					// it works
					dataPointCalendar.getTime();
                    
					// Construct the data point
					Double tideDataPoint = null;
					try {
						tideDataPoint = new Double(dataString);
					} catch (NumberFormatException e) {
						logger.error("Read tide data point " + dataString
                                     + " but could not convert that to a Double: "
                                     + e.getMessage());
					}
                    
					// Now add this to the local hashmap
					if (tideDataPoint != null) {
						dataFromServices.put(dataPointCalendar.getTime(),
                                             tideDataPoint);
                        
						// Check against mins and max
						if (tideDataPoint.doubleValue() > maxTide.doubleValue())
							maxTide = tideDataPoint;
						if (tideDataPoint.doubleValue() < minTide.doubleValue())
							minTide = tideDataPoint;
					}
				}
			}
		} catch (IOException e) {
			logger.error("IOException caught trying to read line from URL "
                         + e.getMessage());
		}
        
		// Print some logger information at finish
		logger.debug("Done with query and found " + dataFromServices.size()
                     + " data points in the query results.");
		logger.debug("After query:");
		logger.debug("-> Minimum Tide = " + this.minTide);
		logger.debug("-> Maximum Tide = " + this.maxTide);
        
		// Return the result
		return dataFromServices;
	}