def create(self, obj_id=None, request_id=None, **kwargs): """ Creates a new instance of the underlying type and returns an according wrapper object. The optional parameter ``obj_id`` is used as CoverageID/EOID and a UUID is generated automatically when omitted. If the ID was previously reserved by a specific ``request_id`` this parameter must be set. The other parameters depend on the actual coverage manager type and will be documented there. If the given ID is already in use, an :exc:`~.CoverageIdInUseError` exception is raised. If the ID is already reserved by another ``request_id``, an :exc:`~.CoverageIdReservedError` is raised. These exceptions are sub-classes of :exc:`~.CoverageIdError`. :param obj_id: the ID (CoverageID or EOID) of the object to be created :type obj_id: string :param request_id: an optional request ID for the acquisition of the CoverageID/EOID. :type request_id: string :param kwargs: the arguments :rtype: a wrapper of the created object """ id_mgr = CoverageIdManager() if obj_id is None: # generate a new ID for _ in range(3): new_id = self._generate_id() if id_mgr.available(new_id): obj_id = new_id break else: raise InternalError("Could not generate a unique identifier.") id_mgr.reserve(obj_id, request_id) try: coverage = self._create(obj_id, **kwargs) finally: id_mgr.release(obj_id, fail=True) return coverage
def _create_contained(self, container, data_sources): # TODO: make this more efficient by using updateModel() new_datasets = [] for data_source in data_sources: locations = data_source.detect() logger.info("Detected locations: %s"%[location.getPath() for location in locations]) for location in locations: md_location = self._guess_metadata_location(location) data_package = self._create_data_package(location, md_location) coverage_factory = System.getRegistry().bind( "resources.coverages.wrappers.EOCoverageFactory" ) filter_exprs = [System.getRegistry().getFromFactory( "resources.coverages.filters.CoverageExpressionFactory", { "op_name": "referenced_by", "operands": (location,) } )] existing_coverages = coverage_factory.find( impl_ids=["resources.coverages.wrappers.RectifiedDatasetWrapper", "resources.coverages.wrappers.ReferenceableDatasetWrapper"], filter_exprs=filter_exprs ) if len(existing_coverages) == 1: coverage = existing_coverages[0] logger.info("Add %s (%s) to %s."%( coverage.getCoverageId(), coverage.getType(), container.getType() ) ) container.addCoverage(existing_coverages[0]) new_datasets.append(existing_coverages[0]) else: eo_metadata = data_package.readEOMetadata() coverage_id_mgr = CoverageIdManager() coverage_id = coverage_id_mgr.reserve( eo_metadata.getEOID() ) try: range_type_name = self._get_contained_range_type_name( container, location ) if container.getType() == "eo.rect_stitched_mosaic": default_srid = container.getSRID() else: default_srid = None logger.info("Creating new coverage with ID %s." % coverage_id) # TODO: implement creation of ReferenceableDatasets, # RectifiedStitchedMosaics for DatasetSeriesManager new_dataset = self.rect_dataset_mgr.create( coverage_id, location=location, md_location=md_location, range_type_name=range_type_name, data_source=data_source, container=container, default_srid=default_srid ) logger.info("Done creating new coverage with ID %s." % coverage_id) new_datasets.append(new_dataset) finally: coverage_id_mgr.release(coverage_id) return new_datasets