package com.bitmonlab.osiris.commons.map.model.geojson;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.validation.constraints.NotNull;
//import org.springframework.data.mongodb.core.index.CompoundIndexes;
//import org.springframework.data.mongodb.core.index.CompoundIndex;
import org.springframework.data.annotation.Id;
/*@CompoundIndexes({
@CompoundIndex(name = "geometryindex", def= "{'geometry' : '2dsphere'}")
})*/
//@Named
public class Feature implements Comparable<Feature>{
@Id
private String id;
private final String type="Feature";
@NotNull
private Geometry geometry;
private Map<String,String> properties;
private List<Map<String,String>> propertiesRelations = new ArrayList<Map<String,String>>();
public Feature(Geometry geometry,Map<String,String> properties){
this.geometry=geometry;
this.properties=properties;
}
public Feature(){
}
public List<Map<String, String>> getPropertiesRelations() {
return propertiesRelations;
}
public void setPropertiesRelations(
List<Map<String, String>> propertiesRelations) {
if(propertiesRelations != null){
for(Map<String, String> property : propertiesRelations){
this.propertiesRelations.add(property);
}
}
}
public void setProperties(Map<String, String> properties) {
this.properties = properties;
}
public Map<String, String> getProperties() {
return properties;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getType() {
return type;
}
public Geometry getGeometry() {
return geometry;
}
public void setGeometry(Geometry geometry) {
this.geometry = geometry;
}
public void updateProperties(final List<Map<String,String>> newInheritedProperties) {
boolean exist = false;
for (Map<String,String> propertiesNews: newInheritedProperties) {
Iterator<Map<String, String>> it =this.propertiesRelations.iterator();
while (!exist && it.hasNext()) {
Map<String, String> propertiesFeature = it.next();
if (propertiesFeature.get("@id").equals(propertiesNews.get("@id"))) {
exist = true;
}
}
if (!exist) {
this.propertiesRelations.add(propertiesNews);
}
exist = false;
}
}
public List<Map<String, String>> getAllProperties() {
List<Map<String, String>> allProperties = new ArrayList<Map<String, String>>();
allProperties.add(this.properties);
if (propertiesRelations != null) {
for (Map<String, String> propertiesRelation: propertiesRelations) {
allProperties.add(propertiesRelation);
}
}
return allProperties;
}
public boolean searchProperty(String property) {
boolean found = false;
if(properties.containsKey(property)){
found = true;
}else if (propertiesRelations != null){
int j = 0;
while (j < propertiesRelations.size() && !found) {
Map<String,String> propertyRelation = propertiesRelations.get(j);
if(propertyRelation.containsKey(property)){
found = true;
}
j++;
}
}
return found;
}
public String getValueRelationProperties(String property){
String value=null;
for(Map<String,String> propertyRelation:propertiesRelations){
value=propertyRelation.get(property);
if(value!=null){
break;
}
}
return value;
}
@Override
public String toString() {
return "Feature [id=" + id + ", type=" + type + ", geometry="
+ geometry + ", properties=" + properties
+ ", propertiesRelations=" + propertiesRelations + "]";
}
public int compareTo(Feature f) {
return id.compareTo(f.getId());
}
}