/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.usergrid.persistence.model.entity;
import com.google.common.base.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
/**
* Core persistence Entity Map structure to persist to
*/
public class EntityMap extends HashMap<String,Object> {
private static final Logger logger = LoggerFactory.getLogger( EntityMap.class );
private static EntityToMapConverter entityToMapConverter = new EntityToMapConverter();
public EntityMap(){
super();
}
public static Optional<EntityMap> fromEntity(Optional<Entity> entity) {
if(entity.isPresent()){
EntityMap map = fromEntity(entity.get());
return Optional.fromNullable(map);
}else{
return Optional.absent();
}
}
public static EntityMap fromEntity(Entity entity) {
EntityMap map = entityToMapConverter.toMap(entity);
return map;
}
/**
* Return true if the value is a location field which contains valid values for latitude and longitude
* @param fieldValue
* @return
*/
public static boolean isLocationField(Map<String, ?> fieldValue) {
//short circuit since valid location objects contain only 2 properties (latitude and longitude)
if (fieldValue.size() != 2) {
return false;
}
// we need to make sure that latitude and longitude are numbers or strings that can be parsed as a number
if (fieldValue.containsKey(EntityToMapConverter.LAT) && fieldValue.containsKey(EntityToMapConverter.LON)){
for(Map.Entry<String,?> value : fieldValue.entrySet()){
if(!(value.getValue() instanceof Number) && !isDouble(String.valueOf(value.getValue()))){
if(logger.isDebugEnabled()){
logger.debug("Field [{}] with value [{}] is not a valid geo coordinate",
value.getKey(),
value.getValue()
);
}
return false;
}
}
return true;
}
return false;
}
public static boolean isDouble(String s){
try{
Double.valueOf(s);
return true;
}catch (NumberFormatException e){
return false;
}
}
}