コード例 #1
0
ファイル: base.py プロジェクト: v-manip/eoxserver
 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
コード例 #2
0
ファイル: base.py プロジェクト: v-manip/eoxserver
 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