router_constraints.rb revision 5a102b3c56d4ac75632c7e9244ee0ce5bdbbf13a
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherclass RouterConstraint
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def params(request)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher request.send(:env)["action_dispatch.request.path_parameters"]
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def set_path_parameters(request, new_params)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher params = params(request)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher controller = params[:controller]
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher action = params[:action]
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher params.except!(*params.keys).merge!(
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher controller: controller,
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher action: action).merge!(new_params)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def add_path_parameters(request, add_params)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher set_path_parameters(request, params(request).merge(add_params))
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherend
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherclass FilesRouterConstraint < RouterConstraint
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def matches?(request)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher return false if Repository.find_by_path(request.params[:repository_id]).nil?
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher result = !RepositoryFile.find_with_path(
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher params_path_without_format(request)).nil?
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher set_params_path_without_format(request) if result
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher return result
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
294e9a5521d327c5cdc49beeb9cb9e703b3134f1Jan Zeleny
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher protected
4e2d9fe30bf8b692972a9654c60d2d90ed355815Stephen Gallagher def params_path_without_format(request)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher @params = request.send(:env)["action_dispatch.request.path_parameters"]
a679f0167b646cffdae86546ed77e105576991b0Pavel Březina @path = @params[:path]
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher @path += ".#{@params[:format]}" if @params[:format]
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher @params.merge({ path: @path }).except(:format)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
f6cd1236c27817b97db002094b76648d92b55f82Jan Zeleny def set_params_path_without_format(request)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher params_path_without_format(request)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher @params.merge!({ path: @path }).except!(:format)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherend
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherclass LocIdRouterConstraint < RouterConstraint
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher ELEMENTS_CACHE_CLEARING_INTERVAL = 1.minute
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher @elements_cache_clear_at = Time.now + ELEMENTS_CACHE_CLEARING_INTERVAL
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher @elements_cache = {}
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def initialize(find_in_klass, **map)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher @find_in_klass = find_in_klass
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher @map = map
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher super()
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def matches?(request, path = nil)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher path ||= Journey::Router::Utils.
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher unescape_uri(request.original_fullpath)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher # retrieves the hierarchy and member portions of loc/id's
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher hierarchy_member = path.split('?', 2).first.split('///', 2).first
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher element =
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher elements_cache[hierarchy_member] ||
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher LocIdBaseModel.find_with_locid(hierarchy_member)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher if element.is_a?(@find_in_klass)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher elements_cache.delete(hierarchy_member)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher clear_elements_cache if elements_cache_clearing_scheduled?
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher assign_path_parameters(request, element)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher true
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher else
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher if !elements_cache.key?(hierarchy_member) && element
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher elements_cache[hierarchy_member] = element
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher false
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def elements_cache
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher self.class.instance_variable_get(:@elements_cache)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher # To keep the memory footprint low in case of unproper removal of cached
07b7b76d7cd494cbd26263503ba2732c21819941Jan Zeleny # elements, we clear the cache periodically. This prevents memory leaks.
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def clear_elements_cache
e82832a64fd456d1541ce0ea3902bcfb05e69642Stephen Gallagher next_clearing = Time.now + ELEMENTS_CACHE_CLEARING_INTERVAL
14452cd066b51e32ca0ebad6c45ae909a1debe57Jakub Hrozek self.class.instance_variable_set(:@elements_cache_clear_at, next_clearing)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher self.class.instance_variable_set(:@elements_cache, {})
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def elements_cache_clearing_scheduled?
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher Time.now > self.class.instance_variable_get(:@elements_cache_clear_at)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def assign_path_parameters(request, element)
a4cce2c98eedecb5d3b47da62104634cae268434Stephen Gallagher ontology = element.is_a?(Ontology) ? element : element.ontology
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher proof_attempt = element.proof_attempt if @map[:proof_attempt]
f6cd1236c27817b97db002094b76648d92b55f82Jan Zeleny theorem = element.theorem if @map[:theorem]
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher path_params = {repository_id: ontology.repository.to_param}
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher %i(proof_attempt theorem ontology element).each do |p|
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher path_params[@map[p]] = binding.local_variable_get(p).id if @map[p]
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher add_path_parameters(request, path_params)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherend
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherclass RefLocIdRouterConstraint < LocIdRouterConstraint
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def matches?(request)
ceb40cb8846ff755f841466908954087f927eae7Jakub Hrozek params = params(request)
67ca9e7c006d8619f446c018eabf29eab1368ba5Ondrej Kos result = OntologyVersionFinder.
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher applicable_reference?(params[:reference])
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher path = Journey::Router::Utils.unescape_uri(request.original_fullpath)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher result && update_version_id!(request, path.dup)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
ae5381b3a81ed4dee51e3ac56ddabd0bf7641c86Jakub Hrozek def update_version_id!(request, path)
fae99bfe4bfc8b4a12e9c2a0ad01b3684c22f934Simo Sorce version = OntologyVersionFinder.find(path)
6263578b03a52b3ec3a2e33e097554241780fc20Lukas Slebodnik version_id = version.try(:to_param)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher ontology_id = version.try(:ontology).try(:to_param)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher add_path_parameters(request, id: version_id, ontology_id: ontology_id)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher !! version_id
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherend
07b7b76d7cd494cbd26263503ba2732c21819941Jan Zeleny
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherclass MMTRouterConstraint < LocIdRouterConstraint
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def matches?(request)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher path = request.original_fullpath.
4f2e932acd5266e9d4e3f55966baafbdbd2ae210Ondrej Kos # Convert MMT to standard Loc/Id
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher gsub(/\?+/, '//').
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher # Prune ref-portion
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher sub('/ref/mmt', '')
07b7b76d7cd494cbd26263503ba2732c21819941Jan Zeleny super(request, path)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherend
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
1b171c456ff901ab622e44bcfd213f7de86fd787Ariel Barriaclass IRIRouterConstraint < RouterConstraint
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def matches?(request, path = nil)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher path ||= Journey::Router::Utils.
e82832a64fd456d1541ce0ea3902bcfb05e69642Stephen Gallagher unescape_uri(request.original_fullpath)
edaa983d094c239c3e1ba667bcd20ed3934be3b8Sumit Bose ontology = Ontology.find_with_iri(path)
14452cd066b51e32ca0ebad6c45ae909a1debe57Jakub Hrozek result = !ontology.nil?
2c29d0fdc26e0b217ed96248852779cafb2367c9Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher if result
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher set_path_parameters(request,
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher repository_id: ontology.repository.to_param, id: ontology.id)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher return result
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherend
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherclass RefIRIRouterConstraint < IRIRouterConstraint
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def matches?(request)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher # remove the ref/:version_number portion from path
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher path = Journey::Router::Utils.unescape_uri(request.original_fullpath).
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher sub(%r{\A/ref/\d+/}, '')
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher super(request, path)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherend
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherclass MIMERouterConstraint < RouterConstraint
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher attr_accessor :mime_types
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def initialize(*mime_types)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher self.mime_types = mime_types.flatten.map { |m| Mime::Type.lookup(m) }
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher super()
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher # In some cases request.accepts == [nil] (e.g. cucumber tests),
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher # in these cases we will default to true.
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def matches?(request)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher highest_mime = request.accepts.first
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher highest_mime ? mime_types.any? { |m| highest_mime == m } : true
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherend
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherclass GroupedConstraint
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher attr_accessor :constraints
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def initialize(*args)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher self.constraints = args.flatten
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher def matches?(request)
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher constraints.all? { |c| c.matches?(request) }
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher end
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagherend
effcbdb12c7ef892f1fd92a745cb33a08ca4ba30Stephen Gallagher