Skip to content

Commit 713b9cd

Browse files
committed
feat:update loading rules
1 parent 7a13dbb commit 713b9cd

File tree

4 files changed

+242
-20
lines changed

4 files changed

+242
-20
lines changed

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "odrl-evaluator",
3-
"version": "0.2.0",
3+
"version": "0.2.2",
44
"description": "An open implementation of an ODRL Evaluator that evaluates ODRL policies by generating Compliance Reports",
55
"main": "./dist/index.js",
66
"types": "./dist/index.d.ts",
@@ -12,10 +12,9 @@
1212
"dist"
1313
],
1414
"scripts": {
15-
"build": "npm run clean && npm run makeRules && tsc && npm run copy-files",
15+
"build": "npm run clean && npm run makeRules && tsc",
1616
"makeRules": "ts-node scripts/MakeRules.ts ",
1717
"clean": "rm -rf ./dist",
18-
"copy-files": "cp -r ./src/rules/ ./dist/",
1918
"demo:test-engine": "ts-node demo/test-n3-engine.ts",
2019
"demo:test-evaluator": "ts-node demo/test-n3-evaluator.ts",
2120
"prepare": "npm run build",

scripts/MakeRules.ts

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,38 @@ import * as path from "path"
22
import * as fs from "fs"
33
import { combineNotation3Files } from "../src/util/Notation3Util";
44

5-
// initialize the rules as ts class such that it can be used in the browser
65
const ruleDir = path.join(path.dirname(__filename), "..", "src", "rules");
7-
const fileNamesRulesFirst = ["built-ins.n3", "constraints.n3", "report.n3", "odrl-voc.ttl", "odrl-voc-inferences.ttl"];
8-
const fileNamesRulesSecond = ["activation-state.n3"];
96

10-
const firstStepRulePaths = fileNamesRulesFirst.map(fileName => path.join(ruleDir, fileName));
11-
const secondStepRulePaths = fileNamesRulesSecond.map(fileName => path.join(ruleDir, fileName));
7+
// initialize the rules as ts class such that it can be used in the browser
8+
function rules() {
9+
const multipleRunRules = createMultipleRunRules();
10+
const simpleRules = createSimpleRules();
11+
12+
const rules = multipleRunRules + '\n' + simpleRules;
13+
fs.writeFileSync(path.join(ruleDir, "Rules.ts"), rules);
14+
15+
}
16+
17+
function createMultipleRunRules(): string {
18+
const fileNamesRulesFirst = ["built-ins.n3", "constraints.n3", "report.n3", "odrl-voc.ttl", "odrl-voc-inferences.ttl"];
19+
const fileNamesRulesSecond = ["activation-state.n3"];
20+
21+
const firstStepRulePaths = fileNamesRulesFirst.map(fileName => path.join(ruleDir, fileName));
22+
const secondStepRulePaths = fileNamesRulesSecond.map(fileName => path.join(ruleDir, fileName));
23+
24+
const firstStepRules = combineNotation3Files(firstStepRulePaths);
25+
const secondStepRules = combineNotation3Files(secondStepRulePaths);
26+
const rules = `export const RULES: string[] = [\`${firstStepRules}\`, \`${secondStepRules}\`];`;
27+
return rules
28+
}
29+
30+
31+
function createSimpleRules(): string {
32+
const ruleName = 'simpleRules.n3';
33+
const rulePath = path.join(ruleDir, ruleName);
34+
const simpleRules = fs.readFileSync(rulePath, "utf-8");
35+
const rules = `export const SIMPLE_RULES: string[] = [\`${simpleRules}\`];`;
36+
return rules;
37+
}
1238

13-
const firstStepRules = combineNotation3Files(firstStepRulePaths);
14-
const secondStepRules = combineNotation3Files(secondStepRulePaths);
15-
const rules = `export const RULES: string[] = [\`${firstStepRules}\`, \`${secondStepRules}\`];`
16-
fs.writeFileSync(path.join(ruleDir, "Rules.ts"), rules)
39+
rules()

src/evaluator/Engine.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ import type { Quad } from '@rdfjs/types';
22
import { Store } from 'n3'
33
import { Reasoner } from "../reasoner/Reasoner";
44
import { EyeJsReasoner } from "../reasoner/EyeJsReasoner";
5-
import * as path from "path"
6-
import * as fs from "fs"
7-
import { RULES} from '../rules/Rules'
5+
import { RULES, SIMPLE_RULES} from '../rules/Rules'
86

97
export interface Engine {
108
evaluate(input: Quad[]): Promise<Quad[]>;
@@ -27,10 +25,7 @@ export class ODRLN3Engine implements Engine {
2725
export class ODRLEngine extends ODRLN3Engine {
2826
constructor(reasoner?: Reasoner) {
2927
reasoner = reasoner ?? new EyeJsReasoner();
30-
const ruleDir = path.join(path.dirname(__filename), "..", "rules");
31-
const rulePath = path.join(ruleDir, "simpleRules.n3");
32-
const rules = fs.readFileSync(rulePath, "utf-8");
33-
super(reasoner, [rules]);
28+
super(reasoner, SIMPLE_RULES);
3429
}
3530
}
3631

src/rules/Rules.ts

Lines changed: 206 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2570,4 +2570,209 @@ odrl:extract odrl:includedIn odrl:use.`, `@prefix : <http://example.org/> .
25702570
} =>
25712571
{
25722572
?report report:satisfactionState report:Unsatisfied .
2573-
} .`];
2573+
} .`];
2574+
export const SIMPLE_RULES: string[] = [`@prefix : <http://example.org/> .
2575+
@prefix math: <http://www.w3.org/2000/10/swap/math#> .
2576+
@prefix dct: <http://purl.org/dc/terms/> .
2577+
@prefix list: <http://www.w3.org/2000/10/swap/list#> .
2578+
@prefix log: <http://www.w3.org/2000/10/swap/log#> .
2579+
@prefix odrl: <http://www.w3.org/ns/odrl/2/> .
2580+
@prefix report: <https://w3id.org/force/compliance-report#> .
2581+
@prefix string: <http://www.w3.org/2000/10/swap/string#> .
2582+
@prefix temp: <http://example.com/request/> .
2583+
2584+
# uuid backward rule (component)
2585+
{
2586+
?input :getUUID ?urnUuid
2587+
}
2588+
<=
2589+
{
2590+
?input log:skolem ?uniqueNode .
2591+
?uniqueNode log:uuid ?uuidString .
2592+
( "urn:uuid:" ?uuidString ) string:concatenation ?urnUuidString .
2593+
?urnUuid log:uri ?urnUuidString .
2594+
} .
2595+
2596+
# Policy report
2597+
{
2598+
?policy a ?policyType .
2599+
?policyType list:in ( odrl:Agreement odrl:Set odrl:Policy odrl:Offer ) .
2600+
?policyRequest a odrl:Request .
2601+
temp:currentTime dct:issued ?time .
2602+
( ?policy ) :getUUID ?urnUuid .
2603+
}
2604+
=>
2605+
{
2606+
?urnUuid a report:PolicyReport ;
2607+
dct:created ?time ;
2608+
report:policy ?policy ;
2609+
report:policyRequest ?policyRequest .
2610+
} .
2611+
2612+
# Permission report (expecting explicit permission type)
2613+
# create permission report
2614+
{
2615+
?policyReport a report:PolicyReport ;
2616+
report:policy ?policy ;
2617+
report:policyRequest ?policyRequest .
2618+
?policy odrl:permission ?permission .
2619+
?policyRequest odrl:permission ?requestPermission .
2620+
( ?permission ) :getUUID ?urnUuid .
2621+
}
2622+
=>
2623+
{
2624+
?policyReport report:ruleReport ?urnUuid .
2625+
?urnUuid a report:PermissionReport ;
2626+
report:attemptState report:Attempted ;
2627+
report:rule ?permission ;
2628+
report:ruleRequest ?requestPermission .
2629+
} .
2630+
2631+
# check whether permission report is active
2632+
{
2633+
?urnUuid a report:PermissionReport ;
2634+
report:attemptState report:Attempted ;
2635+
report:rule ?permission ;
2636+
report:ruleRequest ?requestPermission .
2637+
2638+
# check for number of constraint reports
2639+
(
2640+
?template
2641+
{
2642+
?urnUuid report:premiseReport _:s
2643+
}
2644+
?L
2645+
) log:collectAllIn ?SCOPE .
2646+
?L list:length ?numberConstraints .
2647+
2648+
# check for satisfied constraints
2649+
(
2650+
?premiseReport
2651+
{
2652+
?urnUuid report:premiseReport ?premiseReport .
2653+
?premiseReport report:satisfactionState report:Satisfied .
2654+
}
2655+
?list
2656+
) log:collectAllIn ?SCOPE .
2657+
?list list:length ?satisfiedConstraints .
2658+
?satisfiedConstraints log:equalTo ?numberConstraints .
2659+
}
2660+
=>
2661+
{
2662+
?urnUuid report:activationState report:Active .
2663+
} .
2664+
{
2665+
?urnUuid a report:PermissionReport ;
2666+
report:attemptState report:Attempted ;
2667+
report:rule ?permission ;
2668+
report:ruleRequest ?requestPermission .
2669+
2670+
# check for number of constraint reports
2671+
(
2672+
?template
2673+
{
2674+
?urnUuid report:premiseReport _:s
2675+
}
2676+
?L
2677+
) log:collectAllIn ?SCOPE .
2678+
?L list:length ?numberConstraints .
2679+
2680+
# check for satisfied constraints
2681+
(
2682+
?premiseReport
2683+
{
2684+
?urnUuid report:premiseReport ?premiseReport .
2685+
?premiseReport report:satisfactionState report:Satisfied .
2686+
}
2687+
?list
2688+
) log:collectAllIn ?SCOPE .
2689+
?list list:length ?satisfiedConstraints .
2690+
?satisfiedConstraints log:notEqualTo ?numberConstraints .
2691+
}
2692+
=>
2693+
{
2694+
?urnUuid report:activationState report:Inactive .
2695+
} .
2696+
2697+
2698+
# Constraint report
2699+
2700+
# Target report
2701+
{
2702+
?ruleReport a report:PermissionReport ;
2703+
report:rule ?permission ;
2704+
report:ruleRequest ?requestPermission .
2705+
?permission odrl:target ?resource .
2706+
?requestPermission odrl:target ?requestedResource .
2707+
?resource log:equalTo ?requestedResource .
2708+
( ?resource ) :getUUID ?urnUuid .
2709+
}
2710+
=>
2711+
{
2712+
?ruleReport report:premiseReport ?urnUuid .
2713+
?urnUuid a report:TargetReport ;
2714+
report:satisfactionState report:Satisfied .
2715+
} .
2716+
# Party report
2717+
{
2718+
?ruleReport a report:PermissionReport ;
2719+
report:rule ?permission ;
2720+
report:ruleRequest ?requestPermission .
2721+
?permission odrl:assignee ?party .
2722+
?requestPermission odrl:assignee ?requestedParty .
2723+
?party log:equalTo ?requestedParty .
2724+
( ?party ) :getUUID ?urnUuid .
2725+
}
2726+
=>
2727+
{
2728+
?ruleReport report:premiseReport ?urnUuid .
2729+
?urnUuid a report:PartyReport ;
2730+
report:satisfactionState report:Satisfied .
2731+
} .
2732+
{
2733+
?ruleReport a report:PermissionReport ;
2734+
report:rule ?permission ;
2735+
report:ruleRequest ?requestPermission .
2736+
?permission odrl:assignee ?party .
2737+
?requestPermission odrl:assignee ?requestedParty .
2738+
?party log:notEqualTo ?requestedParty .
2739+
( ?party ) :getUUID ?urnUuid .
2740+
}
2741+
=>
2742+
{
2743+
?ruleReport report:premiseReport ?urnUuid .
2744+
?urnUuid a report:PartyReport ;
2745+
report:satisfactionState report:Unsatisfied .
2746+
} .
2747+
# Action report -> simple action
2748+
{
2749+
?ruleReport a report:PermissionReport ;
2750+
report:rule ?permission ;
2751+
report:ruleRequest ?requestPermission .
2752+
?permission odrl:action ?action .
2753+
?requestPermission odrl:action ?requestedAction .
2754+
?action log:equalTo ?requestedAction .
2755+
( ?action ) :getUUID ?urnUuid .
2756+
}
2757+
=>
2758+
{
2759+
?ruleReport report:premiseReport ?urnUuid .
2760+
?urnUuid a report:ActionReport ;
2761+
report:satisfactionState report:Satisfied .
2762+
} .
2763+
{
2764+
?ruleReport a report:PermissionReport ;
2765+
report:rule ?permission ;
2766+
report:ruleRequest ?requestPermission .
2767+
?permission odrl:action ?action .
2768+
?requestPermission odrl:action ?requestedAction .
2769+
?action log:notEqualTo ?requestedAction .
2770+
( ?action ) :getUUID ?urnUuid .
2771+
}
2772+
=>
2773+
{
2774+
?ruleReport report:premiseReport ?urnUuid .
2775+
?urnUuid a report:ActionReport ;
2776+
report:satisfactionState report:Unsatisfied .
2777+
} .
2778+
`];

0 commit comments

Comments
 (0)