001: package net.refractions.udig.catalog.memory.internal;
002:
003: import java.io.IOException;
004: import java.net.MalformedURLException;
005: import java.net.URI;
006: import java.net.URL;
007:
008: import net.refractions.udig.catalog.CatalogPlugin;
009: import net.refractions.udig.catalog.IGeoResource;
010: import net.refractions.udig.catalog.IGeoResourceInfo;
011: import net.refractions.udig.catalog.IResolveChangeEvent;
012: import net.refractions.udig.catalog.IResolveDelta;
013: import net.refractions.udig.catalog.IService;
014: import net.refractions.udig.catalog.ITransientResolve;
015: import net.refractions.udig.catalog.internal.CatalogImpl;
016: import net.refractions.udig.catalog.internal.ResolveChangeEvent;
017: import net.refractions.udig.catalog.internal.ResolveDelta;
018:
019: import org.eclipse.core.runtime.IProgressMonitor;
020: import org.geotools.data.FeatureEvent;
021: import org.geotools.data.FeatureListener;
022: import org.geotools.data.FeatureSource;
023: import org.geotools.data.FeatureStore;
024: import org.geotools.feature.Feature;
025: import org.geotools.feature.FeatureIterator;
026: import org.geotools.feature.FeatureType;
027: import org.geotools.feature.GeometryAttributeType;
028: import org.geotools.geometry.jts.ReferencedEnvelope;
029: import org.geotools.referencing.crs.DefaultGeocentricCRS;
030: import org.geotools.referencing.crs.DefaultGeographicCRS;
031: import org.opengis.referencing.crs.CoordinateReferenceSystem;
032:
033: import com.vividsolutions.jts.geom.Envelope;
034:
035: public class MemoryGeoResourceImpl extends IGeoResource implements
036: ITransientResolve {
037:
038: /** parent service * */
039: private MemoryServiceImpl parent;
040:
041: /** feature type name * */
042: String type;
043:
044: /** info object * */
045: private volatile ScratchResourceInfo info;
046:
047: private volatile Status status;
048: private volatile Throwable message;
049:
050: public MemoryGeoResourceImpl(String type, MemoryServiceImpl parent) {
051: this .type = type;
052: this .parent = parent;
053: }
054:
055: @Override
056: public <T> T resolve(Class<T> adaptee, IProgressMonitor monitor)
057: throws IOException {
058: if (adaptee == null)
059: return null;
060: if (adaptee.isAssignableFrom(ITransientResolve.class)) {
061: return adaptee.cast(this );
062: }
063: if (adaptee.isAssignableFrom(IService.class))
064: return adaptee.cast(parent);
065: if (adaptee.isAssignableFrom(IGeoResource.class))
066: return adaptee.cast(this );
067: if (adaptee.isAssignableFrom(IGeoResourceInfo.class))
068: return adaptee.cast(getInfo(monitor));
069: if (adaptee.isAssignableFrom(FeatureStore.class))
070: return adaptee.cast(parent.getDS().getFeatureSource(type));
071: if (adaptee.isAssignableFrom(FeatureSource.class))
072: return adaptee.cast(parent.getDS().getFeatureSource(type));
073: if (adaptee.isAssignableFrom(FeatureType.class))
074: return adaptee.cast(parent.getDS().getSchema(type));
075:
076: return super .resolve(adaptee, monitor);
077: }
078:
079: public IService service(IProgressMonitor monitor)
080: throws IOException {
081: return parent;
082: }
083:
084: public <T> boolean canResolve(Class<T> adaptee) {
085: if (adaptee == null)
086: return false;
087:
088: return adaptee.isAssignableFrom(IGeoResourceInfo.class)
089: || adaptee.isAssignableFrom(FeatureStore.class)
090: || adaptee.isAssignableFrom(FeatureSource.class)
091: || adaptee.isAssignableFrom(IService.class)
092: || adaptee.isAssignableFrom(ITransientResolve.class)
093: || super .canResolve(adaptee);
094: }
095:
096: public Status getStatus() {
097: if (status == null)
098: return parent.getStatus();
099: return status;
100: }
101:
102: public Throwable getMessage() {
103: if (message == null)
104: return parent.getMessage();
105: return message;
106: }
107:
108: public URL getIdentifier() {
109: try {
110: return new URL(parent.getIdentifier().toString()
111: + "#" + type); //$NON-NLS-1$
112: } catch (MalformedURLException e) {
113: return parent.getIdentifier();
114: }
115: }
116:
117: @Override
118: public IGeoResourceInfo getInfo(IProgressMonitor monitor)
119: throws IOException {
120: if (info == null) {
121: parent.rLock.lock();
122: try {
123: if (info == null) {
124: info = new ScratchResourceInfo();
125: }
126: } finally {
127: parent.rLock.unlock();
128: }
129: }
130: return info;
131:
132: }
133:
134: class ScratchResourceInfo extends IGeoResourceInfo {
135: FeatureType ft = null;
136: FeatureSource source;
137:
138: ScratchResourceInfo() throws IOException {
139: try {
140: source = parent.getDS().getFeatureSource(type);
141: ft = source.getSchema();
142: } catch (Exception e) {
143: status = Status.BROKEN;
144: message = new Exception(
145: "Error obtaining the feature type: " + type).initCause(e); //$NON-NLS-1$
146: bounds = new ReferencedEnvelope(new Envelope(),
147: getCRS());
148: }
149:
150: keywords = new String[] { type,
151: ft.getNamespace().toString() };
152: }
153:
154: public CoordinateReferenceSystem getCRS() {
155: GeometryAttributeType defaultGeometry = ft
156: .getDefaultGeometry();
157: if (defaultGeometry != null)
158: return defaultGeometry.getCoordinateSystem();
159: return null;
160: }
161:
162: public String getName() {
163: return ft.getTypeName();
164: }
165:
166: public URI getSchema() {
167: return ft.getNamespace();
168: }
169:
170: public String getTitle() {
171: return ft.getTypeName();
172: }
173:
174: @Override
175: public ReferencedEnvelope getBounds() {
176: Envelope bounds;
177: try {
178: bounds = source.getBounds();
179: if (bounds == null)
180: return new ReferencedEnvelope(new Envelope(),
181: DefaultGeographicCRS.WGS84);
182: if (bounds instanceof ReferencedEnvelope)
183: return (ReferencedEnvelope) bounds;
184: return new ReferencedEnvelope(bounds, getCRS());
185: } catch (IOException e) {
186: return new ReferencedEnvelope(new Envelope(),
187: DefaultGeographicCRS.WGS84);
188: }
189: }
190:
191: }
192: }
|