func (self *dispatcherimpl) perform_BucketOperation(context *ares.Context, operation ares.Operation, targetBucketId bucket.Id) ( ret ares.Return) { bucketId := targetBucketId if bucketId == nil || len(bucketId) == 0 { return &operations.GenericReturn{retcode.NewStatusError(retcode.ErrorClient, errors.New("Bucket ID is missing or invalid"))} } bucketType := self.typesRegistry.BucketType(bucketId.TypeId()) if bucketType == nil { return &operations.GenericReturn{retcode.NewStatusError(retcode.ErrorClient, errors.New(fmt.Sprintf("BucketType %v not found", bucketId.TypeId())))} } var err error // Special case for metadata if bucketId.IsMetadata() { // Extract and supply the original bucket ID to the metadata bucketId = bucketId.ExtractOriginalId() } metadataReader, err := self.metadata.TypedGetterSetter(bucketId) if err != nil { return &operations.GenericReturn{ retcode.NewStatusError(retcode.ErrorBucketIdNotFound, err)} } state := new(minos.OperationState) state.Operation = operation state.BucketId = bucketId putfowarderVar := new(putfowarder) putfowarderVar.metadataReader = metadataReader putfowarderVar.putReceiversIds, err = metadataReader.PutReceivers() putfowarderVar.context = *context putfowarderVar.forwardFunction = self.Perform state.PutForwarder = putfowarderVar state.MetadataGetterSetter = metadataReader state.NotificationReceiver = self.receiveNotification state.Context = context state.Dispatcher = self state.Locker = self.lock state.Files = self.files state.BucketType = self.typesRegistry.BucketType bucketReturn := bucketType.Perform(state) putfowarderVar.maybeDoPutForward(bucketReturn) return bucketReturn }