lib/catissue/domain/storage_container.rb
def add_to_existing_container(storable)
      if storage_type.nil? then
        raise Jinx::ValidationError.new("Cannot add #{storable.qp} to #{qp} with missing storage type")
      end
      # the subcontainers in column, row sort order
      scs = subcontainers.sort { |sc1, sc2| sc1.position.coordinate <=> sc2.position.coordinate }
      logger.debug { "Looking for a #{self} subcontainer from among #{scs.pp_s} to place #{storable.qp}..." } unless scs.empty?
      # The first subcontainer that can hold the storable is preferred.
      sc = scs.detect do |sc|
        # Check for circular reference. This occurred as a result of the caTissue bug described
        # in CaTissue::Database#query_object. The work-around circumvents the bug for now, but
        # it doesn't hurt to check again.
        if identifier and sc.identifier == identifier then
          raise Jinx::ValidationError.new("#{self} has a circular containment reference to subcontainer #{sc}")
        end
        # No circular reference; add to subcontainer if possible.
        sc.add_to_existing_container(storable) if StorageContainer === sc
      end
      if sc then
        logger.debug { "#{self} subcontainer #{sc} stored #{storable.qp}." }
        self
      elsif can_hold_child?(storable) then
        logger.debug { "#{self} can hold #{storable.qp}." }
        add_local(storable)
      else
        logger.debug { "Neither #{self} of type #{storage_type.name} nor its subcontainers can hold #{storable.qp}." }
        nil
      end
    end
def add_to_existing_container(storable)
      if storage_type.nil? then
        raise Jinx::ValidationError.new("Cannot add #{storable.qp} to #{qp} with missing storage type")
      end
      # the subcontainers in column, row sort order
      scs = subcontainers.sort { |sc1, sc2| sc1.position.coordinate <=> sc2.position.coordinate }
      logger.debug { "Looking for a #{self} subcontainer from among #{scs.pp_s} to place #{storable.qp}..." } unless scs.empty?
      # The first subcontainer that can hold the storable is preferred.
      sc = scs.detect do |sc|
        # Check for circular reference. This occurred as a result of the caTissue bug described
        # in CaTissue::Database#query_object. The work-around circumvents the bug for now, but
        # it doesn't hurt to check again.
        if identifier and sc.identifier == identifier then
          raise Jinx::ValidationError.new("#{self} has a circular containment reference to subcontainer #{sc}")
        end
        # No circular reference; add to subcontainer if possible.
        sc.add_to_existing_container(storable) if StorageContainer === sc
      end
      if sc then
        logger.debug { "#{self} subcontainer #{sc} stored #{storable.qp}." }
        self
      elsif can_hold_child?(storable) then
        logger.debug { "#{self} can hold #{storable.qp}." }
        add_local(storable)
      else
        logger.debug { "Neither #{self} of type #{storage_type.name} nor its subcontainers can hold #{storable.qp}." }
        nil
      end
    end
def add_to_existing_container ( storable ) if storage_type . nil? then raise Jinx :: ValidationError . new ( "Cannot add #{storable.qp} to #{qp} with missing storage type" ) end # the subcontainers in column, row sort order scs = subcontainers . sort { | sc1 , sc2 | sc1 . position . coordinate <=> sc2 . position . coordinate } logger . debug { "Looking for a #{self} subcontainer from among #{scs.pp_s} to place #{storable.qp}..." } unless scs . empty? # The first subcontainer that can hold the storable is preferred. sc = scs . detect do | sc | # Check for circular reference. This occurred as a result of the caTissue bug described # in CaTissue::Database#query_object. The work-around circumvents the bug for now, but # it doesn't hurt to check again. if identifier and sc . identifier == identifier then raise Jinx :: ValidationError . new ( "#{self} has a circular containment reference to subcontainer #{sc}" ) end # No circular reference; add to subcontainer if possible. sc . add_to_existing_container ( storable ) if StorageContainer === sc end if sc then logger . debug { "#{self} subcontainer #{sc} stored #{storable.qp}." } self elsif can_hold_child? ( storable ) then logger . debug { "#{self} can hold #{storable.qp}." } add_local ( storable ) else logger . debug { "Neither #{self} of type #{storage_type.name} nor its subcontainers can hold #{storable.qp}." } nil end end
Adds the given storable to a container within this StorageContainer's hierarchy.

 @param @storable (see #add)
 @return [StorageContainer, nil] self if added, nil otherwise
 @raise [Jinx::ValidationError] if this container does not have a storage type, or if a circular
   containment reference is detected
Adds the given storable to a container within this StorageContainer s hierarchy .