Java tutorial
/** * Copyright 2012 the original author or authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.googlecode.phisix.api.parser; import java.io.Reader; import java.lang.reflect.Type; import java.text.ParseException; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.TimeZone; import org.apache.commons.lang3.time.DateParser; import org.apache.commons.lang3.time.FastDateFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import com.googlecode.phisix.api.model.Stock; import com.googlecode.phisix.api.model.Stocks; /** * {@link Parser} that delegates to a {@link JsonParser}. * * @author Edge Dalmacio * */ public class GsonAwareParser implements Parser<Reader, Stocks> { private static final Logger LOGGER = LoggerFactory.getLogger(GsonAwareParser.class); private static final TimeZone ASIA_MANILA = TimeZone.getTimeZone("Asia/Manila"); private static final DateParser dateParser = FastDateFormat.getInstance("MM/dd/yyyy hh:mm a", ASIA_MANILA); private final JsonParser jsonParser; private final Gson gson; public GsonAwareParser() { jsonParser = new JsonParser(); Type type = new TypeToken<Collection<Stock>>() { }.getType(); gson = new GsonBuilder().registerTypeAdapter(type, new PhisixDeserializer()).create(); } @Override public Stocks parse(Reader source) { Stocks stocks = new Stocks(); JsonArray jsonArray = jsonParser.parse(source).getAsJsonArray(); Type type = new TypeToken<Collection<Stock>>() { }.getType(); boolean isFirst = true; for (JsonElement jsonElement : jsonArray) { if (isFirst) { isFirst = !isFirst; stocks.setAsOf(parseAsOfDate(jsonElement.getAsJsonObject())); continue; } Stock stock = gson.fromJson(jsonElement, type); if (stock != null) { stocks.getStocks().add(stock); } } return stocks; } protected Calendar parseAsOfDate(JsonObject jsonObject) { String asOfDate = jsonObject.get("securityAlias").getAsString(); Calendar calendar = null; try { Date date = dateParser.parse(asOfDate); calendar = Calendar.getInstance(ASIA_MANILA); calendar.setTime(date); } catch (ParseException e) { if (LOGGER.isWarnEnabled()) { LOGGER.warn(e.getMessage(), e); } } return calendar; } }