Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 05b2c40

Browse files
authored
Merge pull request #200 from marklogic/feature/196-regex
Now support glob expressions for properties files
2 parents c41d7a6 + e9f38d9 commit 05b2c40

File tree

8 files changed

+87
-50
lines changed

8 files changed

+87
-50
lines changed

src/main/java/com/marklogic/client/ext/file/CollectionsFileDocumentFileProcessor.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
*/
1616
package com.marklogic.client.ext.file;
1717

18-
import java.util.Properties;
19-
2018
/**
2119
* Looks for a special file in each directory - defaults to collections.properties - that contains properties where the
2220
* key is the name of a file in the directory, and the value is a comma-delimited list of collections to load the file
@@ -34,18 +32,8 @@ public CollectionsFileDocumentFileProcessor(String propertiesFilename) {
3432
super(propertiesFilename);
3533
}
3634

37-
@Override
38-
protected void processProperties(DocumentFile documentFile, Properties properties) {
39-
String name = documentFile.getFile().getName();
40-
if (properties.containsKey(name)) {
41-
String value = getPropertyValue(properties, name);
42-
documentFile.getDocumentMetadata().withCollections(value.split(delimiter));
43-
}
44-
45-
if (properties.containsKey(WILDCARD_KEY)) {
46-
String value = getPropertyValue(properties, WILDCARD_KEY);
47-
documentFile.getDocumentMetadata().withCollections(value.split(delimiter));
48-
}
35+
protected void applyPropertyMatch(DocumentFile documentFile, String pattern, String value) {
36+
documentFile.getDocumentMetadata().withCollections(value.split(delimiter));
4937
}
5038

5139
public String getDelimiter() {

src/main/java/com/marklogic/client/ext/file/PermissionsFileDocumentFileProcessor.java

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818
import com.marklogic.client.ext.util.DocumentPermissionsParser;
1919

20+
import java.nio.file.FileSystems;
21+
import java.nio.file.Path;
22+
import java.nio.file.PathMatcher;
23+
import java.util.Enumeration;
2024
import java.util.Properties;
2125

2226
/**
@@ -46,26 +50,11 @@ public PermissionsFileDocumentFileProcessor(String propertiesFilename, DocumentP
4650
this.documentPermissionsParser = documentPermissionsParser;
4751
}
4852

49-
@Override
50-
protected void processProperties(DocumentFile documentFile, Properties properties) {
51-
String name = documentFile.getFile().getName();
52-
if (properties.containsKey(name)) {
53-
String value = getPropertyValue(properties, name);
54-
if (documentPermissionsParser != null) {
55-
documentPermissionsParser.parsePermissions(value, documentFile.getDocumentMetadata().getPermissions());
56-
} else {
57-
documentFile.getDocumentMetadata().getPermissions().addFromDelimitedString(value);
58-
}
59-
60-
}
61-
62-
if (properties.containsKey(WILDCARD_KEY)) {
63-
String value = getPropertyValue(properties, WILDCARD_KEY);
64-
if (documentPermissionsParser != null) {
65-
documentPermissionsParser.parsePermissions(value, documentFile.getDocumentMetadata().getPermissions());
66-
} else {
67-
documentFile.getDocumentMetadata().getPermissions().addFromDelimitedString(value);
68-
}
53+
protected void applyPropertyMatch(DocumentFile documentFile, String pattern, String value) {
54+
if (documentPermissionsParser != null) {
55+
documentPermissionsParser.parsePermissions(value, documentFile.getDocumentMetadata().getPermissions());
56+
} else {
57+
documentFile.getDocumentMetadata().getPermissions().addFromDelimitedString(value);
6958
}
7059
}
7160

src/main/java/com/marklogic/client/ext/file/PropertiesDrivenDocumentFileProcessor.java

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
import java.io.FileFilter;
2323
import java.io.FileReader;
2424
import java.io.IOException;
25+
import java.nio.file.FileSystems;
26+
import java.nio.file.Path;
27+
import java.nio.file.PathMatcher;
28+
import java.util.Enumeration;
2529
import java.util.Properties;
2630

2731
/**
@@ -31,8 +35,6 @@
3135
public abstract class PropertiesDrivenDocumentFileProcessor extends LoggingObject
3236
implements DocumentFileProcessor, FileFilter, SupportsTokenReplacer {
3337

34-
protected final static String WILDCARD_KEY = "*";
35-
3638
private final String propertiesFilename;
3739

3840
private Properties properties;
@@ -62,17 +64,47 @@ public DocumentFile processDocumentFile(DocumentFile documentFile) {
6264
return documentFile;
6365
}
6466

65-
protected abstract void processProperties(DocumentFile documentFile, Properties properties);
67+
/**
68+
* New in 4.7.0 - each pattern in the properties object is now assumed to be a glob pattern; this retains backwards
69+
* compatibility with the previous approach of only supporting "*" and exact filename matches. When a property
70+
* is found to match the given file, then a subclass method is invoked to determine what to do with the value
71+
* associated with the property.
72+
*
73+
* @param documentFile
74+
* @param properties
75+
*/
76+
private void processProperties(DocumentFile documentFile, Properties properties) {
77+
final Path filename = documentFile.getFile().toPath().getFileName();
78+
Enumeration patterns = properties.propertyNames();
79+
while (patterns.hasMoreElements()) {
80+
String pattern = (String) patterns.nextElement();
81+
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);
82+
if (matcher.matches(filename)) {
83+
String value = getPropertyValue(properties, pattern);
84+
this.applyPropertyMatch(documentFile, pattern, value);
85+
}
86+
}
87+
}
6688

67-
protected Properties loadProperties(File propertiesFile) throws IOException {
89+
/**
90+
* Subclasses must implement this to determine how to apply the value of a matching property to the given
91+
* {@code DocumentFile}.
92+
*
93+
* @param documentFile
94+
* @param pattern
95+
* @param value
96+
*/
97+
protected abstract void applyPropertyMatch(DocumentFile documentFile, String pattern, String value);
98+
99+
protected final Properties loadProperties(File propertiesFile) throws IOException {
68100
properties = new Properties();
69101
try (FileReader reader = new FileReader(propertiesFile)) {
70102
properties.load(reader);
71103
return properties;
72104
}
73105
}
74106

75-
protected String getPropertyValue(Properties properties, String propertyName) {
107+
private String getPropertyValue(Properties properties, String propertyName) {
76108
if (properties == null || propertyName == null) {
77109
return null;
78110
}
@@ -89,10 +121,6 @@ public void setTokenReplacer(TokenReplacer tokenReplacer) {
89121
this.tokenReplacer = tokenReplacer;
90122
}
91123

92-
protected TokenReplacer getTokenReplacer() {
93-
return tokenReplacer;
94-
}
95-
96124
protected void setProperties(Properties properties) {
97125
this.properties = properties;
98126
}

src/test/java/com/marklogic/client/ext/file/CollectionsFileDocumentFileProcessorTest.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package com.marklogic.client.ext.file;
1717

1818
import com.marklogic.client.ext.tokenreplacer.DefaultTokenReplacer;
19+
import com.marklogic.client.io.DocumentMetadataHandle;
1920
import org.junit.jupiter.api.Test;
2021

2122
import java.io.File;
@@ -37,15 +38,30 @@ public void wildcard() throws IOException {
3738

3839
DocumentFile file = new DocumentFile("/test.json", new File(testDir, "test.json"));
3940
processor.processDocumentFile(file);
40-
assertTrue(file.getDocumentMetadata().getCollections().contains("json-data"));
41-
assertFalse(file.getDocumentMetadata().getCollections().contains("xml-data"));
42-
assertTrue(file.getDocumentMetadata().getCollections().contains("global"));
41+
DocumentMetadataHandle.DocumentCollections collections = file.getDocumentMetadata().getCollections();
42+
assertEquals(3, collections.size(), "test.json should have the *, test.json, and *.json rules applied for it.");
43+
assertTrue(collections.contains("json-data"));
44+
assertTrue(collections.contains("json-data-wildcard"));
45+
assertFalse(collections.contains("xml-data"));
46+
assertTrue(collections.contains("global"));
47+
48+
file = new DocumentFile("/test-1.json", new File(testDir, "test-1.json"));
49+
processor.processDocumentFile(file);
50+
collections = file.getDocumentMetadata().getCollections();
51+
assertEquals(2, collections.size(), "test-1.json should have the * and *.json rules applied for it.");
52+
assertFalse(collections.contains("json-data"));
53+
assertTrue(collections.contains("json-data-wildcard"));
54+
assertFalse(collections.contains("xml-data"));
55+
assertTrue(collections.contains("global"));
4356

4457
file = new DocumentFile("/test.xml", new File(testDir, "test.xml"));
4558
processor.processDocumentFile(file);
46-
assertFalse(file.getDocumentMetadata().getCollections().contains("json-data"));
47-
assertTrue(file.getDocumentMetadata().getCollections().contains("xml-data"));
48-
assertTrue(file.getDocumentMetadata().getCollections().contains("global"));
59+
collections = file.getDocumentMetadata().getCollections();
60+
assertEquals(2, collections.size(), "test.xml should have the * and test.xml rules applied for it.");
61+
assertFalse(collections.contains("json-data"));
62+
assertFalse(collections.contains("json-data-wildcard"));
63+
assertTrue(collections.contains("xml-data"));
64+
assertTrue(collections.contains("global"));
4965
}
5066

5167
@Test

src/test/java/com/marklogic/client/ext/file/PermissionsFileDocumentFileProcessorTest.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,25 @@ public void wildcard() throws IOException {
4444
DocumentFile file = new DocumentFile("/test.json", new File(testDir, "test.json"));
4545
processor.processDocumentFile(file);
4646
DocumentMetadataHandle.DocumentPermissions permissions = file.getDocumentMetadata().getPermissions();
47+
assertEquals(3, permissions.size(), "test.json should have the *, test.json, and *.json rules applied to it");
4748
assertTrue(permissions.get("manage-user").contains(DocumentMetadataHandle.Capability.READ));
4849
assertTrue(permissions.get("manage-user").contains(DocumentMetadataHandle.Capability.UPDATE));
4950
assertTrue(permissions.get("manage-admin").contains(DocumentMetadataHandle.Capability.UPDATE));
50-
assertNull(permissions.get("qconsole-user"));
51+
assertTrue(permissions.get("qconsole-user").contains(DocumentMetadataHandle.Capability.READ));
52+
53+
file = new DocumentFile("/test-1.json", new File(testDir, "test-1.json"));
54+
processor.processDocumentFile(file);
55+
permissions = file.getDocumentMetadata().getPermissions();
56+
assertEquals(2, permissions.size(), "test-1.json should have the * and *.json rules applied to it");
57+
assertTrue(permissions.get("manage-user").contains(DocumentMetadataHandle.Capability.READ));
58+
assertFalse(permissions.get("manage-user").contains(DocumentMetadataHandle.Capability.UPDATE));
59+
assertNull(permissions.get("manage-admin"));
60+
assertTrue(permissions.get("qconsole-user").contains(DocumentMetadataHandle.Capability.READ));
5161

5262
file = new DocumentFile("/test.xml", new File(testDir, "test.xml"));
5363
processor.processDocumentFile(file);
5464
permissions = file.getDocumentMetadata().getPermissions();
65+
assertEquals(2, permissions.size(), "test.xml should have the * and test.xml rules applied to it");
5566
assertTrue(permissions.get("manage-user").contains(DocumentMetadataHandle.Capability.READ));
5667
assertFalse(permissions.get("manage-user").contains(DocumentMetadataHandle.Capability.UPDATE));
5768
assertNull(permissions.get("manage-admin"));
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
*=global
22
test.json=json-data
3+
*.json=json-data-wildcard
34
test.xml=xml-data
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
*=manage-user,read
22
test.json=manage-user,update,manage-admin,update
3+
*.json=qconsole-user,read
34
test.xml=qconsole-user,update
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"test": "test-1"
3+
}

0 commit comments

Comments
 (0)