package org.osmdroid.tileprovider.tilesource.bing.imagerymetadata;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* ImageryMetaData storage. Class used to parse and store useful ImageryMetaData fields.
*
*/
public class ImageryMetaDataResource {
// Useful fields
private final static String IMAGE_WIDTH = "imageWidth";
private final static String IMAGE_HEIGHT = "imageHeight";
private final static String IMAGE_URL = "imageUrl";
private final static String IMAGE_URL_SUBDOMAINS = "imageUrlSubdomains";
private final static String ZOOM_MIN = "ZoomMin";
private final static String ZOOM_MAX = "ZoomMax";
/** image height in pixels (256 as default value) **/
public int m_imageHeight=256;
/** image width in pixels (256 as default value) **/
public int m_imageWidth=256;
/** image url pattern **/
public String m_imageUrl;
/** list of available sub domains. Can be null. **/
public String[] m_imageUrlSubdomains;
/** maximum zoom level (22 as default value for BingMap) **/
public int m_zoomMax=22;
/** minimum zoom level (1 as default value for BingMap) **/
public int m_zoomMin=1;
/** whether this imagery has been initialised */
public boolean m_isInitialised = false;
// counter used to manage next available sub domain
private int m_subdomainsCounter = 0;
/**
* Get an instance with default values.
* @return
*/
static public ImageryMetaDataResource getDefaultInstance() {
return new ImageryMetaDataResource();
}
/**
* Parse a JSON string containing resource field of a ImageryMetaData response
* @param a_jsonObject the JSON content string
* @return ImageryMetaDataResource object containing parsed information
* @throws Exception
*/
static public ImageryMetaDataResource getInstanceFromJSON(final JSONObject a_jsonObject) throws Exception
{
final ImageryMetaDataResource result = new ImageryMetaDataResource();
if(a_jsonObject==null) {
throw new Exception("JSON to parse is null");
}
if(a_jsonObject.has(IMAGE_HEIGHT)) {
result.m_imageHeight = a_jsonObject.getInt(IMAGE_HEIGHT);
}
if(a_jsonObject.has(IMAGE_WIDTH)) {
result.m_imageWidth = a_jsonObject.getInt(IMAGE_WIDTH);
}
if(a_jsonObject.has(ZOOM_MIN)) {
result.m_zoomMin = a_jsonObject.getInt(ZOOM_MIN);
}
if(a_jsonObject.has(ZOOM_MAX)) {
result.m_zoomMax = a_jsonObject.getInt(ZOOM_MAX);
}
result.m_imageUrl = a_jsonObject.getString(IMAGE_URL);
if(result.m_imageUrl!=null && result.m_imageUrl.matches(".*?\\{.*?\\}.*?")) {
result.m_imageUrl = result.m_imageUrl.replaceAll("\\{.*?\\}", "%s");
}
final JSONArray subdomains = a_jsonObject.getJSONArray(IMAGE_URL_SUBDOMAINS);
if(subdomains!=null && subdomains.length()>=1)
{
result.m_imageUrlSubdomains = new String[subdomains.length()];
for(int i=0;i<subdomains.length();i++)
{
result.m_imageUrlSubdomains[i] = subdomains.getString(i);
}
}
result.m_isInitialised = true;
return result;
}
/**
* When several subdomains are available, get subdomain pointed by internal cycle counter on subdomains and increment this counter
* @return the subdomain string associated to current counter value.
*/
public synchronized String getSubDomain()
{
if(m_imageUrlSubdomains==null || m_imageUrlSubdomains.length<=0) {
return null;
}
final String result = m_imageUrlSubdomains[m_subdomainsCounter];
if(m_subdomainsCounter<m_imageUrlSubdomains.length-1) {
m_subdomainsCounter++;
} else {
m_subdomainsCounter=0;
}
return result;
}
}