Module: Cul::Hydra::Solrizer::AccessControlMetadataFields

Extended by:
ActiveSupport::Concern
Includes:
AccessLevels
Included in:
Datastreams::AccessControlMetadata
Defined in:
lib/cul_hydra/solrizer/access_control_metadata_fields.rb

Constant Summary collapse

XACML_NS =
{'xacml'=>'urn:oasis:names:tc:xacml:3.0:core:schema:wd-17'}
FUNCTION_EMBARGO =
"urn:oasis:names:tc:xacml:1.0:function:date-greater-than-or-equal".freeze
FUNCTION_ONE_STRING_MATCH =
"urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of".freeze
FUNCTION_ONE_URI_MATCH =
"urn:oasis:names:tc:xacml:1.0:function:anyURI-at-least-one-member-of".freeze
TYPE_DATE =
"http://www.w3.org/2001/XMLSchema#date".freeze
TYPE_STRING =
"http://www.w3.org/2001/XMLSchema#string".freeze
TYPE_URI =
"http://www.w3.org/2001/XMLSchema#anyURI".freeze
ATTRIBUTE_AFFILIATION =
"http://www.ja-sig.org/products/cas/affiliation".freeze

Constants included from AccessLevels

AccessLevels::ACCESS_LEVEL_AFFILIATION, AccessLevels::ACCESS_LEVEL_CLASSROOM, AccessLevels::ACCESS_LEVEL_CLOSED, AccessLevels::ACCESS_LEVEL_EMBARGO, AccessLevels::ACCESS_LEVEL_ONSITE, AccessLevels::ACCESS_LEVEL_PUBLIC, AccessLevels::ACCESS_LEVEL_REQUEST

Instance Method Summary collapse

Instance Method Details

#access_levelsObject



34
35
36
# File 'lib/cul_hydra/solrizer/access_control_metadata_fields.rb', line 34

def access_levels
  policy&.xpath('./xacml:Rule/xacml:Description', XACML_NS).map(&:text)
end

#permissionsObject



42
43
44
# File 'lib/cul_hydra/solrizer/access_control_metadata_fields.rb', line 42

def permissions
  policy&.xpath('./xacml:Rule[@Effect=\'Permit\']/xacml:Condition', XACML_NS)
end

#permissions_indicated?Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/cul_hydra/solrizer/access_control_metadata_fields.rb', line 38

def permissions_indicated?
  permissions&.length > 0
end

#permit_affiliationsObject



46
47
48
49
50
51
52
53
54
# File 'lib/cul_hydra/solrizer/access_control_metadata_fields.rb', line 46

def permit_affiliations
  permissions&.map do |condition|
    if condition.xpath("../xacml:Description", XACML_NS).text.eql?(ACCESS_LEVEL_AFFILIATION)
      if condition['FunctionId'].eql?(FUNCTION_ONE_STRING_MATCH)
        condition.xpath(".//xacml:AttributeValue[@DataType='#{TYPE_STRING}']", XACML_NS).text
      end
    end
  end.compact
end

#permit_after_dateObject



66
67
68
69
70
71
72
73
74
# File 'lib/cul_hydra/solrizer/access_control_metadata_fields.rb', line 66

def permit_after_date
  permissions&.map do |condition|
    if condition.xpath("../xacml:Description", XACML_NS).text.eql?(ACCESS_LEVEL_EMBARGO)
      if condition['FunctionId'].eql?(FUNCTION_EMBARGO)
        condition.xpath("./xacml:AttributeValue[@DataType='#{TYPE_DATE}']", XACML_NS).text
      end
    end
  end.compact.first
end

#permit_locationsObject



56
57
58
59
60
61
62
63
64
# File 'lib/cul_hydra/solrizer/access_control_metadata_fields.rb', line 56

def permit_locations
  permissions&.map do |condition|
    if condition.xpath("../xacml:Description", XACML_NS).text.eql?(ACCESS_LEVEL_ONSITE)
      if condition['FunctionId'].eql?(FUNCTION_ONE_URI_MATCH)
        condition.xpath(".//xacml:AttributeValue[@DataType='#{TYPE_URI}']", XACML_NS).text
      end
    end
  end.compact
end

#policyObject



30
31
32
# File 'lib/cul_hydra/solrizer/access_control_metadata_fields.rb', line 30

def policy
  ng_xml.xpath('/xacml:Policy', XACML_NS).first
end

#to_solr(solr_doc = {}) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/cul_hydra/solrizer/access_control_metadata_fields.rb', line 18

def to_solr(solr_doc={})
  solr_doc = (defined? super) ? super : solr_doc

  return solr_doc if policy.nil?  # Return because there is nothing to process
  solr_doc['access_control_levels_ssim'] = access_levels
  solr_doc['access_control_permissions_bsi'] = permissions_indicated?
  solr_doc['access_control_embargo_dtsi'] = permit_after_date
  solr_doc['access_control_affiliations_ssim'] = permit_affiliations
  solr_doc['access_control_locations_ssim'] = permit_locations
  solr_doc
end