router_constraints.rb revision 80021fb6bde14c39046950cdbaaadf767d173f94
a8c5a86d183db25a57bf193c06b41e092ec2e151Timo Sirainenclass RouterConstraint
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def set_path_parameters(request, new_params)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen params = request.send(:env)["action_dispatch.request.path_parameters"]
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen controller = params[:controller]
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen action = params[:action]
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen params.except!(*params.keys).merge!(
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen controller: controller,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen action: action).merge!(new_params)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen end
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenend
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainenclass FilesRouterConstraint < RouterConstraint
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen def matches?(request)
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen return false if Repository.find_by_path(request.params[:repository_id]).nil?
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen result = !RepositoryFile.find_with_path(
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen params_path_without_format(request)).nil?
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen set_params_path_without_format(request) if result
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen return result
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen end
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen protected
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen def params_path_without_format(request)
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen @params = request.send(:env)["action_dispatch.request.path_parameters"]
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen @path = @params[:path]
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen @path += ".#{@params[:format]}" if @params[:format]
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen @params.merge({ path: @path }).except(:format)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen end
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen def set_params_path_without_format(request)
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen params_path_without_format(request)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen @params.merge!({ path: @path }).except!(:format)
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen end
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenend
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenclass LocIdRouterConstraint < RouterConstraint
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen def initialize(find_in_klass, **map)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen @find_in_klass = find_in_klass
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen @map = map
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen super()
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen end
022412398e56a8f31ef111cfd7271498d64af9a9Timo Sirainen
1a073dd6184645b026583274e05afba10dcc20bbTimo Sirainen def matches?(request, path = nil)
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen path ||= request.original_fullpath
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen # retrieves the hierarchy and member portions of loc/id's
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen hierarchy_member = path.split('?', 2).first.split('///', 2).first
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen element = @find_in_klass.find_with_locid(hierarchy_member)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ontology = element.respond_to?(:ontology) ? element.ontology : element
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen result = !ontology.nil?
7a6b45405fb1544ac476e6eb1402a70cc1ddcdcfTimo Sirainen
e05ea8311ae16687295048e88ca205dfe29fbcbfTimo Sirainen if result
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen path_params = {repository_id: ontology.repository.to_param}
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen path_params[@map[:ontology]] = ontology.id if @map[:ontology]
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen path_params[@map[:element]] = element.id if @map[:element]
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen
f7d43647acc6dc80064c8c4cacf5bf86f754c530Timo Sirainen set_path_parameters(request, path_params)
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen end
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen return result
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen end
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainenend
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainenclass IRIRouterConstraint < RouterConstraint
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen def matches?(request, path = nil)
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen path ||= request.original_fullpath
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen ontology = Ontology.find_with_locid(path.split('?', 2).first)
b6d817f0effeff645aadc01fd468a7d4084ba1f2Timo Sirainen result = !ontology.nil?
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen if result
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen set_path_parameters(request,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen repository_id: ontology.repository.to_param, id: ontology.id)
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen end
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen return result
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen end
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainenend
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainenclass RefIRIRouterConstraint < IRIRouterConstraint
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen def matches?(request)
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen # remove the ref/:version_number portion from path
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen path = request.original_fullpath.sub(%r{\A/ref/\d+}, '')
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen super(request, path)
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen end
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainenend
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainenclass MIMERouterConstraint < RouterConstraint
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen attr_accessor :mime_types
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen def initialize(*mime_types)
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen self.mime_types = mime_types.flatten.map { |m| Mime::Type.lookup(m) }
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen super()
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen end
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen # In some cases request.accepts == [nil] (e.g. cucumber tests),
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen # in these cases we will default to true.
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen def matches?(request)
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen highest_mime = request.accepts.first
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen highest_mime ? mime_types.any? { |m| highest_mime == m } : true
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen end
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainenend
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainenclass GroupedConstraint
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen attr_accessor :constraints
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen def initialize(*args)
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen self.constraints = args.flatten
6288d3611eda14a017dae9927b73f46afb646c96Timo Sirainen end
a2637488c8d514ec1ac3914811deee814f9761b3Timo Sirainen
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen def matches?(request)
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen constraints.all? { |c| c.matches?(request) }
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen end
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainenend
299183fbb6ec5d0828a0880da372540421ac4665Timo Sirainen