All Downloads are FREE. Search and download functionalities are using the official Maven repository.

thredds.catalog.InvDatasetFcPoint Maven / Gradle / Ivy

Go to download

The NetCDF-Java Library is a Java interface to NetCDF files, as well as to many other types of scientific data formats.

The newest version!
package thredds.catalog;

import org.slf4j.Logger;
import thredds.featurecollection.FeatureCollectionConfig;
import thredds.featurecollection.FeatureCollectionType;
import thredds.inventory.CollectionUpdateType;
import ucar.nc2.Attribute;
import ucar.nc2.ft.FeatureDataset;
import ucar.nc2.ft.FeatureDatasetPoint;
import ucar.nc2.ft.point.PointDatasetImpl;
import ucar.nc2.ft.point.collection.CompositeDatasetFactory;
import ucar.nc2.ft.point.collection.UpdateableCollection;
import ucar.nc2.thredds.MetadataExtractor;
import ucar.nc2.thredds.MetadataExtractorAcdd;
import ucar.unidata.util.StringUtil2;

import java.io.IOException;
import java.net.URI;
import java.util.*;

/**
 * InvDataset Feature Collection for Point types.
 * Implement with CompositeDatasetFactory
 *
 * @author caron
 * @since Nov 20, 2010
 */
public class InvDatasetFcPoint extends InvDatasetFeatureCollection {
  static private final Logger logger = org.slf4j.LoggerFactory.getLogger(InvDatasetFcPoint.class);
  static private final String FC = "fc.cdmr";
  static private final InvService collectionService = new InvService("collectionService", ServiceType.COMPOUND.toString(), "", "", "");
  //static private final InvService fileService = new InvService("fileService", ServiceType.COMPOUND.toString(), "", "", "");

  // LOOK ignoring the configured services
  static {
    //collectionService.addService( InvService.cdmrfeature);
    collectionService.addService( InvService.ncss);
    
    //fileService.addService( InvService.opendap);
    //fileService.addService( InvService.cdmremote);
    //fileService.addService( InvService.fileServer);
  }

  private final FeatureDatasetPoint fd;  // LOOK this stays open
  private final Set wantDatasets;

  InvDatasetFcPoint(InvDatasetImpl parent, String name, String path, FeatureCollectionType fcType, FeatureCollectionConfig config) {
    super(parent, name, path, fcType, config);
    makeCollection();

    Formatter errlog = new Formatter();
    try {
      fd = (FeatureDatasetPoint) CompositeDatasetFactory.factory(name, fcType.getFeatureType(), datasetCollection, errlog);

    } catch (Exception e) {

      if (e.getCause() != null)
        throw new RuntimeException("Failed to create InvDatasetFcPoint, cause=", e.getCause());
      else
        throw new RuntimeException("Failed to create InvDatasetFcPoint", e);
    }

    state = new State(null);
    this.wantDatasets = config.pointConfig.datasets;
  }

  @Override
  public void finishConstruction() {
    super.finishConstruction();
    finish();

    ThreddsMetadata tmi = getLocalMetadataInheritable();

    // pull out ACDD metadata from feature collection and put into the catalog
    MetadataExtractorAcdd acdd = new MetadataExtractorAcdd( Attribute.makeMap(fd.getGlobalAttributes()), this, tmi);
    acdd.extract();
    finish();

    // spatial coverage
    if (fd.getBoundingBox() == null) {
      // pull out catalog BB, put into the feature collection. this will override ACDD
      thredds.catalog.ThreddsMetadata.GeospatialCoverage coverage = getGeospatialCoverage();
      if (coverage != null)
        ((PointDatasetImpl) fd).setBoundingBox(coverage.getBoundingBox()); // override in fd

    } else if (getGeospatialCoverage() == null) {
      tmi.setGeospatialCoverage( MetadataExtractor.extractGeospatial(fd));
    }

    tmi.addVariables(MetadataExtractor.extractVariables(fd));

    finish();
  }

  @Override
  public FeatureDataset getFeatureDataset() {
    return fd;
  }


  /* @Override
  public void update(CollectionManager.Force force) { // this may be called from a background thread
    // deal with the first call
    boolean firstTime;
    synchronized (lock) {
      firstTime = first;
    }
    if (firstTime) {
      try {
        checkState(); // this will initialize, no update needed
      } catch (IOException e) {
        logger.error("Fail to create/update collection on first time", e);
      }
      return;
    }

    // do the update in a local object
    State localState = new State(state);
    try {
      updateCollection(localState, force);
    } catch (Throwable e) {
      logger.error("Fail to create/update collection", e);
      return;
    }
    makeDatasetTop(localState);
    localState.lastInvChange = System.currentTimeMillis();

    // switch to live
    synchronized (lock) {
      state = localState;
    }
  } */

  @Override
  public void updateCollection(State localState, CollectionUpdateType force) {
    try {
      ((UpdateableCollection)fd).update();
    } catch (IOException e) {
      logger.error("update failed", e);
    }

    // time coverage = expect it may be changing
    if (fd.getCalendarDateRange() != null)
      localState.dateRange = fd.getCalendarDateRange();
    else if (getTimeCoverage() != null)
      localState.dateRange = getCalendarDateCoverage();
  }

  @Override
  public void updateProto() {
    // probably dont need this
  }

  /* called when a request comes in, see if everything is ready to go
  // in particular, state.datasets and state.scan
  @Override
  protected State checkState() throws IOException {

    synchronized (lock) {
      if (first) {
        firstInit();
        datasetCollection.scanIfNeeded(); //always fall through to updateCollection
        first = false;
      } else {
        if (!datasetCollection.scanIfNeeded()) // return is not needed
          return state;
      }

      // copy on write
      State localState = new State(state);
      makeDatasetTop(localState); // doesnt actually change i think
      update(CollectionManager.Force.test); // call update on the fd

      state = localState;
      return state;
    }
  }   */

  @Override
  public InvCatalogImpl makeCatalog(String match, String orgPath, URI catURI)  {
    logger.debug("FcPoint make catalog for " + match + " " + catURI);
    State localState = checkState();

    try {
      if ((match == null) || (match.length() == 0)) {
        InvCatalogImpl main = makeCatalogTop(catURI, localState);
        main.addService(collectionService);
        main.getDataset().getLocalMetadataInheritable().setServiceName(collectionService.getName());
        main.finish();
        return main;

      } else if (match.startsWith(FILES) && wantDatasets.contains(FeatureCollectionConfig.PointDatasetType.Files)) {
        return  makeCatalogFiles(catURI, localState, datasetCollection.getFilenames(), true);
      }

    } catch (Exception e) {
      logger.error("Error making catalog for " + path, e);
    }

    return null;
  }

  @Override
  protected void makeDatasetTop(State localState) {
    InvDatasetImpl top = new InvDatasetImpl(this);
    top.setParent(null);
    InvDatasetImpl parent = (InvDatasetImpl) this.getParent();
    if (parent != null)
      top.transferMetadata(parent, true); // make all inherited metadata local

    String id = getID();
    if (id == null) id = getPath();
    //top.setID(id);

    ThreddsMetadata tmi = top.getLocalMetadataInheritable();
    if (localState.dateRange != null) tmi.setTimeCoverage(localState.dateRange);

    if (wantDatasets.contains(FeatureCollectionConfig.PointDatasetType.cdmrFeature)) {

      InvDatasetImpl ds = new InvDatasetImpl(this, "Feature Collection");
      String name = getName() + "_" + FC;
      name = StringUtil2.replace(name, ' ', "_");
      ds.setUrlPath(this.path + "/" + name);
      ds.setID(id + "/" + name);
      ThreddsMetadata tm = ds.getLocalMetadata();
      ds.getLocalMetadataInheritable().setServiceName(collectionService.getName());
      ds.finish();
      top.addDataset(ds);
    }

    if (wantDatasets.contains(FeatureCollectionConfig.PointDatasetType.Files) && (topDirectory != null)) {
      InvCatalogRef filesCat = new InvCatalogRef(this, FILES, getCatalogHref(FILES));
      filesCat.finish();
      top.addDataset(filesCat);
    }

    localState.top = top;
    finish();
  }

  /*
  @Override
  public ucar.nc2.dt.grid.GridDataset getGridDataset(String matchPath) throws IOException {
    return null;
  }

  @Override
  public NetcdfDataset getNetcdfDataset(String matchPath) throws IOException {
    return null;
  }   */



}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy