private void populateTideData() {
		// Make sure all the parameters are available
		if ((tideLocation == null) || (tideLocation.equals(""))
            || (startDateTime == null) || (endDateTime == null)
            || (tideLocationUrlFragment == null)
            || (tideLocationUrlFragment.equals(""))) {
			throw new IllegalArgumentException(
                                               "Not all the parameters were set "
                                               + "so tide data could not be retrieved.");
		} else {
			// Now in order to find the time range that will need to be pulled
			// from the tide prediction service, we need to check the currently
			// set start and end times to see if they have already been covered
			if (!this.isDateRangeCovered(startDateTime, endDateTime)) {
				// Set the flag to indicate we are buys
				this.busyRetrievingData = true;
                
				try {
					// Read in the tide data
					HashMap<Date, Double> moreTideData = this
                    .readTideDataFromService();
					// Add it to the current data
					this.addTideDataAndUpdateCoverage(moreTideData);
					// Same for events
					HashMap<Date, String> moreTideEvents = this
                    .readTideEventsFromService();
					this.addTideEvents(moreTideEvents);
				} catch (Throwable t) {
					logger
                    .error("Throwable caught trying to read tide data and events from URL: "
                           + t.getMessage());
				}
				// Set the flag to indicate we are buys
				this.busyRetrievingData = false;
			}
		}
        
	}