/*
* Copyright 2012 Esri.
*
* 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.esri.gpt.control.georss;
import com.esri.gpt.catalog.discovery.DiscoveredRecord;
import com.esri.gpt.catalog.discovery.PropertyMeanings;
import com.esri.gpt.catalog.discovery.Returnable;
import com.esri.gpt.catalog.schema.Meaning;
import com.esri.gpt.catalog.search.ResourceIdentifier;
import com.esri.gpt.catalog.search.ResourceLinks;
import com.esri.gpt.framework.geometry.Envelope;
import com.esri.gpt.framework.util.Val;
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Pattern;
import org.apache.lucene.document.DateTools;
/**
* Discovered record adapter.
*/
public class DiscoveredRecordAdapter implements IFeedRecord {
private Map<String,Map<String,IFeedAttribute>> collection = new HashMap<String, Map<String, IFeedAttribute>>();
private HashMap<String,Object[]> values = new HashMap<String, Object[]>();
private ResourceLinks resourceLinks = new ResourceLinks();
private ResourceIdentifier resourceIdentifier;
public DiscoveredRecordAdapter(ResourceIdentifier resourceIdentifier, DiscoveredRecord record) {
this.resourceIdentifier = resourceIdentifier;
for (Returnable ret: record.getFields()) {
this.values.put(ret.getMeaning().getName(), ret.getValues());
}
}
@Override
public long getObjectId() {
Map<String, IFeedAttribute> data = getData(IFeedRecord.STD_COLLECTION_CATALOG);
if (data==null) return -1;
IFeedAttribute id = data.get("ID");
if (id==null) return -1;
Object value = id.getValue();
if (!(value instanceof Number)) return -1;
return ((Number)value).longValue();
}
@Override
public String getUuid() {
return select(PropertyMeanings.NAME_UUID);
}
@Override
public String getTitle() {
return select(Meaning.MEANINGTYPE_TITLE);
}
@Override
public Date getModfiedDate() {
try {
return new Date(DateTools.stringToTime(select(PropertyMeanings.NAME_DATEMODIFIED)));
} catch (ParseException ex) {
return new Date();
}
}
@Override
public String getAbstract() {
String abstr = select(Meaning.MEANINGTYPE_ABSTRACT);
abstr = abstr.replaceAll("\\\n", " ");
// if (abstr.length()>253) {
// abstr = abstr.substring(0, 252) + "...";
// }
return abstr;
}
@Override
public Envelope getEnvelope() {
Object[] geoObjs = this.values.get("geometry");
if (geoObjs!=null && geoObjs.length==1 && geoObjs[0] instanceof Envelope) {
return (Envelope) geoObjs[0];
}
String sWest = select(Meaning.MEANINGTYPE_ENVELOPE_WEST);
String sEast = select(Meaning.MEANINGTYPE_ENVELOPE_EAST);
String sSouth = select(Meaning.MEANINGTYPE_ENVELOPE_SOUTH);
String sNorth = select(Meaning.MEANINGTYPE_ENVELOPE_NORTH);
return new Envelope(Val.chkDbl(sWest, -180), Val.chkDbl(sSouth, -90), Val.chkDbl(sEast, 180), Val.chkDbl(sNorth, 90));
}
@Override
public ResourceLinks getResourceLinks() {
return resourceLinks;
}
@Override
public String getContentType() {
return select(Meaning.MEANINGTYPE_CONTENTTYPE,"\\p{Alpha}+");
}
@Override
public String getResourceUrl() {
return select(Meaning.MEANINGTYPE_RESOURCE_URL);
}
@Override
public String getViewMetadataUrl() {
return select(Meaning.MEANINGTYPE_WEBSITE_URL);
}
@Override
public String getFileIdentifier() {
return select(Meaning.MEANINGTYPE_FILEIDENTIFIER);
}
@Override
public Map<String,IFeedAttribute> getData(String collection) {
Map<String,IFeedAttribute> data = this.collection.get(collection);
if (data==null) {
data = new TreeMap<String, IFeedAttribute>(String.CASE_INSENSITIVE_ORDER);
this.collection.put(collection, data);
}
return data;
}
@Override
public String getServiceType() {
String serviceType = select(Meaning.MEANINGTYPE_RESOURCE_TYPE);
if (serviceType.isEmpty()) {
serviceType = resourceIdentifier.guessServiceTypeFromUrl(getResourceUrl());
}
return serviceType;
}
@Override
public String getService() {
return select(Meaning.MEANINGTYPE_RESOURCE_URL);
}
private String select(String meaning, String pattern) {
Object [] oArr = values.get(meaning);
pattern = Val.chkStr(pattern);
if (oArr!=null) {
for (Object obj : oArr) {
String str = obj.toString();
if (pattern.isEmpty() || str.matches(pattern)) {
return str;
}
}
}
return "";
}
private String select(String meaning, Pattern pattern) {
Object [] oArr = values.get(meaning);
if (oArr!=null) {
for (Object obj : oArr) {
String str = obj.toString();
if (pattern==null || pattern.matcher(meaning).matches()) {
return str;
}
}
}
return "";
}
private String select(String meaning) {
return select(meaning,"");
}
@Override
public String getAdditional() {
// TODO Auto-generated method stub
return select("additional");
}
}