package com.bitmonlab.osiris.imports.map.dao.impl; import java.util.Collection; import java.util.List; import javax.inject.Inject; import javax.inject.Named; import org.joda.time.DateTime; import org.joda.time.Interval; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.mongodb.UncategorizedMongoDbException; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.BasicQuery; import com.bitmonlab.osiris.commons.map.model.geojson.Feature; import com.bitmonlab.osiris.commons.map.model.imports.LockImport; import com.bitmonlab.osiris.imports.map.dao.api.ImportRepositoryCustom; import com.bitmonlab.osiris.imports.map.exceptions.QueryException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.DBObject; @Named public class ImportRepositoryCustomImpl implements ImportRepositoryCustom { @Inject @Named("mongoTemplate") private MongoTemplate mongoTemplate; private final static String collectionPrefixMap = "map_app_"; private final String collectionLock = "lock_import_process"; private Logger log = LoggerFactory.getLogger(ImportRepositoryCustomImpl.class); @Override public String saveGeoJson(String appIdentifier, Collection<Feature> featureCollection){ String collectionNameMap = collectionPrefixMap + appIdentifier; createCollection(collectionNameMap); String jsonStr = ""; String jsonFeature =""; ObjectMapper mapper=new ObjectMapper(); ; for(Feature feature: featureCollection){ if (feature.getGeometry() != null) { try{ mongoTemplate.save(feature, collectionNameMap); StringBuilder stringBuilder = new StringBuilder(); jsonFeature = mapper.writeValueAsString(feature); jsonStr = stringBuilder.append(jsonStr).append(jsonFeature).append("\n").toString(); } catch(UncategorizedMongoDbException exception){ //throw new MongoGeospatialException(); log.error("---> Bad Mongo geometry collection Map: " + collectionNameMap); log.error("---> Bad Mongo geometry feature ID: " + feature.getId()); try { log.error("---> Bad Mongo geometry feature: " + mapper.writeValueAsString(feature)); } catch (JsonProcessingException e) { log.error("---> Bad Mongo geometry feature and Bad Json mapper: " + feature.getId()); continue; } continue; } catch(JsonProcessingException exception){ log.error("---> Bad Json mapper collection Map: " + collectionNameMap); log.error("---> Bad Json mapper feature ID: " + feature.getId()); //throw new JsonMapperFromFeatureException(); continue; } } } return jsonStr; } private void createCollection(String collectionName){ if(mongoTemplate.collectionExists(collectionName)){ mongoTemplate.dropCollection(collectionName); mongoTemplate.createCollection(collectionName); }else{ mongoTemplate.createCollection(collectionName); } DBCollection dbCollection = mongoTemplate.getCollection(collectionName); DBObject obj = new BasicDBObject(); obj.put("geometry", "2dsphere"); // DBObject objoptions = new BasicDBObject(); // objoptions.put("2dsphereIndexVersion", 1); dbCollection.ensureIndex(obj/*, objoptions*/); dbCollection.resetIndexCache(); } public void lockImportProcess(String appIdentifier){ if(!mongoTemplate.collectionExists(collectionLock)){ mongoTemplate.createCollection(collectionLock); } LockImport lockImport = new LockImport(); lockImport.setAppIdentifier(appIdentifier); lockImport.setTimeStamp(DateTime.now().toString()); mongoTemplate.save(lockImport, collectionLock); } public boolean isImportProcessLocked(String appIdentifier) throws QueryException{ boolean ret = false; BasicQuery basicquery; try{ basicquery = new BasicQuery("{ '_id':'" + appIdentifier + "'}"); }catch(Exception e) { throw new QueryException(); } List<LockImport> lockImportList = mongoTemplate.find(basicquery, LockImport.class, collectionLock); if(!lockImportList.isEmpty()){ ret = true; LockImport lockImport = lockImportList.get(0); DateTime dateLockImport = new DateTime(lockImport.getTimeStamp()); DateTime dateNow = new DateTime(); Interval interval = new Interval(dateLockImport, dateNow); if (interval.toDurationMillis() > 3600000){ lockImportProcess(appIdentifier); ret = false; } } return ret; } public void deleteLockImportProcess(String appIdentifier) throws QueryException{ BasicQuery basicquery; try{ basicquery = new BasicQuery("{ '_id':'" + appIdentifier + "'}"); }catch(Exception e) { throw new QueryException(); } if(mongoTemplate.collectionExists(collectionLock)){ mongoTemplate.remove(basicquery, collectionLock); } } }