Skip to content

Instantly share code, notes, and snippets.

@jreece1567
Created December 21, 2015 19:57
Show Gist options
  • Save jreece1567/84a3ec1866685c3df3e7 to your computer and use it in GitHub Desktop.
Save jreece1567/84a3ec1866685c3df3e7 to your computer and use it in GitHub Desktop.
/**
*
*/
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