diff --git a/Gemfile b/Gemfile
index c779d12bc..c5dc609a7 100644
--- a/Gemfile
+++ b/Gemfile
@@ -56,6 +56,7 @@ gem 'nokogiri' # HTML/XML parser
gem 'sneaky-save', git: 'git://github.com/einzige/sneaky-save.git'
gem 'rails_autolink', '~> 1.1', '>= 1.1.6'
gem 'delayed_paperclip'
+gem 'rubyzip'
gem 'paperclip', '~> 4.3' # File attachment, image attachment library
gem 'aws-sdk', '~> 2.2.8'
diff --git a/app/controllers/protocols_controller.rb b/app/controllers/protocols_controller.rb
index 625da49a7..4d70fd057 100644
--- a/app/controllers/protocols_controller.rb
+++ b/app/controllers/protocols_controller.rb
@@ -560,13 +560,38 @@ class ProtocolsController < ApplicationController
end
def export
+ #respond_to do |format|
+ # format.json {
+ # render json: {
+ # protocols: export_protocols(@protocols)
+ # }, status: :ok
+ # }
+ #end
+
+ # Make a zip output stream and send it to the client
respond_to do |format|
- format.json {
- render json: {
- protocols: export_protocols(@protocols)
- }, status: :ok
- }
+ format.html
+ format.zip do
+ Dir.mktmpdir do |tmp_dir|
+
+
+ end
+
+ z_output_stream = Zip::OutputStream.write_buffer do |ostream|
+ ostream.put_next_entry('eln.xml')
+ ostream.print(protocol_xml)
+ ostream.put_next_entry("#{arch_dir}/scinote.xml")
+ ostream.print(envelope_xml)
+ ostream.put_next_entry("#{arch_dir}/scinote.xsd")
+ ostream.print(generate_envelope_xsd)
+ ostream.put_next_entry("#{arch_dir}/eln.xsd")
+ ostream.print(generate_eln_xsd)
+ end
+ z_output_stream.rewind
+ send_data compressed_filestream.read, filename: "protocol.eln"
+ end
end
+
end
def unlink_modal
diff --git a/app/utilities/protocols_exporter.rb b/app/utilities/protocols_exporter.rb
index ae0edc872..d3ef68e65 100644
--- a/app/utilities/protocols_exporter.rb
+++ b/app/utilities/protocols_exporter.rb
@@ -1,4 +1,5 @@
require 'tmpdir'
+require 'zip'
module ProtocolsExporter
def export_protocols(protocols)
@@ -117,7 +118,7 @@ module ProtocolsExporter
# individual protocol, save it to protocol folder
output_file = File.open("#{protocol_dir}/eln.xml", 'w')
output_file.write(protocol_xml)
-
+ output_file.close
# Add protocol to the envelope
envelope_xml << "#{protocol.name}\n"
end
@@ -126,7 +127,23 @@ module ProtocolsExporter
# Save envelope to root directory in archive
output_file = File.open("#{arch_dir}/scinote.xml", 'w')
output_file.write(envelope_xml)
+ output_file.close
+ output_file = File.open("#{arch_dir}/scinote.xsd", 'w')
+ output_file.write(generate_envelope_xsd)
+ output_file.close
+ output_file = File.open("#{arch_dir}/eln.xsd", 'w')
+ output_file.write(generate_eln_xsd)
+ output_file.close
puts `ls -la #{arch_dir}`
+
+ # Now make zip output stream and send it to the client
+ zip_name = "#{tmp_dir}/protocol.eln"
+ Zip::File.open(zip_name, Zip::File::CREATE) do |zipfile|
+ zipfile.add("eln.xsd", "#{arch_dir}/eln.xsd")
+ zipfile.add("eln.xsd", "#{arch_dir}/scinote.xml")
+ zipfile.add("eln.xsd", "#{arch_dir}/scinote.xsd")
+ end
+
end
end
@@ -143,6 +160,138 @@ module ProtocolsExporter
str1 + str2n
end
+ def generate_envelope_xsd
+ envelope_xsd = "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd << "\n"
+ envelope_xsd
+ end
+
+ def generate_eln_xsd
+ eln_xsd = "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << "\n"
+ eln_xsd << ''
+ end
+
def export_protocol(protocol)
protocol_json = protocol.as_json(only: [
:id,