import.rb revision 2ea8ea78359d29810b6f45a3a57e6cc9bae1cfcd
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Boschmodule Ontology::Import
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen extend ActiveSupport::Concern
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def import_xml(io, code_io, user)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen now = Time.now
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen transaction do
cda217260716cfd8d8ec5e56f91708c64c140538Timo Sirainen code_doc = code_io ? Nokogiri::XML(code_io) : nil
d09be27cc4d98d23ba6ae78f13248945a28f9090Timo Sirainen self.present = true
7a7d2aa11e46195e2d92d6c337d7e78052a5ce67Timo Sirainen root = nil
d00ae137b6772f0b047cc98cb153f11c5246f82bTimo Sirainen ontology = nil
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen logic_callback = nil
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen link = nil
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen ontologies_count = 0
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde versions = []
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen OntologyParser.parse io,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen root: Proc.new { |h|
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen root = h
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen },
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology: Proc.new { |h|
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontologies_count += 1
f325d795b52ce2053f914072b22ebca9c4f0dc7eTimo Sirainen child_name = h['name']
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if distributed?
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen # generate IRI for sub-ontology
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen child_iri = iri_for_child(child_name)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen # find or create sub-ontology by IRI
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen ontology = self.children.find_by_iri(child_iri)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen if ontology.nil?
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
f7fe4f81c0887196a1f938d83ae1cdba03cfad85Josef 'Jeff' Sipek ontology = SingleOntology.create!({iri: child_iri,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen name: child_name,
139cbf8d9e1cc0c65d985f525756fe47a7bfada6Timo Sirainen basepath: self.basepath,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen file_extension: self.file_extension,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen repository_id: repository_id},
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen without_protection: true)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen self.children << ontology
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology.present = true
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen version = ontology.versions.build
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen version.user = user
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen version.code_reference = code_reference_for(ontology.name, code_doc)
d29e35631075b8c172ce781b85fd1cdaf0a400fdTimo Sirainen
d29e35631075b8c172ce781b85fd1cdaf0a400fdTimo Sirainen versions << version
0f17bb103602d0c4394e3784cb96d788530fc79eTimo Sirainen else
0f17bb103602d0c4394e3784cb96d788530fc79eTimo Sirainen if ontologies_count > 1
0116003edce8cad684715b1b37cf57e3674cf2cbTimo Sirainen ontology = self.repository.ontologies.find_by_name(child_name)
0116003edce8cad684715b1b37cf57e3674cf2cbTimo Sirainen if ontology.nil?
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology = SingleOntology.create!({name: child_name,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen iri: "http://fake_iri.com/#{Time.now.to_f}",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen basepath: "basepath.foo",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen repository_id: repository_id},
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen without_protection: true
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen )
c8cf8a605e0ddea7cb36fe04551aeca5090e684bTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen else
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen #raise "more than one ontology found"
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology = self
c8cf8a605e0ddea7cb36fe04551aeca5090e684bTimo Sirainen ontology.present = true
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology.name = Ontology.generate_name(h['name'])
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if h['language']
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology.language = Language.where(:iri => "http://purl.net/dol/language/#{h['language']}")
139cbf8d9e1cc0c65d985f525756fe47a7bfada6Timo Sirainen .first_or_create(user: user, name: h['language'])
f6d63a21010540d3ddf08f2e7664ffca3ea70489Timo Sirainen end
139cbf8d9e1cc0c65d985f525756fe47a7bfada6Timo Sirainen if h['logic']
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology.logic = Logic.where(:iri => "http://purl.net/dol/logics/#{h['logic']}")
139cbf8d9e1cc0c65d985f525756fe47a7bfada6Timo Sirainen .first_or_create(user: user, name: h['logic'])
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen logic_callback = ParsingCallback.determine_for(ontology)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology.entities_count = 0
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology.sentences_count = 0
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen logic_callback.ontology(h, ontology)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen },
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology_end: Proc.new {
dc912088f84c263db1609435c2f5d7cb29bf1a33Timo Sirainen # remove outdated sentences and entities
a5bb2908b44c8bf5ce41160a64c67fb840a20006Timo Sirainen conditions = ['updated_at < ?', now]
a5bb2908b44c8bf5ce41160a64c67fb840a20006Timo Sirainen ontology.entities.where(conditions).destroy_all
a5bb2908b44c8bf5ce41160a64c67fb840a20006Timo Sirainen ontology.sentences.where(conditions).delete_all
a5bb2908b44c8bf5ce41160a64c67fb840a20006Timo Sirainen ontology.save!
a5bb2908b44c8bf5ce41160a64c67fb840a20006Timo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen logic_callback.ontology_end({}, ontology)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen },
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen symbol: Proc.new { |h|
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if logic_callback.pre_symbol(h)
8d90e4f9a8f79f79c393aca23d0a897471dc2d8fTimo Sirainen entity = ontology.entities.update_or_create_from_hash(h, now)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology.entities_count += 1
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen logic_callback.symbol(h, entity)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen end
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen },
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen axiom: Proc.new { |h|
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen if logic_callback.pre_axiom(h)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen sentence = ontology.sentences.update_or_create_from_hash(h, now)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen ontology.sentences_count += 1
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen logic_callback.axiom(h, sentence)
7fc0f80480063a9d4cb9e8c07b50db2a5627799eTimo Sirainen end
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen },
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen link: Proc.new { |h|
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen if logic_callback.pre_link(h)
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen link = self.links.update_or_create_from_hash(h, user, now)
708efcd8581258763289b95cde119ca9423641d8Timo Sirainen
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen logic_callback.link(h, link)
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen end
7fc0f80480063a9d4cb9e8c07b50db2a5627799eTimo Sirainen },
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen import: Proc.new { |h|
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen Rails.logger.warn "OntI: #{h.inspect}"
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen ontology.iri = h['library']
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde }
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde save!
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen versions.each { |version| version.save! }
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen end
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen end
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen
9fc97c8aa8190df87624d214bcc5d0b5362bec93Timo Sirainen def import_xml_from_file(path, code_path, user)
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen code_io = code_path ? File.open(code_path) : nil
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen import_xml File.open(path), code_io, user
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen end
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen def import_latest_version(user)
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen latest_version = versions.last
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen return if latest_version.nil?
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen import_xml_from_file latest_version.xml_path,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen latest_version.code_reference_path, user
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen def code_reference_for(ontology_name, code_doc)
f7fe4f81c0887196a1f938d83ae1cdba03cfad85Josef 'Jeff' Sipek return if code_doc.nil?
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen elements = code_doc.xpath("//*[contains(@name, '##{ontology_name}')]")
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen code_range = elements.first.try(:attr, "range")
d29e35631075b8c172ce781b85fd1cdaf0a400fdTimo Sirainen code_reference_from_range(code_range)
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen end
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def code_reference_from_range(range)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen return if range.nil?
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen match = range.match( %r{
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen (?<begin_line>\d+)\.
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen (?<begin_column>\d+)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen -
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen (?<end_line>\d+)\.
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen (?<end_column>\d+)}x)
b1c42176a65dbe9c83a0af766e6bd8315530f3a5Timo Sirainen if match
b1c42176a65dbe9c83a0af766e6bd8315530f3a5Timo Sirainen reference = CodeReference.new(begin_line: match[:begin_line].to_i,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen begin_column: match[:begin_column].to_i,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end_line: match[:end_line].to_i,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end_column: match[:end_column].to_i)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenend
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen