import.rb revision 2ea8ea78359d29810b6f45a3a57e6cc9bae1cfcd
cda217260716cfd8d8ec5e56f91708c64c140538Timo Sirainen code_doc = code_io ? Nokogiri::XML(code_io) : nil
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen ontology = self.children.find_by_iri(child_iri)
f7fe4f81c0887196a1f938d83ae1cdba03cfad85Josef 'Jeff' Sipek ontology = SingleOntology.create!({iri: child_iri,
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 versions << version
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
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen #raise "more than one ontology found"
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology = self
c8cf8a605e0ddea7cb36fe04551aeca5090e684bTimo Sirainen ontology.present = true
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'])
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 logic_callback = ParsingCallback.determine_for(ontology)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology.entities_count = 0
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology.sentences_count = 0
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen logic_callback.ontology(h, ontology)
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!
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen logic_callback.ontology_end({}, ontology)
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 logic_callback.symbol(h, entity)
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
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen logic_callback.axiom(h, sentence)
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)
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen logic_callback.link(h, link)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen import: Proc.new { |h|
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen Rails.logger.warn "OntI: #{h.inspect}"
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen ontology.iri = h['library']
512f492f410fdaefb2f58e19c2b067ef20fb4adfTimo Sirainen versions.each { |version| version.save! }
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 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
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)
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 (?<end_line>\d+)\.
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen (?<end_column>\d+)}x)
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)