Package org.locationtech.udig.catalog.teradata

Source Code of org.locationtech.udig.catalog.teradata.TeradataGeoResource

/* uDig - User Friendly Desktop Internet GIS client
* http://udig.refractions.net
* (C) 2011, Refractions Research Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* (http://www.eclipse.org/legal/epl-v10.html), and the Refractions BSD
* License v1.0 (http://udig.refractions.net/files/bsd3-v10.html).
*/
package org.locationtech.udig.catalog.teradata;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.Connection;

import org.locationtech.udig.catalog.IGeoResource;
import org.locationtech.udig.catalog.IGeoResourceInfo;
import org.locationtech.udig.catalog.IResolve;
import org.locationtech.udig.catalog.IService;
import org.locationtech.udig.catalog.service.database.TableDescriptor;
import org.locationtech.udig.core.internal.CorePlugin;

import org.eclipse.core.runtime.IProgressMonitor;
import org.geotools.data.DataStore;
import org.geotools.data.FeatureSource;
import org.geotools.data.FeatureStore;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.data.simple.SimpleFeatureStore;
import org.geotools.jdbc.JDBCDataStore;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;

/**
* A GeoResource implementation for {@link TeradataSchemaFolder}. Resolves to a
* Featurestore
*
* @author Jesse Eichar, Refractions Research
* @since 1,2
*/
public class TeradataGeoResource extends IGeoResource {
  final String typename;
  private volatile Status status;
  private volatile Throwable message;
  private final URL identifier;
  private Boolean readOnly = null; // we won't know until we try
  private TeradataService parent;
  final TableDescriptor desc;

  public TeradataGeoResource(TeradataService service, TableDescriptor desc) {
    this.service = this.parent = service;
    this.desc = desc;
    this.typename = desc.name;
    try {
      URL identifier2 = service.getIdentifier();
      identifier = new URL(identifier2, identifier2.toExternalForm()
          + "#" + typename, CorePlugin.RELAXED_HANDLER);
    } catch (MalformedURLException e) {
      throw new IllegalArgumentException(
          "The service URL must not contain a #", e);
    }
  }

  public URL getIdentifier() {
    return identifier;
  }

  @Override
  public IResolve parent(IProgressMonitor monitor) throws IOException {
    return service;
  }

  /*
   * @see org.locationtech.udig.catalog.IGeoResource#getStatus()
   */
  public Status getStatus() {
    if (status != null)
      return status;
    return service.getStatus();
  }

  /*
   * @see org.locationtech.udig.catalog.IGeoResource#getStatusMessage()
   */
  public Throwable getMessage() {
    if (message != null)
      return message;
    return service.getMessage();
  }

  /*
   * Required adaptions: <ul> <li>IGeoResourceInfo.class <li>IService.class
   * </ul>
   *
   * @see org.locationtech.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(IGeoResourceInfo.class)) {
      return adaptee.cast(createInfo(monitor));
    }
    if (adaptee.isAssignableFrom(IGeoResource.class)) {
      return adaptee.cast(this);
    }

    JDBCDataStore dataStore = parent.getDataStore();
    if (adaptee.isAssignableFrom(DataStore.class)) {
      return adaptee.cast(dataStore);
    }
    if (adaptee.isAssignableFrom(SimpleFeatureStore.class)) {
      FeatureSource<SimpleFeatureType, SimpleFeature> fs = dataStore
          .getFeatureSource(typename);
      if (fs instanceof FeatureStore) {
        readOnly = false;
        return adaptee.cast(fs);
      } else {
        readOnly = true;
      }
      if (adaptee.isAssignableFrom(SimpleFeatureSource.class)) {
        return adaptee.cast(dataStore.getFeatureSource(typename));
      }
    }
    if (adaptee.isAssignableFrom(Connection.class)) {
      return service.resolve(adaptee, monitor);
    }

    return super.resolve(adaptee, monitor);
  }

  /*
   * @see org.locationtech.udig.catalog.IResolve#canResolve(java.lang.Class)
   */
  public <T> boolean canResolve(Class<T> adaptee) {
    if (adaptee == null) {
      return false;
    }
    boolean isFeatureStore = adaptee.isAssignableFrom(SimpleFeatureStore.class)
        && (readOnly == null || readOnly == false);
    boolean isFeatureSource = adaptee.isAssignableFrom(SimpleFeatureSource.class);
    boolean isGeoResource = adaptee
        .isAssignableFrom(IGeoResourceInfo.class);
    boolean isIService = adaptee.isAssignableFrom(IService.class);
    boolean isConnection = adaptee.isAssignableFrom(Connection.class);
    return (isGeoResource || isFeatureStore || isFeatureSource || isIService)
        || isConnection || super.canResolve(adaptee);
  }

  @Override
  protected IGeoResourceInfo createInfo(IProgressMonitor monitor)
      throws IOException {
    try {
      return new TeradataResourceInfo(this);
    } catch (Exception e) {
      Activator.log("Error creating a TeradataInfo object", e);
      return INFO_UNAVAILABLE;
    }
  }

  /**
   * returns the schema of the GeoResource
   *
   * @return the schema of the GeoResource
   * @throws IOException
   */
  public SimpleFeatureType getSchema() throws IOException {
    return parent.getDataStore().getSchema(typename);
  }

  /**
   * Sets the status and error message of this resource.
   *
   * @param status
   *            the new status. Cannot be null.
   * @param message
   *            the new message. May be null.
   */
  public void setStatus(Status status, Throwable message) {
    this.status = status;
    this.message = message;
  }

}
TOP

Related Classes of org.locationtech.udig.catalog.teradata.TeradataGeoResource

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.