/*
*
*/
package org.smartly.packages.mongo.impl.db.service;
import com.mongodb.DB;
import com.mongodb.DBObject;
import org.json.JSONObject;
import org.smartly.Smartly;
import org.smartly.commons.logging.Level;
import org.smartly.commons.logging.util.LoggingUtils;
import org.smartly.commons.network.api.yahoo.placefinder.YahooPlaceFinder;
import org.smartly.commons.network.iplocation.IPLocation;
import org.smartly.commons.network.iplocation.IPLocator;
import org.smartly.commons.util.ConversionUtils;
import org.smartly.commons.util.JsonWrapper;
import org.smartly.commons.util.StringUtils;
import org.smartly.packages.mongo.impl.AbstractMongoService;
import org.smartly.packages.mongo.impl.MongoDBConnectionFactory;
import org.smartly.packages.mongo.impl.StandardCodedException;
import org.smartly.packages.mongo.impl.db.entity.MongoAnalytics;
import org.smartly.packages.mongo.impl.db.entity.MongoCountry;
import org.smartly.packages.mongo.impl.db.service.tasks.analytics.AnalyticsData;
/**
* @author angelo.geminiani
*/
public class MongoAnalyticsService extends AbstractMongoService {
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
public static String YAHOO_APP_ID = (String)Smartly.getConfiguration().get("api.yahoo.appId");
public static final String DB_NAME = "analytics";
public static String COLLECTION_NAME = null;
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
public MongoAnalyticsService() throws StandardCodedException {
super(MongoDBConnectionFactory.getDB(DB_NAME),
collection(),
MongoDBConnectionFactory.getLanguages());
}
public MongoAnalyticsService(final DB db, final String[] langCodes) {
super(db, MongoCountry.COLLECTION, langCodes);
}
// ------------------------------------------------------------------------
// public
// ------------------------------------------------------------------------
@Override
public int upsert(final DBObject item) throws StandardCodedException {
return super.upsert(item);
}
public void insert(final AnalyticsData data) throws StandardCodedException {
final String targetid = data.getTargetId();
final DBObject item = new MongoAnalytics();
MongoAnalytics.setId(item, targetid);
MongoAnalytics.setUserId(item, data.getUserId());
MongoAnalytics.setLang(item, data.getUserLang());
MongoAnalytics.setIP(item, data.getUserIp());
MongoAnalytics.setUserAgent(item, data.getUserAgent());
MongoAnalytics.setScreen(item, data.getScreen());
MongoAnalytics.setLatitude(item, data.getLatitude());
MongoAnalytics.setLongitude(item, data.getLongitude());
MongoAnalytics.setAccuracy(item, data.getAccuracy());
MongoAnalytics.setAltitude(item, data.getAltitude());
// retrieve iplocation if needed, and street address
this.validateCoords(item);
super.insert(item);
}
// ------------------------------------------------------------------------
// p r i v a t e
// ------------------------------------------------------------------------
private void validateCoords(final DBObject item) {
if (null != item) {
// try to geolocate ip
if (MongoAnalytics.getLatitude(item) == 0) {
this.ipLocate(item);
}
// get Address
if (MongoAnalytics.getLatitude(item) > 0) {
if(StringUtils.hasText(YAHOO_APP_ID) && !YAHOO_APP_ID.equalsIgnoreCase("APP-ID")){
final YahooPlaceFinder ypf = new YahooPlaceFinder(YAHOO_APP_ID);
final JSONObject location = ypf.reverseGeocoding(MongoAnalytics.getLatitude(item),
MongoAnalytics.getLongitude(item));
if (null != location) {
this.addLocation(item, location);
}
}
}
}
}
private void ipLocate(final DBObject item) {
try {
if (StringUtils.hasText(MongoAnalytics.getIP(item))) {
final IPLocation location = IPLocator.getInstance().locate(MongoAnalytics.getIP(item));
if (null != location) {
MongoAnalytics.setLatitude(item, ConversionUtils.toDouble(location.getLatitude()));
MongoAnalytics.setLongitude(item, ConversionUtils.toDouble(location.getLongitude()));
}
}
} catch (Throwable t) {
}
}
/**
* Add location data to item
*
* @param item
* @param location {"quality":99,"latitude":"44.005531","longitude":"12.639030","offsetlat":"44.005531",
* "offsetlon":"12.639030","radius":500,"name":"44.00553135 12.63902965",
* "line1":"via Ortles, 5","line2":"47838 Riccione RN","line3":"","line4":"Italy","house":"5",
* "street":"via Ortles","xstreet":"","unittype":"","unit":"","postal":"47838","neighborhood":"",
* "city":"Riccione","county":"Rimini","state":"Emilia Romagna","country":"Italy","countrycode":"IT",
* "statecode":"","countycode":"RN","hash":"","woeid":12846205,"woetype":11,"uzip":"47838"}
*/
private void addLocation(final DBObject item, final JSONObject location) {
final JsonWrapper json = JsonWrapper.wrap(location);
final String street = json.optString("street"); // via Ortles
final String house = json.optString("house"); // 5
final String postal = json.optString("postal"); // 47838
final String city = json.optString("city"); // Riccione
final String county = json.optString("county"); // Rimini
final String state = json.optString("state"); // Emilia Romagna
final String country = json.optString("country"); // Italy
final String countrycode = json.optString("countrycode"); // IT
MongoAnalytics.setStreet(item, street);
MongoAnalytics.setHouse(item, house);
MongoAnalytics.setZip(item, postal);
MongoAnalytics.setCity(item, city);
MongoAnalytics.setCounty(item, county);
MongoAnalytics.setState(item, state);
MongoAnalytics.setCountryId(item, country);
MongoAnalytics.setCountryName(item, countrycode);
}
// ------------------------------------------------------------------------
// S T A T I C
// ------------------------------------------------------------------------
private static String collection() {
if (StringUtils.hasText(COLLECTION_NAME) && MongoDBConnectionFactory.hasDBConnection(DB_NAME)) {
return COLLECTION_NAME;
}
return MongoAnalytics.COLLECTION;
}
public static void insertNew(final AnalyticsData data) {
try {
final MongoAnalyticsService srvc = new MongoAnalyticsService();
srvc.insert(data);
} catch (Throwable t) {
LoggingUtils.getLogger(MongoAnalytics.class).log(Level.SEVERE, null, t);
}
}
}