diff options
Diffstat (limited to 'app/services/zip_service.rb')
| -rw-r--r-- | app/services/zip_service.rb | 31 | 
1 files changed, 23 insertions, 8 deletions
| diff --git a/app/services/zip_service.rb b/app/services/zip_service.rb index 7a4bdad1b..7166e6448 100644 --- a/app/services/zip_service.rb +++ b/app/services/zip_service.rb @@ -1,12 +1,16 @@  class ZipService -  class Subdir < Struct.new(:name, :stream, :spurious) +  class Subdir < Struct.new(:name, :stream, :spurious, :foreign_lines) +    def ok? +      foreign_lines.empty? && spurious.empty? +    end    end -  attr_reader :current_key, :current_output, :current_spurious, :yielder +  attr_reader :allowed_lines, :current_key, :foreign_lines, :current_output, :current_spurious, :yielder -  def initialize data +  def initialize data, allowed_lines      @zip_data       = StringIO.new(data) +    @allowed_lines  = allowed_lines      @current_key    = nil      @current_output = nil    end @@ -35,7 +39,8 @@ class ZipService    end    def add_to_current_output entry -    return if is_spurious! entry.name +    return if is_spurious!(entry.name) || is_foreign_line!(entry.name) +      current_output.put_next_entry entry.name      write_to_current_output entry.get_input_stream    end @@ -52,20 +57,22 @@ class ZipService          current_key,          # Second part of the solution, yield the closed stream          current_output.close_buffer, -        current_spurious) +        current_spurious.to_a, +        foreign_lines)      end    end    def open_new_output entry_key      @current_key    = entry_key      # First piece of the solution, use internal way to create a Zip::OutputStream -    @current_output = Zip::OutputStream.new(StringIO.new(''), true, nil) -    @current_spurious = [] +    @current_output   = Zip::OutputStream.new(StringIO.new(''), true, nil) +    @current_spurious = Set.new +    @foreign_lines    = []    end    def entry_key entry      # last dir name File.dirname.split("/").last -    entry.name.split('/', -1)[-2] +    entry.name.split('/').first    end    def is_spurious! entry_name @@ -75,4 +82,12 @@ class ZipService      current_spurious << segments.second      return true    end + +  def is_foreign_line! entry_name +    STIF::NetexFile::Frame.get_short_id(entry_name).tap do | line_object_id | +      return nil unless line_object_id +      return nil if line_object_id.in? allowed_lines +      foreign_lines << line_object_id +    end +  end  end | 
