1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package io.github.prolobjectlink.prolog.tuprolog;
23
24 import static io.github.prolobjectlink.prolog.PrologTermType.OBJECT_TYPE;
25
26 import alice.tuprolog.Struct;
27 import alice.tuprolog.Term;
28 import alice.tuprolog.lib.InvalidObjectIdException;
29 import alice.tuprolog.lib.OOLibrary;
30 import io.github.prolobjectlink.prolog.PrologError;
31 import io.github.prolobjectlink.prolog.PrologProvider;
32 import io.github.prolobjectlink.prolog.PrologReference;
33 import io.github.prolobjectlink.prolog.PrologTerm;
34
35 public class TuPrologReference extends TuPrologTerm implements PrologReference {
36
37 private static final OOLibrary OO_LIBRARY = new OOLibrary();
38
39 TuPrologReference(PrologProvider provider, Term reference) {
40 super(OBJECT_TYPE, provider, reference);
41 }
42
43 TuPrologReference(PrologProvider provider, Object reference) {
44 super(OBJECT_TYPE, provider, set(reference));
45 }
46
47 public Class<?> getReferenceType() {
48 return getObject().getClass();
49 }
50
51 public int getArity() {
52 Struct object = (Struct) value;
53 return object.getArity();
54 }
55
56 public String getFunctor() {
57 Struct object = (Struct) value;
58 return object.getName();
59 }
60
61 public PrologTerm[] getArguments() {
62 return new PrologTerm[0];
63 }
64
65 public Object getObject() {
66 return get((Struct) value);
67 }
68
69 static Struct set(Object reference) {
70 return OO_LIBRARY.register(reference);
71 }
72
73 static Object get(Struct id) {
74 try {
75 return OO_LIBRARY.getRegisteredObject(id);
76 } catch (InvalidObjectIdException e) {
77 throw new PrologError(e.getMessage(), e);
78 }
79 }
80
81 }