talia_core 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +41 -0
- data/bin/talia +33 -0
- data/lib/JXslt/jxslt.rb +60 -0
- data/lib/acts_as_roled.rb +11 -0
- data/lib/core_ext/platform.rb +9 -0
- data/lib/core_ext/string.rb +6 -0
- data/lib/core_ext.rb +1 -0
- data/lib/custom_template.rb +4 -0
- data/lib/loader_helper.rb +62 -0
- data/lib/mysql.rb +1214 -0
- data/lib/progressbar.rb +236 -0
- data/lib/role.rb +12 -0
- data/lib/talia_cl/command_line.rb +39 -0
- data/lib/talia_cl/commands/standalone/cl_options.rb +9 -0
- data/lib/talia_cl/commands/standalone/standalone_generate.rb +75 -0
- data/lib/talia_cl/commands/standalone.rb +25 -0
- data/lib/talia_cl/commands/talia_console/cl_options.rb +55 -0
- data/lib/talia_cl/commands/talia_console/console_commands.rb +37 -0
- data/lib/talia_cl/commands/talia_console/talia_commands.rb +131 -0
- data/lib/talia_cl/commands/talia_console.rb +47 -0
- data/lib/talia_cl/core_commands.rb +11 -0
- data/lib/talia_cl.rb +47 -0
- data/lib/talia_core/active_source.rb +372 -0
- data/lib/talia_core/active_source_parts/class_methods.rb +378 -0
- data/lib/talia_core/active_source_parts/predicate_handler.rb +89 -0
- data/lib/talia_core/active_source_parts/rdf.rb +131 -0
- data/lib/talia_core/active_source_parts/sql_helper.rb +36 -0
- data/lib/talia_core/active_source_parts/xml/base_builder.rb +47 -0
- data/lib/talia_core/active_source_parts/xml/generic_reader.rb +363 -0
- data/lib/talia_core/active_source_parts/xml/rdf_builder.rb +88 -0
- data/lib/talia_core/active_source_parts/xml/source_builder.rb +73 -0
- data/lib/talia_core/active_source_parts/xml/source_reader.rb +20 -0
- data/lib/talia_core/agent.rb +14 -0
- data/lib/talia_core/background_jobs/job.rb +82 -0
- data/lib/talia_core/background_jobs/progress_job.rb +68 -0
- data/lib/talia_core/collection.rb +13 -0
- data/lib/talia_core/data_types/data_loader.rb +92 -0
- data/lib/talia_core/data_types/data_record.rb +105 -0
- data/lib/talia_core/data_types/delayed_copier.rb +76 -0
- data/lib/talia_core/data_types/file_record.rb +59 -0
- data/lib/talia_core/data_types/file_store.rb +306 -0
- data/lib/talia_core/data_types/iip_data.rb +153 -0
- data/lib/talia_core/data_types/iip_loader.rb +127 -0
- data/lib/talia_core/data_types/image_data.rb +32 -0
- data/lib/talia_core/data_types/media_link.rb +19 -0
- data/lib/talia_core/data_types/mime_mapping.rb +45 -0
- data/lib/talia_core/data_types/path_helpers.rb +77 -0
- data/lib/talia_core/data_types/pdf_data.rb +42 -0
- data/lib/talia_core/data_types/simple_text.rb +36 -0
- data/lib/talia_core/data_types/temp_file_handling.rb +85 -0
- data/lib/talia_core/data_types/xml_data.rb +169 -0
- data/lib/talia_core/dc_resource.rb +20 -0
- data/lib/talia_core/dummy_handler.rb +34 -0
- data/lib/talia_core/dummy_source.rb +20 -0
- data/lib/talia_core/errors.rb +25 -0
- data/lib/talia_core/initializer.rb +427 -0
- data/lib/talia_core/ordered_source.rb +228 -0
- data/lib/talia_core/rails_ext/actionpack/action_controller/record_identifier.rb +13 -0
- data/lib/talia_core/rails_ext/actionpack/action_controller.rb +1 -0
- data/lib/talia_core/rails_ext/actionpack.rb +1 -0
- data/lib/talia_core/rails_ext.rb +1 -0
- data/lib/talia_core/rdf_import.rb +90 -0
- data/lib/talia_core/rdf_resource.rb +159 -0
- data/lib/talia_core/semantic_collection_item.rb +93 -0
- data/lib/talia_core/semantic_collection_wrapper.rb +324 -0
- data/lib/talia_core/semantic_property.rb +7 -0
- data/lib/talia_core/semantic_relation.rb +67 -0
- data/lib/talia_core/source.rb +323 -0
- data/lib/talia_core/source_transfer_object.rb +38 -0
- data/lib/talia_core/workflow/base.rb +15 -0
- data/lib/talia_core/workflow/publication_workflow.rb +62 -0
- data/lib/talia_core/workflow.rb +300 -0
- data/lib/talia_core.rb +9 -0
- data/lib/talia_dependencies.rb +12 -0
- data/lib/talia_util/bar_progressor.rb +15 -0
- data/lib/talia_util/configuration/config_file.rb +48 -0
- data/lib/talia_util/configuration/database_config.rb +40 -0
- data/lib/talia_util/configuration/mysql_database_setup.rb +104 -0
- data/lib/talia_util/data_import.rb +91 -0
- data/lib/talia_util/image_conversions.rb +82 -0
- data/lib/talia_util/import_job_helper.rb +132 -0
- data/lib/talia_util/io_helper.rb +54 -0
- data/lib/talia_util/progressable.rb +38 -0
- data/lib/talia_util/progressbar.rb +236 -0
- data/lib/talia_util/rdf_update.rb +80 -0
- data/lib/talia_util/some_sigla.xml +1960 -0
- data/lib/talia_util/test_helpers.rb +151 -0
- data/lib/talia_util/util.rb +226 -0
- data/lib/talia_util/yaml_import.rb +80 -0
- data/lib/talia_util.rb +13 -0
- data/lib/user.rb +116 -0
- data/lib/version.rb +15 -0
- data/test/core_ext/string_test.rb +11 -0
- data/test/custom_template_test.rb +8 -0
- data/test/talia_core/active_source_predicate_test.rb +54 -0
- data/test/talia_core/active_source_rdf_test.rb +89 -0
- data/test/talia_core/active_source_test.rb +631 -0
- data/test/talia_core/data_types/data_loader_test.rb +123 -0
- data/test/talia_core/data_types/data_record_test.rb +40 -0
- data/test/talia_core/data_types/file_record_test.rb +171 -0
- data/test/talia_core/data_types/iip_data_test.rb +130 -0
- data/test/talia_core/data_types/image_data_test.rb +88 -0
- data/test/talia_core/data_types/pdf_data_test.rb +68 -0
- data/test/talia_core/data_types/xml_data_test.rb +134 -0
- data/test/talia_core/generic_xml_test.rb +83 -0
- data/test/talia_core/initializer_test.rb +36 -0
- data/test/talia_core/ordered_source_test.rb +398 -0
- data/test/talia_core/rdf_resource_test.rb +115 -0
- data/test/talia_core/semantic_collection_item_test.rb +129 -0
- data/test/talia_core/source_reader_test.rb +33 -0
- data/test/talia_core/source_test.rb +484 -0
- data/test/talia_core/source_transfer_object_test.rb +24 -0
- data/test/talia_core/workflow/publication_workflow_test.rb +242 -0
- data/test/talia_core/workflow/user_class_for_workflow.rb +35 -0
- data/test/talia_core/workflow/workflow_base_test.rb +21 -0
- data/test/talia_core/workflow_test.rb +19 -0
- data/test/talia_util/import_job_helper_test.rb +46 -0
- data/test/test_helper.rb +68 -0
- metadata +262 -0
@@ -0,0 +1,77 @@
|
|
1
|
+
module TaliaCore
|
2
|
+
module DataTypes
|
3
|
+
|
4
|
+
# Contains the helpers to obtain path information for data storage
|
5
|
+
module PathHelpers
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
# Path used to store temporary files.
|
9
|
+
def tempfile_path
|
10
|
+
@@tempfile_path ||= File.join(TALIA_ROOT, 'tmp', 'data_records')
|
11
|
+
end
|
12
|
+
|
13
|
+
# Path used to store data files.
|
14
|
+
def data_path
|
15
|
+
@@data_path ||= File.join(TALIA_ROOT, 'data')
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
# Extract the filename.
|
21
|
+
def extract_filename(file_data)
|
22
|
+
file_data.original_filename if file_data.respond_to?(:original_filename)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
# Return the full file path related to the data directory
|
28
|
+
def file_path(relative = false)
|
29
|
+
File.join(data_directory(relative), self.id.to_s)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Gets the path that will be used for serving the image as a static
|
33
|
+
# resource. Nil if the prefix isn't set
|
34
|
+
def static_path
|
35
|
+
prefix = TaliaCore::CONFIG['static_data_prefix']
|
36
|
+
return unless(prefix)
|
37
|
+
prefix = N::LOCAL + prefix unless(prefix =~ /:\/\//)
|
38
|
+
"#{prefix}/#{class_name}/#{("00" + self.id.to_s)[-3..-1]}/#{self.id}"
|
39
|
+
end
|
40
|
+
|
41
|
+
# Path used to store temporary files.
|
42
|
+
# This is a wrapper for the tempfile_path class method.
|
43
|
+
def tempfile_path
|
44
|
+
self.class.tempfile_path
|
45
|
+
end
|
46
|
+
|
47
|
+
# Return the data directory for a specific data file
|
48
|
+
def data_directory(relative = false)
|
49
|
+
class_name = self.class.name.gsub(/(.*::)/, '')
|
50
|
+
if relative == false
|
51
|
+
File.join(TaliaCore::CONFIG["data_directory_location"], class_name, ("00" + self.id.to_s)[-3..-1])
|
52
|
+
else
|
53
|
+
File.join(class_name, ("00" + self.id.to_s)[-3..-1])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Path used to store data files.
|
58
|
+
# This is a wrapper for the data_path class method.
|
59
|
+
def data_path
|
60
|
+
self.class.data_path
|
61
|
+
end
|
62
|
+
|
63
|
+
# Return the full path of the current attachment.
|
64
|
+
def full_filename
|
65
|
+
@full_filename ||= self.file_path #File.join(data_path, class_name, location)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Extract the filename.
|
69
|
+
# This is a wrapper for the extract_filename class method.
|
70
|
+
def extract_filename(file_data)
|
71
|
+
self.class.extract_filename(file_data)
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module TaliaCore
|
2
|
+
module DataTypes
|
3
|
+
|
4
|
+
# Class to manage PDF data type
|
5
|
+
class PdfData < FileRecord
|
6
|
+
|
7
|
+
# return the mime_type for a file
|
8
|
+
def extract_mime_type(location)
|
9
|
+
'application/pdf'
|
10
|
+
end
|
11
|
+
|
12
|
+
# Create the PDF data from a PDF writer. This method needs a block
|
13
|
+
# which will be called with the writer object
|
14
|
+
def create_from_writer(writer_opts = {})
|
15
|
+
activate_pdf
|
16
|
+
writer = PDF::Writer.new(writer_opts) do |pdf|
|
17
|
+
yield(pdf)
|
18
|
+
end
|
19
|
+
filename = File.join(Dir.tmpdir, "#{rand 10E16}.pdf")
|
20
|
+
writer.save_as(filename)
|
21
|
+
self.create_from_file('', filename, true) # set to delete tempfile on create
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# Little helper method - no need to load the pdf classes unless needed,
|
28
|
+
# but if called every time round it will slow things down (in Rails it will).
|
29
|
+
def self.activate_pdf
|
30
|
+
return if(@pdf_active)
|
31
|
+
require 'pdf/writer'
|
32
|
+
@pdf_active = true
|
33
|
+
end
|
34
|
+
|
35
|
+
def activate_pdf
|
36
|
+
self.class.activate_pdf
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'talia_core/data_types/file_store'
|
2
|
+
|
3
|
+
# Class to manage data stored in a text file
|
4
|
+
module TaliaCore
|
5
|
+
module DataTypes
|
6
|
+
|
7
|
+
class SimpleText < FileRecord
|
8
|
+
|
9
|
+
# return the mime_type for a file
|
10
|
+
def extract_mime_type(location)
|
11
|
+
'text/plain'
|
12
|
+
end
|
13
|
+
|
14
|
+
# Get a line from a text file.
|
15
|
+
# At the end of file: close the file and return
|
16
|
+
def get_line(close_after_single_read=false)
|
17
|
+
if !is_file_open?
|
18
|
+
open_file
|
19
|
+
end
|
20
|
+
|
21
|
+
# get a new line and return nil is EOF
|
22
|
+
line = @file_handle.gets
|
23
|
+
|
24
|
+
if line == nil or close_after_single_read
|
25
|
+
close_file
|
26
|
+
end
|
27
|
+
|
28
|
+
# update the position of reading cursors
|
29
|
+
@position += line.length
|
30
|
+
|
31
|
+
return line
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module TaliaCore
|
4
|
+
module DataTypes
|
5
|
+
|
6
|
+
# Module for the handling of temporary files in data storage objects
|
7
|
+
module TempFileHandling
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
# Copies the given file path to a new tempfile, returning the closed tempfile.
|
12
|
+
def copy_to_temp_file(file, temp_base_name)
|
13
|
+
create_tempfile_path
|
14
|
+
returning Tempfile.new(temp_base_name, self.tempfile_path) do |tmp|
|
15
|
+
tmp.close
|
16
|
+
FileUtils.cp file, tmp.path
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Writes the given data to a new tempfile, returning the closed tempfile.
|
21
|
+
def write_to_temp_file(data, filename)
|
22
|
+
create_tempfile_path
|
23
|
+
returning Tempfile.new(filename, self.tempfile_path) do |tmp|
|
24
|
+
tmp.binmode
|
25
|
+
tmp.write data
|
26
|
+
tmp.close
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_tempfile_path
|
31
|
+
FileUtils.mkdir_p(tempfile_path) unless File.exists?(tempfile_path)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
# Gets the latest temp path from the collection of temp paths. While working with an attachment,
|
37
|
+
# multiple Tempfile objects may be created for various processing purposes (resizing, for example).
|
38
|
+
# An array of all the tempfile objects is stored so that the Tempfile instance is held on to until
|
39
|
+
# it's not needed anymore. The collection is cleared after saving the attachment.
|
40
|
+
def temp_path
|
41
|
+
p = temp_paths.first
|
42
|
+
p.respond_to?(:path) ? p.path : p.to_s
|
43
|
+
end
|
44
|
+
|
45
|
+
# Gets an array of the currently used temp paths. Defaults to a copy of #full_filename.
|
46
|
+
def temp_paths
|
47
|
+
@temp_paths ||= (new_record? || !File.exist?(full_filename)) ? [] : [copy_to_temp_file(full_filename)]
|
48
|
+
end
|
49
|
+
|
50
|
+
# Adds a new temp_path to the array. This should take a string or a Tempfile. This class makes no
|
51
|
+
# attempt to remove the files, so Tempfiles should be used. Tempfiles remove themselves when they go out of scope.
|
52
|
+
# You can also use string paths for temporary files, such as those used for uploaded files in a web server.
|
53
|
+
def temp_path=(value)
|
54
|
+
temp_paths.unshift value
|
55
|
+
temp_path
|
56
|
+
end
|
57
|
+
|
58
|
+
# Gets the data from the latest temp file. This will read the file into memory.
|
59
|
+
def temp_data
|
60
|
+
save_attachment? ? File.read(temp_path) : nil
|
61
|
+
end
|
62
|
+
|
63
|
+
# Writes the given data to a Tempfile and adds it to the collection of temp files.
|
64
|
+
def temp_data=(data)
|
65
|
+
self.temp_path = write_to_temp_file data unless data.nil?
|
66
|
+
end
|
67
|
+
|
68
|
+
# Copies the given file to a randomly named Tempfile.
|
69
|
+
def copy_to_temp_file(file)
|
70
|
+
self.class.copy_to_temp_file file, random_tempfile_filename
|
71
|
+
end
|
72
|
+
|
73
|
+
# Writes the given file to a randomly named Tempfile.
|
74
|
+
def write_to_temp_file(data)
|
75
|
+
self.class.write_to_temp_file data, self.location
|
76
|
+
end
|
77
|
+
|
78
|
+
# Generates a unique filename for a Tempfile.
|
79
|
+
def random_tempfile_filename
|
80
|
+
"#{rand Time.now.to_i}#{location || 'attachment'}"
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
require 'talia_core/data_types/file_store'
|
2
|
+
require 'rexml/document'
|
3
|
+
# require 'xml/xslt'
|
4
|
+
|
5
|
+
begin
|
6
|
+
# if tidy is not present, disable it
|
7
|
+
require 'tidy'
|
8
|
+
|
9
|
+
# Tidy_enable constant is not defined?
|
10
|
+
if ((defined? Tidy_enable) == nil)
|
11
|
+
if ENV['TIDYLIB'].nil?
|
12
|
+
# disable tidy
|
13
|
+
Tidy_enable = false
|
14
|
+
else
|
15
|
+
# set path and enable tidy
|
16
|
+
Tidy.path = ENV['TIDYLIB']
|
17
|
+
Tidy_enable = true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
rescue LoadError
|
22
|
+
# disable tidy
|
23
|
+
Tidy_enable = false if ((defined? Tidy_enable) == nil)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
module TaliaCore
|
28
|
+
module DataTypes
|
29
|
+
|
30
|
+
# Class to manage XML and HTML data type
|
31
|
+
class XmlData < FileRecord
|
32
|
+
|
33
|
+
# return the mime_type for a file
|
34
|
+
def extract_mime_type(location)
|
35
|
+
case File.extname(location).downcase
|
36
|
+
when '.htm', '.html','.xhtml'
|
37
|
+
'text/html'
|
38
|
+
when '.hnml'
|
39
|
+
'text/hnml'
|
40
|
+
when '.xml'
|
41
|
+
'text/xml'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# return the mime subtype for this specified class
|
46
|
+
def mime_subtype
|
47
|
+
mime_type.split(/\//)[1]
|
48
|
+
end
|
49
|
+
|
50
|
+
# return contect of the object as REXML::Elements
|
51
|
+
# * options: Options for getting context. Default nil.
|
52
|
+
# * options[:xsl_file]: xsl file path for transformation.
|
53
|
+
def get_content(options = nil)
|
54
|
+
text_to_parse = all_text
|
55
|
+
|
56
|
+
if (!options.nil?)
|
57
|
+
# if xsl_file option is specified, execute transformation
|
58
|
+
if (!options[:xsl_file].nil?)
|
59
|
+
text_to_parse = xslt_transform(file_path, options[:xsl_file])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# create document object
|
64
|
+
document = REXML::Document.new text_to_parse
|
65
|
+
|
66
|
+
# get content
|
67
|
+
if ((mime_subtype == "html") or
|
68
|
+
((mime_subtype == "xml") and (!options.nil?) and (!options[:xsl_file].nil?)))
|
69
|
+
content = document.elements['//body'].elements
|
70
|
+
elsif ((mime_subtype == "xml") or (mime_subtype == "hnml"))
|
71
|
+
content = document.root.elements
|
72
|
+
end
|
73
|
+
|
74
|
+
# adjust/replace items path
|
75
|
+
content.each { |i| wrapItem i }
|
76
|
+
|
77
|
+
# return content
|
78
|
+
return content
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns an xml string of the elements returned by get_content
|
82
|
+
def get_content_string(options = nil)
|
83
|
+
xml_str = ''
|
84
|
+
get_content(options).each do |element|
|
85
|
+
xml_str << element.to_s
|
86
|
+
end
|
87
|
+
xml_str
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns an xml string that is escaped for HTML inclusing
|
91
|
+
def get_escaped_content_string(options = nil)
|
92
|
+
get_content_string(options).gsub(/</, "<").gsub(/>/, ">")
|
93
|
+
end
|
94
|
+
|
95
|
+
# Add data as string into file
|
96
|
+
# * location: location
|
97
|
+
# * data: data to write
|
98
|
+
# * options: options
|
99
|
+
# * options[:tidy]: enable or disable tidy (convert html into xhtml). Default value is true
|
100
|
+
def create_from_data(location, data, options = {:tidy => true})
|
101
|
+
# check tidy option
|
102
|
+
if (((options[:tidy] == true) and (Tidy_enable == true)) and
|
103
|
+
((File.extname(location) == '.htm') or (File.extname(location) == '.html') or (File.extname(location) == '.xhtml')))
|
104
|
+
|
105
|
+
# apply tidy on data
|
106
|
+
data_to_write = Tidy.open(:show_warnings => false) do |tidy|
|
107
|
+
tidy.options.output_xhtml = true
|
108
|
+
tidy.options.tidy_mark = false
|
109
|
+
xhtml = tidy.clean(data)
|
110
|
+
xhtml
|
111
|
+
end
|
112
|
+
else
|
113
|
+
data_to_write = data
|
114
|
+
end
|
115
|
+
|
116
|
+
# write data
|
117
|
+
super(location, data_to_write, options)
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
# adjusted/replaced items path
|
122
|
+
# * item: REXML::Element to parse
|
123
|
+
def wrapItem item
|
124
|
+
if item.class == REXML::Element
|
125
|
+
# recursive execution
|
126
|
+
item.each_child { |subItem| wrapItem subItem}
|
127
|
+
|
128
|
+
case item.name
|
129
|
+
when "img"
|
130
|
+
if item.attributes.include? "src"
|
131
|
+
# get path
|
132
|
+
path = Pathname.new(item.attributes['src']).split
|
133
|
+
# adjust src attribute
|
134
|
+
item.attributes['src'] = "/source_data/image_data/#{path[1].to_s}" if path[0].relative?
|
135
|
+
end
|
136
|
+
when "a"
|
137
|
+
if item.attributes.include? "href"
|
138
|
+
# get path
|
139
|
+
path = Pathname.new(item.attributes['href']).split
|
140
|
+
# adjust href attribute
|
141
|
+
case File.extname(path[1].to_s)
|
142
|
+
when ".txt"
|
143
|
+
item.attributes['href'] = "/source_data/simple_text/#{path[1].to_s}" if path[0].relative?
|
144
|
+
when '.htm', '.html','.xhtml','.hnml','.xml'
|
145
|
+
item.attributes['href'] = "/source_data/xml_data/#{path[1].to_s}" if path[0].relative?
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# execute xslt transformation
|
154
|
+
# * document: xml document. Can be file path as string or REXML::Document
|
155
|
+
# * xsl_file: xsl file for transformation. Can be file path as string or REXML::Document
|
156
|
+
def xslt_transform(document, xsl_file)
|
157
|
+
xslt = XML::XSLT.new()
|
158
|
+
# get xml document
|
159
|
+
xslt.xml = document
|
160
|
+
# get xslt document
|
161
|
+
xslt.xsl = xsl_file
|
162
|
+
|
163
|
+
# return transformation output
|
164
|
+
return xslt.serve()
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module TaliaCore
|
2
|
+
|
3
|
+
# A generic resource that should contain the most important
|
4
|
+
# Dublin Core metadata fields
|
5
|
+
class DcResource < Source
|
6
|
+
|
7
|
+
# General metadata
|
8
|
+
singular_property :identifier, N::DCNS.identifier
|
9
|
+
simple_property :creators, N::DCNS.creator
|
10
|
+
singular_property :date, N::DCNS.date
|
11
|
+
singular_property :description, N::DCNS.description
|
12
|
+
simple_property :publishers, N::DCNS.publisher
|
13
|
+
singular_property :language, N::DCNS.language
|
14
|
+
simple_property :subjects, N::DCNS.subject
|
15
|
+
singular_property :rights, N::DCNS.rights
|
16
|
+
singular_property :title, N::DCNS.title
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'active_rdf'
|
2
|
+
require 'semantic_naming'
|
3
|
+
require 'assit'
|
4
|
+
require 'errors'
|
5
|
+
|
6
|
+
module TaliaCore
|
7
|
+
|
8
|
+
# This is an internal class for "dummy handler invocations" on sources
|
9
|
+
# The problem is that invocations like source.namespace::name are
|
10
|
+
# evaluated to (source.namespace).name
|
11
|
+
# This means that source.namespace must return an object on which
|
12
|
+
# "name" can be called with the desired effect. This is the "dummy handler"
|
13
|
+
class DummyHandler
|
14
|
+
|
15
|
+
# Create the new handler
|
16
|
+
def initialize(namespace, subject)
|
17
|
+
assit_kind_of(N::URI, namespace)
|
18
|
+
assit_kind_of(TaliaCore::Source, subject)
|
19
|
+
|
20
|
+
@namespace = namespace.to_s
|
21
|
+
@subject = subject
|
22
|
+
end
|
23
|
+
|
24
|
+
# Catch the invocations
|
25
|
+
def method_missing(method, *args)
|
26
|
+
# read value
|
27
|
+
raise(SemanticNamingError, "Wrong number of arguments") if(args.size != 0)
|
28
|
+
@subject[@namespace + method.to_s]
|
29
|
+
end
|
30
|
+
|
31
|
+
# remove the type call
|
32
|
+
private :type
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module TaliaCore
|
2
|
+
|
3
|
+
# Dummy source class. This will be created by some mechanisms that need to create a relation to a
|
4
|
+
# not-yet-existing source. The DummySource should only exist temporarily, if some are found inside
|
5
|
+
# the data store it may be a sign of an inconsistent or not completely initialized store.
|
6
|
+
class DummySource < Source
|
7
|
+
|
8
|
+
# Converts the current source into one with a "real" klass. Returns the new, converted sourc
|
9
|
+
def self.make_real(klass)
|
10
|
+
assit_kind_of(Class, klass)
|
11
|
+
self['type'] = klass.name
|
12
|
+
save!
|
13
|
+
new_src = ActiveSource.find(uri)
|
14
|
+
assit_kind_of(klass, new_src)
|
15
|
+
new_src
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# This file contains all the errors that can be raised in the
|
2
|
+
# Talia core. Since these are not useful classes, they are grouped
|
3
|
+
# together in one file.
|
4
|
+
|
5
|
+
# Indicates that it was tried to create an object with
|
6
|
+
# an identifier (e.g. an URI) which already exists in the
|
7
|
+
# system.
|
8
|
+
class DuplicateIdentifierError < RuntimeError
|
9
|
+
end
|
10
|
+
|
11
|
+
# Indicates an error during initialization
|
12
|
+
class SystemInitializationError < RuntimeError
|
13
|
+
end
|
14
|
+
|
15
|
+
# Indicates an error with the predicate naming
|
16
|
+
class SemanticNamingError < RuntimeError
|
17
|
+
end
|
18
|
+
|
19
|
+
# Indicates an attempt to save attributes on an unsaved source
|
20
|
+
class UnsavedSourceError < RuntimeError
|
21
|
+
end
|
22
|
+
|
23
|
+
# Indicates an error in a query
|
24
|
+
class QueryError < RuntimeError
|
25
|
+
end
|