Added xml schemas and zip gem [SCI-742]

This commit is contained in:
Oleksii Kriuchykhin 2016-12-08 23:21:13 +01:00
parent 69f31a62e7
commit 1abd7fc574
3 changed files with 181 additions and 6 deletions

View file

@ -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'

View file

@ -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

View file

@ -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 id=\"#{protocol.id}\" guid=\"#{protocol_guid}\">#{protocol.name}</protocol>\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 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
envelope_xsd << "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\" attributeFormDefault=\"unqualified\">\n"
envelope_xsd << "<xs:element name=\"envelope\">\n"
envelope_xsd << "<xs:complexType>\n"
envelope_xsd << "<xs:sequence>\n"
envelope_xsd << "<xs:element name=\"protocol\" maxOccurs=\"unbounded\">\n"
envelope_xsd << "<xs:complexType>\n"
envelope_xsd << "<xs:simpleContent>\n"
envelope_xsd << "<xs:extension base=\"xs:string\">\n"
envelope_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
envelope_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
envelope_xsd << "</xs:extension>\n"
envelope_xsd << "</xs:simpleContent>\n"
envelope_xsd << "</xs:complexType>\n"
envelope_xsd << "</xs:element>\n"
envelope_xsd << "</xs:sequence>\n"
envelope_xsd << "<xs:attribute name=\"xmlns\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
envelope_xsd << "<xs:attribute name=\"version\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
envelope_xsd << "</xs:complexType>\n"
envelope_xsd << "</xs:element>\n"
envelope_xsd << "</xs:schema>\n"
envelope_xsd
end
def generate_eln_xsd
eln_xsd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
eln_xsd << "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\" attributeFormDefault=\"unqualified\">\n"
eln_xsd << "<xs:element name=\"eln\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:all>\n"
eln_xsd << "<xs:element name=\"protocol\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:all>\n"
eln_xsd << "<xs:element name=\"name\" type=\"xs:string\"></xs:element>\n"
eln_xsd << "<xs:element name=\"authors\" type=\"xs:string\" minOccurs=\"0\"></xs:element>\n"
eln_xsd << "<xs:element name=\"description\" type=\"xs:string\" minOccurs=\"0\"></xs:element>\n"
eln_xsd << "<xs:element name=\"created_at\" type=\"xs:string\"></xs:element>\n"
eln_xsd << "<xs:element name=\"updated_at\" type=\"xs:string\"></xs:element>\n"
eln_xsd << "<xs:element name=\"steps\" minOccurs=\"0\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:sequence>\n"
eln_xsd << "<xs:element name=\"step\" maxOccurs=\"unbounded\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:all>\n"
eln_xsd << "<xs:element name=\"name\" type=\"xs:string\"></xs:element>\n"
eln_xsd << "<xs:element name=\"description\" type=\"xs:string\" minOccurs=\"0\"></xs:element>\n"
eln_xsd << "<xs:element name=\"checklists\" minOccurs=\"0\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:sequence>\n"
eln_xsd << "<xs:element name=\"checklist\" maxOccurs=\"unbounded\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:all>\n"
eln_xsd << "<xs:element name=\"name\" type=\"xs:string\"></xs:element>\n"
eln_xsd << "<xs:element name=\"items\" minOccurs=\"0\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:sequence>\n"
eln_xsd << "<xs:element name=\"item\" maxOccurs=\"unbounded\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:all>\n"
eln_xsd << "<xs:element name=\"text\" type=\"xs:string\"></xs:element>\n"
eln_xsd << "</xs:all>\n"
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
eln_xsd << "<xs:attribute name=\"position\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << "</xs:sequence>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << "</xs:all>\n"
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << "</xs:sequence>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << "<xs:element name=\"assets\" minOccurs=\"0\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:sequence>\n"
eln_xsd << "<xs:element name=\"asset\" maxOccurs=\"unbounded\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:all>\n"
eln_xsd << "<xs:element name=\"fileName\" type=\"xs:string\"></xs:element>\n"
eln_xsd << "<xs:element name=\"fileType\" type=\"xs:string\"></xs:element>\n"
eln_xsd << "</xs:all>\n"
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
eln_xsd << "<xs:attribute name=\"fileRef\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << "</xs:sequence>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << "<xs:element name=\"elnTables\" minOccurs=\"0\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:sequence>\n"
eln_xsd << "<xs:element name=\"elnTable\" maxOccurs=\"unbounded\">\n"
eln_xsd << "<xs:complexType>\n"
eln_xsd << "<xs:all>\n"
eln_xsd << "<xs:element name=\"contents\" type=\"xs:string\"></xs:element>\n"
eln_xsd << "</xs:all>\n"
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << "</xs:sequence>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << "</xs:all>\n"
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
eln_xsd << "<xs:attribute name=\"position\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << "</xs:sequence>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << "</xs:all>\n"
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << "</xs:all>\n"
eln_xsd << "<xs:attribute name=\"xmlns\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
eln_xsd << "<xs:attribute name=\"version\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
eln_xsd << "</xs:complexType>\n"
eln_xsd << "</xs:element>\n"
eln_xsd << '</xs:schema>'
end
def export_protocol(protocol)
protocol_json = protocol.as_json(only: [
:id,