Created
December 21, 2015 19:57
-
-
Save jreece1567/84a3ec1866685c3df3e7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* | |
*/ | |
package com.westfieldlabs.restsdk.example; | |
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.InputStreamReader; | |
import java.net.HttpURLConnection; | |
import java.net.URL; | |
import java.text.SimpleDateFormat; | |
import java.util.Date; | |
import java.util.TimeZone; | |
import java.util.concurrent.TimeUnit; | |
import java.util.logging.Logger; | |
import com.google.gson.Gson; | |
import com.google.gson.GsonBuilder; | |
import com.google.gson.JsonParser; | |
import com.westfieldlabs.restsdk.model.deal.DealInstance; | |
import com.westfieldlabs.restsdk.model.deal.DealResponse; | |
import com.westfieldlabs.restsdk.services.RestSdkApiService; | |
import com.westfieldlabs.restsdk.services.RestSdkApiServiceBuilder; | |
/** | |
* @author jreece | |
* | |
*/ | |
public class DealDates { | |
/** | |
* Logger | |
*/ | |
protected static Logger LOGGER = Logger | |
.getLogger(DealDates.class.getName()); | |
/** | |
* A Gson instance | |
*/ | |
protected final Gson gson = new GsonBuilder().serializeNulls() | |
.setPrettyPrinting().create(); | |
/** | |
* The WestfieldLabs REST API service-facade. | |
*/ | |
private final RestSdkApiService service; | |
private static String API_KEY = "123456789012345678901234"; | |
public DealDates() { | |
this.service = (new RestSdkApiServiceBuilder.Builder()).setApiKey( | |
API_KEY).build(); | |
} | |
/** | |
* Fetch the contents at an url as a string. | |
* | |
* @param uri | |
* the url to be read | |
* @return the contents at the url, or {@code null} | |
*/ | |
protected String getUrlAsString(final String uri) { | |
LOGGER.info("Raw URL: " + uri); | |
try { | |
final URL url = new URL(uri); | |
final HttpURLConnection connection = (HttpURLConnection) url | |
.openConnection(); | |
connection.addRequestProperty("Accept", "application/json"); | |
InputStream is; | |
if ((connection.getResponseCode() > 199) | |
&& (connection.getResponseCode() < 300)) { | |
// read response-body for HTTP-2xx responses | |
is = connection.getInputStream(); | |
} else { | |
// read response-body for HTTP-3xx/4xx/5xx responses | |
is = connection.getErrorStream(); | |
} | |
final BufferedReader br = new BufferedReader(new InputStreamReader( | |
is)); | |
final StringBuilder sb = new StringBuilder(); | |
String line; | |
while ((line = br.readLine()) != null) { | |
sb.append(line); | |
} | |
br.close(); | |
is.close(); | |
return sb.toString().trim(); | |
} catch (final IOException e) { | |
LOGGER.severe("Response '" + e.getLocalizedMessage() | |
+ "' when accessing " + uri); | |
return null; | |
} | |
} | |
private void getRawResponse(final Integer dealId) { | |
final String url = "https://api.westfield.io/deals/" + dealId | |
+ "?version=1"; | |
final String json = getUrlAsString(url); | |
System.out.println(gson.toJson(new JsonParser().parse(json))); | |
} | |
private Date adjustDateTimezone(final Date rawDate, final TimeZone tz) { | |
// the 'rawDate' was passed by the API as a 'local' date, | |
// and this date has been parsed as if it were in UTC, so it needs to be | |
// adjusted | |
// to the 'local' time indicated by the TimeZone param. | |
// get the 'raw' GMT-offset for the timezone (not accounting for DST) | |
final Long tzOffset = (tz.getRawOffset() * -1L); | |
int dstOffset; | |
// account for DST if it is in effect for this date | |
if (tz.inDaylightTime(rawDate)) { | |
dstOffset = tz.getDSTSavings(); | |
if (tzOffset < 0) { | |
dstOffset = dstOffset * -1; | |
} | |
} else { | |
dstOffset = 0; | |
} | |
// adjust the UTC date back to 'local' time, including DST offset | |
final Date adjustedDate = new Date(rawDate.getTime() | |
+ (tzOffset + dstOffset)); | |
return adjustedDate; | |
} | |
private void adjustDealTimezone(final DealInstance deal, final TimeZone tz) { | |
// Adjust and update the deal-dates | |
deal.setPublished_at(adjustDateTimezone(deal.getPublished_at(), tz)); | |
deal.setStarts_at(adjustDateTimezone(deal.getStarts_at(), tz)); | |
deal.setEnds_at(adjustDateTimezone(deal.getEnds_at(), tz)); | |
deal.setUpdated_at(adjustDateTimezone(deal.getUpdated_at(), tz)); | |
} | |
private void printAdjustedDates(final DealInstance deal, | |
final String tzString, final Date now) { | |
final SimpleDateFormat sdf = new SimpleDateFormat( | |
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); | |
final TimeZone tz = TimeZone.getTimeZone(tzString); | |
sdf.setTimeZone(tz); | |
adjustDealTimezone(deal, tz); | |
System.out.println("\n" + tzString); | |
System.out.println("offset: \t" + tz.getRawOffset()); | |
System.out.println("now: \t\t" + sdf.format(now) + " - " | |
+ now.getTime()); | |
System.out.println("published_at: \t" | |
+ sdf.format(deal.getPublished_at()) + " - " | |
+ deal.getPublished_at().getTime()); | |
System.out.println("starts_at: \t" + sdf.format(deal.getStarts_at()) | |
+ " - " + deal.getStarts_at().getTime()); | |
System.out.println("ends_at: \t" + sdf.format(deal.getEnds_at()) | |
+ " - " + deal.getEnds_at().getTime()); | |
System.out.println("updated_at: \t" + sdf.format(deal.getUpdated_at()) | |
+ " - " + deal.getUpdated_at().getTime()); | |
long endsIn = deal.getEnds_at().getTime() - now.getTime(); | |
final long oneSecond = TimeUnit.MILLISECONDS.convert(1, | |
TimeUnit.SECONDS); | |
final long oneMinute = TimeUnit.MILLISECONDS.convert(1, | |
TimeUnit.MINUTES); | |
final long oneHour = TimeUnit.MILLISECONDS.convert(1, TimeUnit.HOURS); | |
final long oneDay = TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS); | |
final long days = endsIn / oneDay; | |
endsIn = endsIn - (days * oneDay); | |
final long hours = endsIn / oneHour; | |
endsIn = endsIn - (hours * oneHour); | |
final long minutes = endsIn / oneMinute; | |
endsIn = endsIn - (minutes * oneMinute); | |
final long seconds = endsIn / oneSecond; | |
endsIn = endsIn - (seconds * oneSecond); | |
System.out.println("ends_after: \t" + days + " days, " + hours + ":" | |
+ minutes + ":" + seconds); | |
if ((now.after(deal.getPublished_at()) || now.equals(deal | |
.getPublished_at())) && (now.before(deal.getEnds_at()))) { | |
System.out.println("Should be showing now ... "); | |
} else { | |
System.out.println("Should not be showing now ... "); | |
} | |
} | |
public void dealDates() { | |
final DealResponse response = service.deal.getDeal(46369, null); | |
// getRawResponse(46369); | |
// System.out.println("\n\n" + gson.toJson(response.getData())); | |
final DealInstance deal = response.getData(); | |
final Date now = new Date(); | |
final DealInstance d = new DealInstance(); | |
d.setStarts_at(deal.getStarts_at()); | |
d.setPublished_at(deal.getPublished_at()); | |
d.setEnds_at(deal.getEnds_at()); | |
d.setUpdated_at(deal.getUpdated_at()); | |
printAdjustedDates(d, "America/Los_Angeles", now); | |
d.setStarts_at(deal.getStarts_at()); | |
d.setPublished_at(deal.getPublished_at()); | |
d.setEnds_at(deal.getEnds_at()); | |
d.setUpdated_at(deal.getUpdated_at()); | |
printAdjustedDates(d, "America/New_York", now); | |
d.setStarts_at(deal.getStarts_at()); | |
d.setPublished_at(deal.getPublished_at()); | |
d.setEnds_at(deal.getEnds_at()); | |
d.setUpdated_at(deal.getUpdated_at()); | |
printAdjustedDates(d, "Australia/NSW", now); | |
d.setStarts_at(deal.getStarts_at()); | |
d.setPublished_at(deal.getPublished_at()); | |
d.setEnds_at(deal.getEnds_at()); | |
d.setUpdated_at(deal.getUpdated_at()); | |
printAdjustedDates(d, "NZ", now); | |
d.setStarts_at(deal.getStarts_at()); | |
d.setPublished_at(deal.getPublished_at()); | |
d.setEnds_at(deal.getEnds_at()); | |
d.setUpdated_at(deal.getUpdated_at()); | |
printAdjustedDates(d, "Europe/London", now); | |
} | |
public static void main(final String[] args) throws Exception { | |
final DealDates dd = new DealDates(); | |
dd.dealDates(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment