2929import com .inrupt .rdf .wrapping .commons .WrapperIRI ;
3030
3131import java .net .URI ;
32+ import java .util .Collections ;
33+ import java .util .List ;
34+ import java .util .Map ;
3235import java .util .Set ;
3336import java .util .UUID ;
3437import java .util .function .Consumer ;
@@ -54,6 +57,17 @@ public class AccessControlResource extends RDFSource {
5457
5558 public static final URI SOLID_ACCESS_GRANT = URI .create ("http://www.w3.org/ns/solid/vc#SolidAccessGrant" );
5659
60+ private static final Map <URI , IRI > EXPANSION_MAPPINGS = Map .of (
61+ ACP .accessControl , asIRI (ACP .AccessControl ),
62+ ACP .memberAccessControl , asIRI (ACP .AccessControl ),
63+ ACP .apply , asIRI (ACP .Policy ),
64+ ACP .allOf , asIRI (ACP .Matcher ),
65+ ACP .anyOf , asIRI (ACP .Matcher ),
66+ ACP .noneOf , asIRI (ACP .Matcher ));
67+
68+ private static final List <URI > EXPANSION_PROPERTIES = List .of (ACP .accessControl , ACP .memberAccessControl ,
69+ ACP .apply , ACP .allOf , ACP .anyOf , ACP .noneOf );
70+
5771 /**
5872 * Definitions for different matcher types, for use with {@link #find}.
5973 */
@@ -127,23 +141,13 @@ public Set<AccessControl> memberAccessControl() {
127141 public AccessControlResource expand (final SolidSyncClient client ) {
128142 // Copy the data from the existing ACR into a new dataset
129143 final var dataset = rdf .createDataset ();
130- final var matcherType = asIRI (ACP .Matcher );
131- final var accessControlType = asIRI (ACP .AccessControl );
132144 stream ().forEach (dataset ::add );
133145
134146 try (final var cache = rdf .createDataset ()) {
135- expandType (dataset , cache , asIRI (ACP .accessControl ), accessControlType ,
136- uri -> populateCache (client , uri , cache ));
137- expandType (dataset , cache , asIRI (ACP .memberAccessControl ), accessControlType ,
138- uri -> populateCache (client , uri , cache ));
139- expandType (dataset , cache , asIRI (ACP .apply ), asIRI (ACP .Policy ),
140- uri -> populateCache (client , uri , cache ));
141- expandType (dataset , cache , asIRI (ACP .allOf ), matcherType ,
142- uri -> populateCache (client , uri , cache ));
143- expandType (dataset , cache , asIRI (ACP .anyOf ), matcherType ,
144- uri -> populateCache (client , uri , cache ));
145- expandType (dataset , cache , asIRI (ACP .noneOf ), matcherType ,
147+ for (final var property : EXPANSION_PROPERTIES ) {
148+ expandType (dataset , cache , asIRI (property ), EXPANSION_MAPPINGS .get (property ),
146149 uri -> populateCache (client , uri , cache ));
150+ }
147151 } catch (final Exception ex ) {
148152 LOGGER .atDebug ().setMessage ("Unable to close dataset: {}" ).addArgument (ex ::getMessage ).log ();
149153 }
@@ -162,21 +166,11 @@ public AccessControlResource expand(final SolidClient client) {
162166 final var dataset = rdf .createDataset ();
163167 stream ().forEach (dataset ::add );
164168
165- final var matcherType = asIRI (ACP .Matcher );
166- final var accessControlType = asIRI (ACP .AccessControl );
167169 try (final var cache = rdf .createDataset ()) {
168- expandType (dataset , cache , asIRI (ACP .accessControl ), accessControlType ,
169- uri -> populateCacheAsync (client , uri , cache ));
170- expandType (dataset , cache , asIRI (ACP .memberAccessControl ), accessControlType ,
171- uri -> populateCacheAsync (client , uri , cache ));
172- expandType (dataset , cache , asIRI (ACP .apply ), asIRI (ACP .Policy ),
173- uri -> populateCacheAsync (client , uri , cache ));
174- expandType (dataset , cache , asIRI (ACP .allOf ), matcherType ,
175- uri -> populateCacheAsync (client , uri , cache ));
176- expandType (dataset , cache , asIRI (ACP .anyOf ), matcherType ,
177- uri -> populateCacheAsync (client , uri , cache ));
178- expandType (dataset , cache , asIRI (ACP .noneOf ), matcherType ,
179- uri -> populateCacheAsync (client , uri , cache ));
170+ for (final var property : EXPANSION_PROPERTIES ) {
171+ expandType (dataset , cache , asIRI (property ), EXPANSION_MAPPINGS .get (property ),
172+ uri -> populateCacheAsync (client , uri , cache ));
173+ }
180174 } catch (final Exception ex ) {
181175 LOGGER .atDebug ().setMessage ("Unable to close dataset: {}" ).addArgument (ex ::getMessage ).log ();
182176 }
@@ -208,37 +202,41 @@ public void compact() {
208202 /**
209203 * Merge two or more policies into a single policies with combined matchers.
210204 *
205+ * @param allow the modes to allow
211206 * @param policies the policies to merge
212207 * @return the merged policy
213208 */
214- public Policy merge (final Policy ... policies ) {
209+ public Policy merge (final Set < URI > allow , final Policy ... policies ) {
215210 final var baseUri = getIdentifier ().getScheme () + ":" + getIdentifier ().getSchemeSpecificPart ();
216211 final var policy = new Policy (asIRI (baseUri + "#" + UUID .randomUUID ()), getGraph ());
217212 for (final var p : policies ) {
218213 policy .allOf ().addAll (p .allOf ());
219214 policy .anyOf ().addAll (p .anyOf ());
220215 policy .noneOf ().addAll (p .noneOf ());
221216 }
217+ policy .allow ().addAll (allow );
222218 return policy ;
223219 }
224220
225221 /**
226222 * Find a policy, given a type, value and set of modes.
227223 *
228224 * @param type the matcher type
229- * @param value the matcher value
230- * @param modes the expected modes of the enclosing policy
225+ * @param value the matcher value, may be {@null}
226+ * @param modes the expected modes of the enclosing policy, may be {@null}
231227 * @return the matched policies
232228 */
233229 public Set <Policy > find (final MatcherType type , final URI value , final Set <URI > modes ) {
234- return stream (null , null , type .asIRI (), asIRI (value ))
230+ final IRI matcherValue = value != null ? asIRI (value ) : null ;
231+ final Set <URI > matcherModes = modes != null ? modes : Collections .emptySet ();
232+ return stream (null , null , type .asIRI (), matcherValue )
235233 .map (Quad ::getSubject )
236234 .flatMap (matcher -> stream (null , null , null , matcher ))
237235 .map (Quad ::getSubject )
238236 .filter (policy -> contains (null , policy , asIRI (RDF .type ), asIRI (ACP .Policy )))
239237 .filter (policy -> stream (null , policy , asIRI (ACP .allow ), null )
240238 .map (Quad ::getObject ).filter (IRI .class ::isInstance ).map (IRI .class ::cast )
241- .map (IRI ::getIRIString ).map (URI ::create ).toList ().containsAll (modes ))
239+ .map (IRI ::getIRIString ).map (URI ::create ).toList ().containsAll (matcherModes ))
242240 .map (policy -> new Policy (policy , getGraph ()))
243241 .collect (Collectors .toSet ());
244242 }
0 commit comments