/*
* uDig - User Friendly Desktop Internet GIS client
* http://udig.refractions.net
* (C) 2004, Refractions Research Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
*/
package net.refractions.udig.catalog.wfs.cache;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import net.refractions.udig.catalog.IGeoResource;
import net.refractions.udig.catalog.IGeoResourceInfo;
import net.refractions.udig.catalog.IService;
import net.refractions.udig.ui.graphics.Glyph;
import org.eclipse.core.runtime.IProgressMonitor;
import org.geotools.data.FeatureSource;
import org.geotools.data.FeatureStore;
import org.geotools.data.ResourceInfo;
import org.geotools.data.wfs.WFSDataStore;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
/**
* Access a feature type in a wfs.
*
* @author David Zwiers, Refractions Research
* @since 0.6
*/
public class WFScGeoResourceImpl extends IGeoResource {
WFScServiceImpl parent;
String typename = null;
private URL identifier;
@SuppressWarnings("unused")
private WFScGeoResourceImpl(){/*not for use*/}
/**
* Construct <code>WFSGeoResourceImpl</code>.
*
* @param parent
* @param typename
*/
public WFScGeoResourceImpl(WFScServiceImpl parent, String typename){
this.parent = parent;
this.typename = typename;
try {
identifier= new URL(parent.getIdentifier().toString()+"#"+typename); //$NON-NLS-1$
} catch (MalformedURLException e) {
identifier= parent.getIdentifier();
}
}
public URL getIdentifier() {
return identifier;
}
/*
* @see net.refractions.udig.catalog.IGeoResource#getStatus()
*/
public Status getStatus() {
return parent.getStatus();
}
/*
* @see net.refractions.udig.catalog.IGeoResource#getStatusMessage()
*/
public Throwable getMessage() {
return parent.getMessage();
}
/*
* Required adaptions:
* <ul>
* <li>IGeoResourceInfo.class
* <li>IService.class
* </ul>
* @see net.refractions.udig.catalog.IResolve#resolve(java.lang.Class, org.eclipse.core.runtime.IProgressMonitor)
*/
public <T> T resolve( Class<T> adaptee, IProgressMonitor monitor ) throws IOException {
if(adaptee == null)
return null;
// if(adaptee.isAssignableFrom(IService.class))
// return adaptee.cast( parent );
if(adaptee.isAssignableFrom(WFScDataStore.class))
return parent.resolve( adaptee, monitor );
if (adaptee.isAssignableFrom(IGeoResource.class))
return adaptee.cast( this );
if(adaptee.isAssignableFrom(IGeoResourceInfo.class))
return adaptee.cast( getInfo(monitor));
if(adaptee.isAssignableFrom(FeatureStore.class)){
FeatureSource<SimpleFeatureType, SimpleFeature> fs = parent.getDS(monitor).getFeatureSource(typename);
if(fs instanceof FeatureStore)
return adaptee.cast( fs);
if(adaptee.isAssignableFrom(FeatureSource.class))
return adaptee.cast( parent.getDS(monitor).getFeatureSource(typename));
}
return super.resolve(adaptee, monitor);
}
public IService service( IProgressMonitor monitor ) throws IOException {
return parent;
}
/*
* @see net.refractions.udig.catalog.IResolve#canResolve(java.lang.Class)
*/
public <T> boolean canResolve( Class<T> adaptee ) {
if(adaptee == null)
return false;
return (adaptee.isAssignableFrom(IGeoResourceInfo.class) ||
adaptee.isAssignableFrom(FeatureStore.class) ||
adaptee.isAssignableFrom(FeatureSource.class) ||
adaptee.isAssignableFrom(WFScDataStore.class) ||
adaptee.isAssignableFrom(IService.class) )||
super.canResolve(adaptee);
}
// private volatile IGeoResourceInfo info;
// public IGeoResourceInfo getInfo(IProgressMonitor monitor) throws IOException{
// if(info == null && getStatus()!=Status.BROKEN){
// parent.rLock.lock();
// try{
// if(info == null){
// info = new IGeoResourceWFSInfo();
// }
// }finally{
// parent.rLock.unlock();
// }
// }
// return info;
// }
class IGeoResourceWFSInfo extends IGeoResourceInfo {
CoordinateReferenceSystem crs = null;
IGeoResourceWFSInfo() throws IOException{
WFSDataStore ds = parent.getDS(null);
FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = ds.getFeatureSource(typename);
ResourceInfo resourceInfo = featureSource.getInfo();
SimpleFeatureType ft = ds.getSchema(typename);
if (resourceInfo != null){
bounds = resourceInfo.getBounds();
description = resourceInfo.getDescription();
title = resourceInfo.getTitle();
}else{
bounds = null;
description = ""; //$NON-NLS-1$
title = ""; //$NON-NLS-1$
}
crs = ft.getCoordinateReferenceSystem();
name = typename;
try {
schema = new URI( ft.getName().getNamespaceURI());
} catch (URISyntaxException e) {
schema = null;
}
keywords = new String[]{
"wfs", //$NON-NLS-1$
typename,
ft.getName().getNamespaceURI()
};
icon=Glyph.icon(ft);
}
/*
* @see net.refractions.udig.catalog.IGeoResourceInfo#getCRS()
*/
public CoordinateReferenceSystem getCRS() {
if(crs != null)
return crs;
return super.getCRS();
}
}
@Override
protected IGeoResourceInfo createInfo( IProgressMonitor monitor ) throws IOException {
if(info == null && getStatus()!=Status.BROKEN){
parent.rLock.lock();
try{
if(info == null){
info = new IGeoResourceWFSInfo();
}
}finally{
parent.rLock.unlock();
}
}
return info;
}
}