package net.refractions.udig.georss;
import java.io.IOException;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import net.refractions.udig.catalog.CatalogPlugin;
import net.refractions.udig.catalog.IResolve;
import net.refractions.udig.catalog.IService;
import net.refractions.udig.catalog.ui.UDIGConnectionFactory;
public class GeoRSSConnectionFactory extends UDIGConnectionFactory {
public boolean canProcess(Object context) {
if (context instanceof IResolve){
IResolve resolve = (IResolve)context;
return resolve.canResolve(GeoRSSDataStore.class);
}
return toCapabilitiesURL(context)!=null;
}
public Map<String, Serializable> createConnectionParameters(Object data) {
if (data == null)
return null;
if(data instanceof GeoRSSService){
GeoRSSService georssService = (GeoRSSService) data;
return georssService.getConnectionParams();
}
URL url = toCapabilitiesURL(data);
if (url == null){
url = CatalogPlugin.locateURL(data);
}
if (url!= null){
List <IResolve> list = CatalogPlugin.getDefault().getLocalCatalog().find(url, null);
for (IResolve resolve : list){
Map params = createParams(resolve);
if(!params.isEmpty())
return params;
}return createParams(url);
}
return Collections.emptyMap();
}
public Map<String, Serializable> createParams(IResolve handle) {
if(handle instanceof GeoRSSService){
GeoRSSService georssService = (GeoRSSService)handle;
return georssService.getConnectionParams();
}
else if(handle instanceof GeoRSSGeoResource){
GeoRSSGeoResource layer = (GeoRSSGeoResource) handle;
GeoRSSService georssService;
try {
georssService= (GeoRSSService) layer.parent(null);
return georssService.getConnectionParams();
}catch (IOException e){
checkedURL(layer.getIdentifier());
}
}
else if(handle.canResolve(GeoRSSDataStore.class)){
return createParams(handle.getIdentifier());
}
return Collections.emptyMap();
}
public Map<String, Serializable> createParams(URL url) {
GeoRSSServiceExtension factory = new GeoRSSServiceExtension();
Map params = factory.createParams(url);
if(params!= null)
return params;
return params;
}
@Override
public URL createConnectionURL(Object context) {
// TODO Auto-generated method stub
return null;
}
static URL toCapabilitiesURL(Object data) {
if(data instanceof IResolve){
return toCapabilitiesURL((IResolve)data);
}
else if (data instanceof URL){
return toCapabilitiesURL((URL)data);
}
else if(CatalogPlugin.locateURL(data)!=null){
return toCapabilitiesURL(CatalogPlugin.locateURL(data));
}
else {
return null;
}
}
static URL toCapabilitiesURL (IResolve resolve){
if (resolve instanceof IService){
return toCapabilitiesURL((IService) resolve);
}
return toCapabilitiesURL(resolve.getIdentifier());
}
static URL toCapabilitiesURL(IService resolve){
if (resolve instanceof GeoRSSService){
return toCapabilitiesURL((GeoRSSService) resolve);
}
return toCapabilitiesURL(resolve.getIdentifier());
}
static URL toCapabilitiesURL(GeoRSSService georssService){
return georssService.getIdentifier();
}
static URL toCapabilitiesURL( URL url ){
if (url == null) return null;
String protocol = (url.getProtocol() != null ) ? url.getProtocol().toLowerCase()
: null;
if( !"http".equals(protocol) && !"https".equals(protocol)){
return null;
}
return null;
}
public static final URL checkedURL( URL url ){
String check = url.toExternalForm();
int hash = check.indexOf('#');
if ( hash == -1 ){
return url;
}
try {
return new URL( check.substring(0, hash ));
} catch (MalformedURLException e) {
return null;
}
}
}