diff --git a/jans-bom/pom.xml b/jans-bom/pom.xml
index d1f6e8b2742..14227c63384 100644
--- a/jans-bom/pom.xml
+++ b/jans-bom/pom.xml
@@ -710,7 +710,7 @@
com.couchbase.client
java-client
- 2.7.22
+ 3.3.2
@@ -744,7 +744,7 @@
com.github.jsqlparser
jsqlparser
- 4.2
+ 4.3
diff --git a/jans-core/script/src/main/java/io/jans/model/custom/script/type/persistence/PersistenceType.java b/jans-core/script/src/main/java/io/jans/model/custom/script/type/persistence/PersistenceType.java
index 83d4887bf48..92086941e81 100644
--- a/jans-core/script/src/main/java/io/jans/model/custom/script/type/persistence/PersistenceType.java
+++ b/jans-core/script/src/main/java/io/jans/model/custom/script/type/persistence/PersistenceType.java
@@ -10,7 +10,7 @@
import io.jans.model.SimpleCustomProperty;
import io.jans.model.custom.script.type.BaseExternalType;
-import io.jans.orm.exception.extension.PersistenceExtension;
+import io.jans.orm.extension.PersistenceExtension;
/**
* Base interface for persistence script
diff --git a/jans-core/service/src/main/java/io/jans/service/external/ExternalPersistenceExtensionService.java b/jans-core/service/src/main/java/io/jans/service/external/ExternalPersistenceExtensionService.java
index 94fd7b9ad1f..578ef3fffa8 100644
--- a/jans-core/service/src/main/java/io/jans/service/external/ExternalPersistenceExtensionService.java
+++ b/jans-core/service/src/main/java/io/jans/service/external/ExternalPersistenceExtensionService.java
@@ -21,7 +21,7 @@
import io.jans.model.custom.script.conf.CustomScriptConfiguration;
import io.jans.model.custom.script.type.persistence.PersistenceType;
import io.jans.orm.PersistenceEntryManager;
-import io.jans.orm.exception.extension.PersistenceExtension;
+import io.jans.orm.extension.PersistenceExtension;
import io.jans.service.custom.script.ExternalScriptService;
/**
diff --git a/jans-orm/.gitignore b/jans-orm/.gitignore
index 56bbf5c9641..431771766f6 100644
--- a/jans-orm/.gitignore
+++ b/jans-orm/.gitignore
@@ -1,4 +1,5 @@
# Eclipse project files
+.dbeaver
.settings
.project
.classpath
diff --git a/jans-orm/core/src/main/java/io/jans/orm/PersistenceEntryManager.java b/jans-orm/core/src/main/java/io/jans/orm/PersistenceEntryManager.java
index ba5896296f2..06d611c4fda 100644
--- a/jans-orm/core/src/main/java/io/jans/orm/PersistenceEntryManager.java
+++ b/jans-orm/core/src/main/java/io/jans/orm/PersistenceEntryManager.java
@@ -25,8 +25,9 @@
import jakarta.persistence.criteria.CriteriaUpdate;
import jakarta.persistence.metamodel.Metamodel;
import io.jans.orm.event.DeleteNotifier;
-import io.jans.orm.exception.extension.PersistenceExtension;
+import io.jans.orm.extension.PersistenceExtension;
import io.jans.orm.model.AttributeData;
+import io.jans.orm.model.AttributeType;
import io.jans.orm.model.BatchOperation;
import io.jans.orm.model.PagedResult;
import io.jans.orm.model.SearchScope;
@@ -94,6 +95,7 @@ PagedResult findPagedEntries(String primaryKey, Class entryClass, Filt
@Deprecated
void remove(String dn);
+ void removeByDn(String dn, String[] objectClasses);
void remove(String primaryKey, Class entryClass);
int remove(String primaryKey, Class entryClass, Filter filter, int count);
@@ -102,6 +104,7 @@ PagedResult findPagedEntries(String primaryKey, Class entryClass, Filt
void removeRecursively(String primaryKey);
void removeRecursively(String primaryKey, Class entryClass);
+ void removeRecursivelyFromDn(String primaryKey, String[] objectClasses);
boolean hasBranchesSupport(String primaryKey);
boolean hasExpirationSupport(String primaryKey);
@@ -126,7 +129,7 @@ Map> groupListByProperties(Class entryClass, List entries,
@Deprecated
List exportEntry(String dn);
- List exportEntry(String dn, String objectClass);
+ List exportEntry(String dn, String objectClass);
void importEntry(String dn, Class entryClass, List data);
@@ -135,6 +138,8 @@ Map> groupListByProperties(Class entryClass, List entries,
void setPersistenceExtension(PersistenceExtension persistenceExtension);
+ AttributeType getAttributeType(String primaryKey, Class entryClass, String propertyName);
+
boolean destroy();
default void clear() {
diff --git a/jans-orm/core/src/main/java/io/jans/orm/exception/extension/PersistenceExtension.java b/jans-orm/core/src/main/java/io/jans/orm/extension/PersistenceExtension.java
similarity index 91%
rename from jans-orm/core/src/main/java/io/jans/orm/exception/extension/PersistenceExtension.java
rename to jans-orm/core/src/main/java/io/jans/orm/extension/PersistenceExtension.java
index cfa9305fe69..ccc77e93cd3 100644
--- a/jans-orm/core/src/main/java/io/jans/orm/exception/extension/PersistenceExtension.java
+++ b/jans-orm/core/src/main/java/io/jans/orm/extension/PersistenceExtension.java
@@ -4,7 +4,7 @@
* Copyright (c) 2020, Janssen Project
*/
-package io.jans.orm.exception.extension;
+package io.jans.orm.extension;
/**
* Base interface for persistence script
diff --git a/jans-orm/core/src/main/java/io/jans/orm/impl/BaseEntryManager.java b/jans-orm/core/src/main/java/io/jans/orm/impl/BaseEntryManager.java
index 4e487e7f985..fd998889204 100644
--- a/jans-orm/core/src/main/java/io/jans/orm/impl/BaseEntryManager.java
+++ b/jans-orm/core/src/main/java/io/jans/orm/impl/BaseEntryManager.java
@@ -6,18 +6,52 @@
package io.jans.orm.impl;
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.codec.binary.Base64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.fasterxml.jackson.databind.ObjectMapper;
+
import io.jans.orm.PersistenceEntryManager;
-import io.jans.orm.annotation.*;
+import io.jans.orm.annotation.AttributeEnum;
+import io.jans.orm.annotation.AttributeName;
+import io.jans.orm.annotation.AttributesList;
+import io.jans.orm.annotation.CustomObjectClass;
+import io.jans.orm.annotation.DN;
+import io.jans.orm.annotation.DataEntry;
+import io.jans.orm.annotation.Expiration;
+import io.jans.orm.annotation.JsonObject;
+import io.jans.orm.annotation.LanguageTag;
+import io.jans.orm.annotation.ObjectClass;
+import io.jans.orm.annotation.SchemaEntry;
import io.jans.orm.exception.EntryPersistenceException;
import io.jans.orm.exception.InvalidArgumentException;
import io.jans.orm.exception.MappingException;
-import io.jans.orm.exception.extension.PersistenceExtension;
+import io.jans.orm.extension.PersistenceExtension;
import io.jans.orm.model.AttributeData;
import io.jans.orm.model.AttributeDataModification;
-import io.jans.orm.model.AttributeDataModification.AttributeModificationType;
+import io.jans.orm.model.AttributeType;
import io.jans.orm.model.SearchScope;
import io.jans.orm.model.base.LocalizedString;
+import io.jans.orm.model.AttributeDataModification.AttributeModificationType;
import io.jans.orm.operation.PersistenceOperationService;
import io.jans.orm.reflect.property.Getter;
import io.jans.orm.reflect.property.PropertyAnnotation;
@@ -26,24 +60,13 @@
import io.jans.orm.search.filter.Filter;
import io.jans.orm.util.ArrayHelper;
import io.jans.orm.util.StringHelper;
-import org.apache.commons.codec.binary.Base64;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Serializable;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
/**
* Abstract Entry Manager
*
- * @author Yuriy Movchan
- * @version April 25, 2022
+ * @author Yuriy Movchan Date: 10.07.2010
*/
-public abstract class BaseEntryManager implements PersistenceEntryManager {
+public abstract class BaseEntryManager implements PersistenceEntryManager {
private static final Logger LOG = LoggerFactory.getLogger(BaseEntryManager.class);
@@ -80,7 +103,7 @@ public abstract class BaseEntryManager implements PersistenceEntryManager {
protected static final int DEFAULT_PAGINATION_SIZE = 100;
- protected PersistenceOperationService operationService = null;
+ protected O operationService = null;
protected PersistenceExtension persistenceExtension = null;
@Override
@@ -447,7 +470,7 @@ protected boolean isEmptyAttributeValues(AttributeData attributeData) {
protected abstract void merge(String dn, String[] objectClasses, List attributeDataModifications, Integer expiration);
- protected abstract void removeByDn(String dn, String[] objectClasses);
+ public abstract void removeByDn(String dn, String[] objectClasses);
@Deprecated
public void remove(String primaryKey) {
@@ -467,7 +490,7 @@ public void remove(String primaryKey, Class entryClass) {
removeByDn(primaryKey, objectClasses);
}
- protected abstract void removeRecursivelyFromDn(String primaryKey, String[] objectClasses);
+ public abstract void removeRecursivelyFromDn(String primaryKey, String[] objectClasses);
@Deprecated
public void removeRecursively(String primaryKey) {
@@ -2226,6 +2249,11 @@ public void setPersistenceExtension(PersistenceExtension persistenceExtension) {
}
}
+ @Override
+ public AttributeType getAttributeType(String primaryKey, Class entryClass, String propertyName) {
+ throw new UnsupportedOperationException("Method not implemented.");
+ }
+
protected static final class PropertyComparator implements Comparator, Serializable {
private static final long serialVersionUID = 574848841116711467L;
diff --git a/jans-orm/core/src/main/java/io/jans/orm/model/AttributeType.java b/jans-orm/core/src/main/java/io/jans/orm/model/AttributeType.java
new file mode 100644
index 00000000000..6b567f6bf04
--- /dev/null
+++ b/jans-orm/core/src/main/java/io/jans/orm/model/AttributeType.java
@@ -0,0 +1,46 @@
+/*
+ * Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
+ *
+ * Copyright (c) 2020, Janssen Project
+ */
+
+package io.jans.orm.model;
+
+/**
+ * DB Attribute Type
+ *
+ * @author Yuriy Movchan Date: 07/04/2022
+ */
+public class AttributeType {
+ private final String name;
+ private final String type;
+ private final Boolean multiValued;
+
+ public AttributeType(String name, String type) {
+ this(name, type, null);
+ }
+
+ public AttributeType(String name, String type, Boolean multiValued) {
+ this.name = name;
+ this.type = type;
+ this.multiValued = multiValued;
+ }
+
+ public Boolean getMultiValued() {
+ return multiValued;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ @Override
+ public String toString() {
+ return "AttributeType [name=" + name + ", type=" + type + ", multiValued=" + multiValued + "]";
+ }
+
+}
diff --git a/jans-orm/core/src/main/java/io/jans/orm/model/Sort.java b/jans-orm/core/src/main/java/io/jans/orm/model/Sort.java
index 2e43d1494ca..47085ae47f9 100644
--- a/jans-orm/core/src/main/java/io/jans/orm/model/Sort.java
+++ b/jans-orm/core/src/main/java/io/jans/orm/model/Sort.java
@@ -33,6 +33,18 @@ public SortOrder getSortOrder() {
return sortOrder;
}
+ public static Sort desc(String name) {
+ return new Sort(name, SortOrder.DESCENDING);
+ }
+
+ public static Sort asc(String name) {
+ return new Sort(name, SortOrder.ASCENDING);
+ }
+
+ public static Sort def(String name) {
+ return new Sort(name, SortOrder.DEFAULT);
+ }
+
@Override
public int hashCode() {
final int prime = 31;
diff --git a/jans-orm/core/src/main/java/io/jans/orm/model/SortOrder.java b/jans-orm/core/src/main/java/io/jans/orm/model/SortOrder.java
index 4532c7b9618..c60ace029bb 100644
--- a/jans-orm/core/src/main/java/io/jans/orm/model/SortOrder.java
+++ b/jans-orm/core/src/main/java/io/jans/orm/model/SortOrder.java
@@ -12,14 +12,18 @@
import io.jans.orm.annotation.AttributeEnum;
/**
- * @author Val Pecaoco
+ * Sort order
+ *
+ * @author Yuriy Movchan Date: 04/22/2021
*/
public enum SortOrder implements AttributeEnum {
- ASCENDING("ascending"),
- DESCENDING("descending");
+ ASCENDING("ascending", "asc"),
+ DESCENDING("descending", "desc"),
+ DEFAULT("default", "def");
private String value;
+ private String shortValue;
private static Map MAP_BY_VALUES = new HashMap();
@@ -29,8 +33,9 @@ public enum SortOrder implements AttributeEnum {
}
}
- SortOrder(String value) {
+ SortOrder(String value, String shortValue) {
this.value = value;
+ this.shortValue = shortValue;
}
@Override
@@ -38,6 +43,10 @@ public String getValue() {
return value;
}
+ public String getShortValue() {
+ return shortValue;
+ }
+
public static SortOrder getByValue(String value) {
return MAP_BY_VALUES.get(value);
}
diff --git a/jans-orm/core/src/main/java/io/jans/orm/operation/PersistenceOperationService.java b/jans-orm/core/src/main/java/io/jans/orm/operation/PersistenceOperationService.java
index 6558185780b..508a14231e8 100644
--- a/jans-orm/core/src/main/java/io/jans/orm/operation/PersistenceOperationService.java
+++ b/jans-orm/core/src/main/java/io/jans/orm/operation/PersistenceOperationService.java
@@ -7,10 +7,10 @@
package io.jans.orm.operation;
import io.jans.orm.exception.AuthenticationException;
-import io.jans.orm.exception.extension.PersistenceExtension;
import io.jans.orm.exception.operation.ConnectionException;
import io.jans.orm.exception.operation.EntryConvertationException;
import io.jans.orm.exception.operation.SearchException;
+import io.jans.orm.extension.PersistenceExtension;
/**
* Base interface for Operation Service
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseAddBulkUserSample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseAddBulkUserSample.java
new file mode 100644
index 00000000000..b5d98839b3f
--- /dev/null
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseAddBulkUserSample.java
@@ -0,0 +1,144 @@
+/*
+ * Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
+ *
+ * Copyright (c) 2020, Janssen Project
+ */
+
+package io.jans.orm.couchbase;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.status.StatusLogger;
+
+import io.jans.orm.couchbase.impl.CouchbaseEntryManager;
+import io.jans.orm.couchbase.model.GluuStatus;
+import io.jans.orm.couchbase.model.SimpleUser;
+import io.jans.orm.model.base.CustomAttribute;
+import io.jans.orm.model.base.CustomObjectAttribute;
+import io.jans.orm.search.filter.Filter;
+import io.jans.orm.util.StringHelper;
+
+/**
+ * @author Yuriy Movchan Date: 06/16/2022
+ */
+public final class CouchbaseAddBulkUserSample {
+
+ private static final Logger LOG;
+
+ static {
+ StatusLogger.getLogger().setLevel(Level.OFF);
+ LoggingHelper.configureConsoleAppender();
+ LOG = Logger.getLogger(CouchbaseAddBulkUserSample.class);
+ }
+
+ private static AtomicLong successResult = new AtomicLong(0) ;
+ private static AtomicLong errorResult = new AtomicLong(0) ;
+ private static AtomicLong totalTime = new AtomicLong(0) ;
+ private static AtomicLong activeCount = new AtomicLong(0) ;
+
+ private CouchbaseAddBulkUserSample() {
+ }
+
+ public static void main(String[] args) throws InterruptedException {
+ // Prepare sample connection details
+ CouchbaseEntryManagerSample couchbaseEntryManagerSample = new CouchbaseEntryManagerSample();
+ final CouchbaseEntryManager couchbaseEntryManager = couchbaseEntryManagerSample.createCouchbaseEntryManager();
+
+ int countUsers = 1000000;
+ int threadCount = 200;
+ int threadIterationCount = countUsers / threadCount;
+
+ long totalStart = System.currentTimeMillis();
+ try {
+ ExecutorService executorService = Executors.newFixedThreadPool(threadCount, daemonThreadFactory());
+ for (int i = 0; i < threadCount; i++) {
+ activeCount.incrementAndGet();
+ final int count = i;
+ executorService.execute(new AddUserRunnable(i * threadIterationCount, (i + 1) * threadIterationCount - 1) {
+ @Override
+ public void run() {
+ long start = System.currentTimeMillis();
+ for (int j = startRange; j <= endRange; j++) {
+ long userUid = j;
+ String name = String.format("user%06d", userUid);
+ String sn = String.format("lastname%06d", userUid);
+ String cn = String.format("%s %s", name, sn);
+ String mail = String.format("%s@gluu.org", name);
+
+ String dn = String.format("inum=%06d,ou=people,o=jans", userUid);
+
+ SimpleUser newUser = new SimpleUser();
+ newUser.setDn(dn);
+ newUser.setUserId(name);
+ newUser.setUserPassword("topsecret" + j);
+ newUser.setDisplayName(cn);
+ newUser.setMail(mail);
+ newUser.setStatus(GluuStatus.ACTIVE);
+
+ CustomObjectAttribute customAttribute = new CustomObjectAttribute("givenName", name);
+ newUser.getCustomAttributes().add(customAttribute);
+
+ newUser.setAttributeValue("sn", sn);
+ newUser.setAttributeValue("cn", cn);
+
+ try {
+ couchbaseEntryManager.persist(newUser);
+ successResult.incrementAndGet();
+ } catch (Throwable e) {
+ errorResult.incrementAndGet();
+ System.out.println("ERROR !!!, thread: " + count + ", uid: " + name + ", error:" + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+
+ long end = System.currentTimeMillis();
+ long duration = end - start;
+ LOG.info("Thread " + count + " execution time: " + duration);
+ totalTime.addAndGet(duration);
+ activeCount.decrementAndGet();
+ }
+ });
+ }
+
+ while (activeCount.get() != 0) {
+ Thread.sleep(1000L);
+ }
+ } finally {
+ couchbaseEntryManager.destroy();
+ }
+ long totalEnd = System.currentTimeMillis();
+ long duration = totalEnd - totalStart;
+
+ LOG.info("Total execution time: " + duration + " after execution: " + (threadCount * threadIterationCount));
+
+ System.out.println(String.format("successResult: '%d', errorResult: '%d'", successResult.get(), errorResult.get()));
+ }
+
+ public static ThreadFactory daemonThreadFactory() {
+ return new ThreadFactory() {
+ public Thread newThread(Runnable runnable) {
+ Thread thread = new Thread(runnable);
+ thread.setDaemon(true);
+ return thread;
+ }
+ };
+ }
+
+ public static abstract class AddUserRunnable implements Runnable {
+
+ protected int startRange;
+ protected int endRange;
+
+ public AddUserRunnable(int startRange, int endRange) {
+ this.startRange = startRange;
+ this.endRange = endRange;
+ }
+ }
+
+}
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseBatchJobSample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseBatchJobSample.java
index ab4c61a51ed..91b8bcd5f66 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseBatchJobSample.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseBatchJobSample.java
@@ -11,9 +11,10 @@
import org.apache.logging.log4j.status.StatusLogger;
import io.jans.orm.couchbase.impl.CouchbaseEntryManager;
+import io.jans.orm.couchbase.model.SimpleCache;
import io.jans.orm.couchbase.model.SimpleClient;
import io.jans.orm.couchbase.model.SimpleSession;
-import io.jans.orm.couchbase.model.SimpleTokenCouchbase;
+import io.jans.orm.couchbase.model.SimpleToken;
import io.jans.orm.exception.EntryPersistenceException;
import io.jans.orm.model.BatchOperation;
import io.jans.orm.model.DefaultBatchOperation;
@@ -48,12 +49,12 @@ public static void main(String[] args) {
// Create Couchbase entry manager
final CouchbaseEntryManager couchbaseEntryManager = couchbaseEntryManagerSample.createCouchbaseEntryManager();
- BatchOperation tokenCouchbaseBatchOperation = new ProcessBatchOperation() {
+ BatchOperation tokenCouchbaseBatchOperation = new ProcessBatchOperation() {
private int processedCount = 0;
@Override
- public void performAction(List objects) {
- for (SimpleTokenCouchbase simpleTokenCouchbase : objects) {
+ public void performAction(List objects) {
+ for (SimpleToken simpleTokenCouchbase : objects) {
try {
CustomAttribute customAttribute = getUpdatedAttribute(couchbaseEntryManager, simpleTokenCouchbase.getDn(), "exp",
simpleTokenCouchbase.getAttribute("exp"));
@@ -70,7 +71,7 @@ public void performAction(List objects) {
};
final Filter filter1 = Filter.createPresenceFilter("exp");
- couchbaseEntryManager.findEntries("o=jans", SimpleTokenCouchbase.class, filter1, SearchScope.SUB, new String[] {"exp"},
+ couchbaseEntryManager.findEntries("ou=tokens,o=jans", SimpleToken.class, filter1, SearchScope.SUB, new String[] {"exp"},
tokenCouchbaseBatchOperation, 0, 0, 100);
BatchOperation sessionBatchOperation = new ProcessBatchOperation() {
@@ -95,34 +96,59 @@ public void performAction(List objects) {
};
final Filter filter2 = Filter.createPresenceFilter("jansLastAccessTime");
- couchbaseEntryManager.findEntries("o=jans", SimpleSession.class, filter2, SearchScope.SUB, new String[] {"jansLastAccessTime"},
+ couchbaseEntryManager.findEntries("ou=sessions,o=jans", SimpleSession.class, filter2, SearchScope.SUB, new String[] {"jansLastAccessTime"},
sessionBatchOperation, 0, 0, 100);
- BatchOperation clientBatchOperation = new ProcessBatchOperation() {
+ if (false) {
+ Calendar calendar = Calendar.getInstance();
+ Date jansLastAccessTimeDate = new Date();
+ calendar.setTime(jansLastAccessTimeDate);
+ calendar.add(Calendar.SECOND, 60);
+ Date date = calendar.getTime();
+
+ for (int i = 0; i < 1111; i++) {
+ String id = String.format("cache_%06d", i);
+ String dn = String.format("id=%s,ou=cache,o=jans", id);
+
+ SimpleCache newCache = new SimpleCache();
+ newCache.setDn(dn);
+ newCache.setId(id);
+ newCache.setData("{'sample_data': 'sample_data_value'}");
+ newCache.setExpirationDate(date);
+ newCache.setDeletable(true);
+
+ try {
+ couchbaseEntryManager.persist(newCache);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ BatchOperation clientBatchOperation = new ProcessBatchOperation() {
private int processedCount = 0;
@Override
- public void performAction(List objects) {
- for (SimpleClient simpleClient : objects) {
+ public void performAction(List objects) {
+ for (SimpleCache simpleCache : objects) {
processedCount++;
}
LOG.info("Total processed: " + processedCount);
}
};
-
final Filter filter3 = Filter.createPresenceFilter("exp");
- List result3 = couchbaseEntryManager.findEntries("o=jans", SimpleClient.class, filter3, SearchScope.SUB,
- new String[] {"exp"}, clientBatchOperation, 0, 0, 1000);
+ List result3 = couchbaseEntryManager.findEntries("ou=cache,o=jans", SimpleCache.class, filter3, SearchScope.SUB,
+ new String[] {"exp"}, clientBatchOperation, 0, 0, 333);
LOG.info("Result count (without collecting results): " + result3.size());
- BatchOperation clientBatchOperation2 = new DefaultBatchOperation() {
+ BatchOperation clientBatchOperation2 = new DefaultBatchOperation() {
private int processedCount = 0;
@Override
- public void performAction(List objects) {
- for (SimpleClient simpleClient : objects) {
+ public void performAction(List objects) {
+ for (SimpleCache simpleCache : objects) {
processedCount++;
}
@@ -131,8 +157,8 @@ public void performAction(List objects) {
};
final Filter filter4 = Filter.createPresenceFilter("exp");
- List result4 = couchbaseEntryManager.findEntries("o=jans", SimpleClient.class, filter4, SearchScope.SUB,
- new String[] {"exp"}, clientBatchOperation2, 0, 0, 1000);
+ List result4 = couchbaseEntryManager.findEntries("ou=cache,o=jans", SimpleCache.class, filter4, SearchScope.SUB,
+ new String[] {"exp"}, clientBatchOperation2, 0, 0, 333);
LOG.info("Result count (with collecting results): " + result4.size());
}
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseConcurentSessionUpdateSample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseConcurentSessionUpdateSample.java
index d4120026a02..eeab54a6e48 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseConcurentSessionUpdateSample.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseConcurentSessionUpdateSample.java
@@ -44,7 +44,7 @@ public static void main(String[] args) throws InterruptedException {
String sessionId = "xyzcyzxy-a41a-45ad-8a83-61485dbad561";
final String sessionDn = "uniqueIdentifier=" + sessionId + ",ou=session,o=jans";
final String userDn =
- "inum=@!E8F2.853B.1E7B.ACE2!0001!39A4.C163!0000!A8F2.DE1E.D7FB,ou=people,o=jans";
+ "inum=sample_concurrent_user_1,ou=people,o=jans";
final SimpleSessionState simpleSessionState = new SimpleSessionState();
simpleSessionState.setDn(sessionDn);
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseCustomMultiValuedTypesSample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseCustomMultiValuedTypesSample.java
index 848a5202ed6..7a6d517e82f 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseCustomMultiValuedTypesSample.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseCustomMultiValuedTypesSample.java
@@ -9,14 +9,15 @@
import java.util.Arrays;
import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import io.jans.orm.couchbase.impl.CouchbaseEntryManager;
import io.jans.orm.couchbase.model.SimpleUser;
import io.jans.orm.couchbase.operation.impl.CouchbaseConnectionProvider;
import io.jans.orm.model.base.CustomObjectAttribute;
import io.jans.orm.search.filter.Filter;
import io.jans.orm.util.StringHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* @author Yuriy Movchan Date: 09/16/2019
@@ -75,8 +76,8 @@ public static void main(String[] args) {
LOG.info("Cusom attributes '{}'", foundUpdatedUser.getCustomAttributes());
- Filter filter = Filter.createEqualityFilter(Filter.createLowercaseFilter("givenName"), StringHelper.toLowerCase("jon"));
- List foundUpdatedUsers = couchbaseEntryManager.findEntries("o=jans", SimpleUser.class, filter);
+ Filter filter = Filter.createEqualityFilter(Filter.createLowercaseFilter("givenName"), StringHelper.toLowerCase("john"));
+ List foundUpdatedUsers = couchbaseEntryManager.findEntries("ou=people,o=jans", SimpleUser.class, filter);
System.out.println(foundUpdatedUsers);
}
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseCustomStringAttributesSample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseCustomStringAttributesSample.java
index c499de4b638..e3c935548e9 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseCustomStringAttributesSample.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseCustomStringAttributesSample.java
@@ -9,6 +9,9 @@
import java.util.Arrays;
import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import io.jans.orm.couchbase.impl.CouchbaseEntryManager;
import io.jans.orm.couchbase.model.SimpleCustomStringUser;
import io.jans.orm.couchbase.model.UserRole;
@@ -16,9 +19,6 @@
import io.jans.orm.model.base.CustomAttribute;
import io.jans.orm.search.filter.Filter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
/**
* @author Yuriy Movchan Date: 09/27/2019
*/
@@ -43,7 +43,7 @@ public static void main(String[] args) {
newUser.setDn(String.format("inum=%s,ou=people,o=jans", System.currentTimeMillis()));
newUser.setUserId("sample_user_" + System.currentTimeMillis());
newUser.setUserPassword("test");
- newUser.getCustomAttributes().add(new CustomAttribute("streetAddress", Arrays.asList("London", "Texas", "Kiev")));
+ newUser.getCustomAttributes().add(new CustomAttribute("streetAddress", Arrays.asList("London", "Texas", "Kiev")).setMultiValued(false));
newUser.getCustomAttributes().add((new CustomAttribute("jansExternalUid", randomExternalUid)).setMultiValued(true));
newUser.setUserRole(UserRole.ADMIN);
@@ -59,14 +59,29 @@ public static void main(String[] args) {
LOG.info("Custom attributes '{}'", foundUser.getCustomAttributes());
for (CustomAttribute customAttribute : foundUser.getCustomAttributes()) {
- LOG.info("Found custom attribute '{}' with value '{}'", customAttribute.getName(), customAttribute.getValue());
+ LOG.info("Found custom attribute '{}' with value '{}'", customAttribute.getName(), customAttribute.getValues());
+ }
+
+ // Persist as multivalued
+ foundUser.setAttributeValues("streetAddress", Arrays.asList("London", "Texas", "Kiev"));
+ couchbaseEntryManager.merge(foundUser);
+
+ LOG.info("Updated User '{}' with uid '{}' and key '{}'", foundUser, foundUser.getUserId(), foundUser.getDn());
+
+ // Find added dummy user but use custom class with String values
+ SimpleCustomStringUser foundUser2 = couchbaseEntryManager.find(SimpleCustomStringUser.class, foundUser.getDn());
+ LOG.info("Found User '{}' with uid '{}' and key '{}'", foundUser, foundUser.getUserId(), foundUser.getDn());
+
+ LOG.info("Custom attributes '{}'", foundUser2.getCustomAttributes());
+ for (CustomAttribute customAttribute : foundUser2.getCustomAttributes()) {
+ LOG.info("Found custom attribute '{}' with value '{}'", customAttribute.getName(), customAttribute.getValues());
}
// Find by jsExternalUid
Filter jsExternalUidFilter = Filter.createEqualityFilter("jansExternalUid", randomExternalUid).multiValued();
List foundUsers = couchbaseEntryManager.findEntries("ou=people,o=jans", SimpleCustomStringUser.class, jsExternalUidFilter);
- for (SimpleCustomStringUser foundUser2 : foundUsers) {
- LOG.info("Found User '{}' by jsExternalUid with uid '{}' and key '{}'", foundUser2, foundUser2.getUserId(), foundUser2.getDn());
+ for (SimpleCustomStringUser foundUser3 : foundUsers) {
+ LOG.info("Found User '{}' by jsExternalUid with uid '{}' and key '{}'", foundUser3, foundUser3.getUserId(), foundUser3.getDn());
}
}
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseDeleteSample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseDeleteSample.java
index 2e46151757e..f18ee200be6 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseDeleteSample.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseDeleteSample.java
@@ -6,15 +6,22 @@
package io.jans.orm.couchbase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import io.jans.orm.couchbase.impl.CouchbaseEntryManager;
+import io.jans.orm.couchbase.model.GluuStatus;
+import io.jans.orm.couchbase.model.SimpleCache;
+import io.jans.orm.couchbase.model.SimpleUser;
import io.jans.orm.couchbase.operation.impl.CouchbaseConnectionProvider;
+import io.jans.orm.model.base.CustomObjectAttribute;
import io.jans.orm.model.base.DeletableEntity;
import io.jans.orm.search.filter.Filter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import java.util.Calendar;
import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
/**
* @author Yuriy Movchan Date: 11/03/2016
@@ -33,13 +40,38 @@ public static void main(String[] args) {
// Create Couchbase entry manager
CouchbaseEntryManager couchbaseEntryManager = couchbaseEntryManagerSample.createCouchbaseEntryManager();
+ Date now = new GregorianCalendar(TimeZone.getTimeZone("UTC")).getTime();
+ Calendar pastCalendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
+ pastCalendar.add(Calendar.SECOND, -60);
+ Date past = pastCalendar.getTime();
+
+ if (true) {
+ for (int i = 0; i < 1000; i++) {
+ String id = String.format("cache_%06d", i);
+ String dn = String.format("id=%s,ou=cache,o=jans", id);
+
+ SimpleCache newCache = new SimpleCache();
+ newCache.setDn(dn);
+ newCache.setId(id);
+ newCache.setData("{'sample_data': 'sample_data_value'}");
+ newCache.setExpirationDate(past);
+ newCache.setDeletable(true);
+
+ try {
+ couchbaseEntryManager.persist(newCache);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
String baseDn = "ou=cache,o=jans";
Filter filter = Filter.createANDFilter(
Filter.createEqualityFilter("del", true),
- Filter.createLessOrEqualFilter("exp", couchbaseEntryManager.encodeTime(baseDn, new Date()))
+ Filter.createLessOrEqualFilter("exp", couchbaseEntryManager.encodeTime(baseDn, now))
);
- int result = couchbaseEntryManager.remove(baseDn, DeletableEntity.class, filter, 100);
+ int result = couchbaseEntryManager.remove(baseDn, SimpleCache.class, filter, 2000);
System.out.println(result);
}
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseEntryManagerSample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseEntryManagerSample.java
index 5a0d87fef5c..d4b00f78d5a 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseEntryManagerSample.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseEntryManagerSample.java
@@ -9,6 +9,7 @@
import java.util.Properties;
import org.apache.log4j.Logger;
+
import io.jans.orm.couchbase.impl.CouchbaseEntryManager;
import io.jans.orm.couchbase.impl.CouchbaseEntryManagerFactory;
@@ -26,14 +27,19 @@ private Properties getSampleConnectionProperties() {
connectionProperties.put("couchbase#servers", "localhost");
connectionProperties.put("couchbase#auth.userName", "admin");
connectionProperties.put("couchbase#auth.userPassword", "secret");
-// connectionProperties.put("couchbase#buckets", "jans");
- connectionProperties.put("couchbase#buckets", "jans, jans_user, jans_token");
+
+ connectionProperties.put("couchbase#connection.dns.use-lookup", "false");
+
+ connectionProperties.put("couchbase#buckets", "jans, jans_user, jans_site, jans_cache, jans_token, jans_session");
connectionProperties.put("couchbase#bucket.default", "jans");
- connectionProperties.put("couchbase#bucket.jans_user.mapping", "people, groups");
- connectionProperties.put("couchbase#bucket.jans_token.mapping", "sessions");
+ connectionProperties.put("couchbase#bucket.jans_user.mapping", "people, groups, authorizations");
+ connectionProperties.put("couchbase#bucket.jans_site.mapping", "cache-refresh");
+ connectionProperties.put("couchbase#bucket.jans_cache.mapping", "cache");
+ connectionProperties.put("couchbase#bucket.jans_token.mapping", "tokens");
+ connectionProperties.put("couchbase#bucket.jans_session.mapping", "sessions");
- connectionProperties.put("couchbase#password.encryption.method", "CRYPT-SHA-256");
+ connectionProperties.put("couchbase#password.encryption.method", "SSHA-256");
return connectionProperties;
}
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseSample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseSample.java
index e7dab969c93..f0fd71fff0f 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseSample.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseSample.java
@@ -9,10 +9,13 @@
import java.util.Arrays;
import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import io.jans.orm.couchbase.impl.CouchbaseEntryManager;
import io.jans.orm.couchbase.model.SimpleAttribute;
-import io.jans.orm.couchbase.model.SimpleGrant;
import io.jans.orm.couchbase.model.SimpleSession;
+import io.jans.orm.couchbase.model.SimpleToken;
import io.jans.orm.couchbase.model.SimpleUser;
import io.jans.orm.couchbase.operation.impl.CouchbaseConnectionProvider;
import io.jans.orm.model.PagedResult;
@@ -21,9 +24,6 @@
import io.jans.orm.model.base.CustomObjectAttribute;
import io.jans.orm.search.filter.Filter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
/**
* @author Yuriy Movchan Date: 11/03/2016
*/
@@ -49,11 +49,8 @@ public static void main(String[] args) {
newUser.getCustomAttributes().add(new CustomObjectAttribute("test", "test_value"));
couchbaseEntryManager.persist(newUser);
-// SimpleUser dummyUser = couchbaseEntryManager.find(SimpleUser.class, "inum=test,o=test,o=jans");
-// LOG.info("Dummy User '{}'", dummyUser);
-
// Find all users which have specified object classes defined in SimpleUser
- List users = couchbaseEntryManager.findEntries("o=@!5304.5F36.0E64.E1AC!0001!179C.62D7,o=jans", SimpleUser.class, null);
+ List users = couchbaseEntryManager.findEntries("ou=people,o=jans", SimpleUser.class, null);
for (SimpleUser user : users) {
LOG.info("User with uid: '{}' with DN: '{}'", user.getUserId(), user.getDn());
}
@@ -77,26 +74,28 @@ public static void main(String[] args) {
for (SimpleUser user : users) {
boolean result1 = couchbaseEntryManager.authenticate(user.getDn(), "test");
boolean result2 = couchbaseEntryManager.authenticate("ou=people,o=jans", SimpleUser.class, user.getUserId(), "test");
- System.out.println("authetication result: " + result1 + ", " + result2);
+ System.out.println("authetication result: " + result1 + ", " + result2 + ", user: " + user.getDn());
}
- Filter filter = Filter.createEqualityFilter("status", "active");
- List attributes = couchbaseEntryManager.findEntries("o=jans", SimpleAttribute.class, filter, SearchScope.SUB, null, null, 10,
+ Filter filterAttributes = Filter.createEqualityFilter("jansStatus", "active");
+ List attributes = couchbaseEntryManager.findEntries("ou=attributes,o=jans", SimpleAttribute.class, filterAttributes, SearchScope.SUB, null, null, 10,
0, 0);
+ LOG.info("Found attributes: " + attributes.size());
for (SimpleAttribute attribute : attributes) {
LOG.info("Attribute with displayName: " + attribute.getCustomAttributes().get(1));
}
- List sessions = couchbaseEntryManager.findEntries("o=jans", SimpleSession.class, filter, SearchScope.SUB, null, null, 10, 0,
+ Filter filterSessions = Filter.createEqualityFilter("jansState", "authenticated");
+ List sessions = couchbaseEntryManager.findEntries("ou=sessions,o=jans", SimpleSession.class, filterSessions, SearchScope.SUB, null, null, 0, 1,
0);
LOG.info("Found sessions: " + sessions.size());
- List grants = couchbaseEntryManager.findEntries("o=jans", SimpleGrant.class, null, SearchScope.SUB,
- new String[] { "grtId" }, null, 1, 0, 0);
- LOG.info("Found grants: " + grants.size());
+ List tokens = couchbaseEntryManager.findEntries("ou=tokens,o=jans", SimpleToken.class, null, SearchScope.SUB,
+ new String[] { "code" }, null, 1, 0, 0);
+ LOG.info("Found tokens: " + tokens.size());
try {
- PagedResult listViewResponse = couchbaseEntryManager.findPagedEntries("o=jans", SimpleUser.class, null,
+ PagedResult listViewResponse = couchbaseEntryManager.findPagedEntries("ou=people,o=jans", SimpleUser.class, null,
new String[] { "uid", "displayName", "status" }, "uid", SortOrder.ASCENDING, 0, 6, 4);
LOG.info("Found persons: " + listViewResponse.getEntriesCount() + ", total persons: " + listViewResponse.getTotalEntriesCount());
@@ -108,7 +107,7 @@ public static void main(String[] args) {
}
try {
- PagedResult listViewResponse = couchbaseEntryManager.findPagedEntries("o=jans", SimpleUser.class, null,
+ PagedResult listViewResponse = couchbaseEntryManager.findPagedEntries("ou=people,o=jans", SimpleUser.class, null,
new String[] { "uid", "displayName", "status" }, "uid", SortOrder.DESCENDING, 0, 6, 4);
LOG.info("Found persons: " + listViewResponse.getEntriesCount() + ", total persons: " + listViewResponse.getTotalEntriesCount());
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUpateMissingEntrySample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUpateMissingEntrySample.java
index 138bcff9d77..1a7dd612ec9 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUpateMissingEntrySample.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUpateMissingEntrySample.java
@@ -1,5 +1,5 @@
/*
- * Janssen Project software is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.
+ * Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
*
* Copyright (c) 2020, Janssen Project
*/
@@ -47,6 +47,7 @@ public static void main(String[] args) {
System.out.println("Updated");
} catch (EntryPersistenceException ex) {
LOG.info("Failed to update, root case exception: {}", ex.getCause().getClass(), ex);
+ LOG.info("Test Passed :) It's right behaviour.");
}
}
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUpdateAttributeSample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUpdateAttributeSample.java
index 3e1d33c4b08..a2bc38c4584 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUpdateAttributeSample.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUpdateAttributeSample.java
@@ -61,6 +61,7 @@ public static void main(String[] args) {
SimpleUser userAfterUpdate = couchbaseEntryManager.find(SimpleUser.class, dn);
LOG.info("Found user after update '{}'", userAfterUpdate);
+ LOG.info("jansLastLogonTime after update '{}'", userAfterUpdate.getAttribute("jansLastLogonTime"));
}
}
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUserSearchSample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUserSearchSample.java
index d771831977b..7f8d0dce17f 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUserSearchSample.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/CouchbaseUserSearchSample.java
@@ -50,7 +50,7 @@ public static void main(String[] args) throws InterruptedException {
int countUsers = 1000000;
int threadCount = 200;
- int threadIterationCount = 10;
+ int threadIterationCount = 50;
long totalStart = System.currentTimeMillis();
try {
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/UmaResourceSample.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/UmaResourceSample.java
index 82b122539e3..bbc20000168 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/UmaResourceSample.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/UmaResourceSample.java
@@ -1,7 +1,7 @@
/*
* oxCore is available under the MIT License (2014). See http://opensource.org/licenses/MIT for full text.
*
- * Copyright (c) 2014, Gluu
+ * Copyright (c) 2020, Janssen Project
*/
package io.jans.orm.couchbase;
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/GluuStatus.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/GluuStatus.java
new file mode 100644
index 00000000000..4e77f90b20a
--- /dev/null
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/GluuStatus.java
@@ -0,0 +1,60 @@
+/*
+ * Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
+ *
+ * Copyright (c) 2020, Janssen Project
+ */
+
+package io.jans.orm.couchbase.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import io.jans.orm.annotation.AttributeEnum;
+
+/**
+ * Status
+ *
+ * @author Yuriy Movchan Date: 10.07.2010
+ */
+public enum GluuStatus implements AttributeEnum {
+
+ ACTIVE("active", "Active"), INACTIVE("inactive", "Inactive"), EXPIRED("expired", "Expired"), REGISTER("register", "Register");
+
+ private String value;
+ private String displayName;
+
+ private static Map MAP_BY_VALUES = new HashMap();
+
+ static {
+ for (GluuStatus enumType : values()) {
+ MAP_BY_VALUES.put(enumType.getValue(), enumType);
+ }
+ }
+
+ GluuStatus(String value, String displayName) {
+ this.value = value;
+ this.displayName = displayName;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public static GluuStatus getByValue(String value) {
+ return MAP_BY_VALUES.get(value);
+ }
+
+ public Enum extends AttributeEnum> resolveByValue(String value) {
+ return getByValue(value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+}
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleAttribute.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleAttribute.java
index c6552756aa1..a1c10ec682f 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleAttribute.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleAttribute.java
@@ -10,12 +10,12 @@
import java.util.ArrayList;
import java.util.List;
-import io.jans.orm.model.base.CustomAttribute;
import io.jans.orm.annotation.AttributesList;
import io.jans.orm.annotation.CustomObjectClass;
import io.jans.orm.annotation.DN;
import io.jans.orm.annotation.DataEntry;
import io.jans.orm.annotation.ObjectClass;
+import io.jans.orm.model.base.CustomAttribute;
import io.jans.orm.util.StringHelper;
/**
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleCache.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleCache.java
new file mode 100644
index 00000000000..1a11777c6b5
--- /dev/null
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleCache.java
@@ -0,0 +1,82 @@
+package io.jans.orm.couchbase.model;
+
+import java.util.Date;
+
+import io.jans.orm.annotation.AttributeName;
+import io.jans.orm.annotation.DataEntry;
+import io.jans.orm.annotation.Expiration;
+import io.jans.orm.annotation.ObjectClass;
+import io.jans.orm.model.base.BaseEntry;
+
+@DataEntry
+@ObjectClass(value = "cache")
+public class SimpleCache extends BaseEntry {
+
+ @Expiration
+ private Integer ttl;
+ @AttributeName(name = "uuid")
+ private String id;
+ @AttributeName(name = "iat")
+ private Date creationDate;
+ @AttributeName(name = "dat")
+ private String data;
+
+ @AttributeName(name = "exp", consistency = true)
+ private Date expirationDate;
+ @AttributeName(name = "del")
+ private Boolean deletable;
+
+ public Integer getTtl() {
+ return ttl;
+ }
+
+ public void setTtl(Integer ttl) {
+ this.ttl = ttl;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Date getCreationDate() {
+ return creationDate;
+ }
+
+ public void setCreationDate(Date creationDate) {
+ this.creationDate = creationDate;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public Date getExpirationDate() {
+ return expirationDate;
+ }
+
+ public void setExpirationDate(Date expirationDate) {
+ this.expirationDate = expirationDate;
+ }
+
+ public Boolean getDeletable() {
+ return deletable;
+ }
+
+ public void setDeletable(Boolean deletable) {
+ this.deletable = deletable;
+ }
+
+ @Override
+ public String toString() {
+ return "SimpleCache [ttl=" + ttl + ", id=" + id + ", creationDate=" + creationDate + ", data=" + data
+ + ", expirationDate=" + expirationDate + ", deletable=" + deletable + "]";
+ }
+}
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleSessionState.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleSessionState.java
index 56bb82c6ad5..0c3cf8c544c 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleSessionState.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleSessionState.java
@@ -45,7 +45,7 @@ public class SimpleSessionState implements Serializable {
@AttributeName(name = "authnTime")
private Date authenticationTime;
- @AttributeName(name = "oxAuthSessionState")
+ @AttributeName(name = "jansAuthSessionState")
private Boolean permissionGranted;
@AttributeName(name = "jansAsJwt")
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleToken.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleToken.java
new file mode 100644
index 00000000000..1d8bae10634
--- /dev/null
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleToken.java
@@ -0,0 +1,132 @@
+/*
+ * Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
+ *
+ * Copyright (c) 2020, Janssen Project
+ */
+
+package io.jans.orm.couchbase.model;
+
+import io.jans.orm.annotation.*;
+import io.jans.orm.model.base.CustomAttribute;
+import io.jans.orm.util.StringHelper;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by eugeniuparvan on 1/12/17.
+ */
+@DataEntry
+@ObjectClass(value = "token")
+public class SimpleToken implements Serializable {
+
+ private static final long serialVersionUID = 6726419630327625172L;
+
+ @AttributeName(name = "tknCde", consistency = true)
+ private String code;
+
+ @AttributeName(name = "iat")
+ private Date creationDate;
+
+ @AttributeName(name = "exp")
+ private Date expirationDate;
+
+ @AttributeName(name = "del")
+ private boolean deletable = true;
+
+ @AttributesList(name = "name", value = "values", sortByName = true)
+ private List customAttributes = new ArrayList();
+
+ @DN
+ private String dn;
+
+ @CustomObjectClass
+ private String[] customObjectClasses;
+
+ public String getDn() {
+ return dn;
+ }
+
+ public void setDn(String dn) {
+ this.dn = dn;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public Date getCreationDate() {
+ return creationDate;
+ }
+
+ public void setCreationDate(Date creationDate) {
+ this.creationDate = creationDate;
+ }
+
+ public Date getExpirationDate() {
+ return expirationDate;
+ }
+
+ public void setExpirationDate(Date expirationDate) {
+ this.expirationDate = expirationDate;
+ }
+
+ public boolean isDeletable() {
+ return deletable;
+ }
+
+ public void setDeletable(boolean deletable) {
+ this.deletable = deletable;
+ }
+
+ public List getCustomAttributes() {
+ return customAttributes;
+ }
+
+ public void setCustomAttributes(List customAttributes) {
+ this.customAttributes = customAttributes;
+ }
+
+ public String getAttribute(String ldapAttribute) {
+ String attribute = null;
+ if (ldapAttribute != null && !ldapAttribute.isEmpty()) {
+ for (CustomAttribute customAttribute : customAttributes) {
+ if (customAttribute.getName().equals(ldapAttribute)) {
+ attribute = customAttribute.getValue();
+ break;
+ }
+ }
+ }
+
+ return attribute;
+ }
+
+ public List getAttributeValues(String ldapAttribute) {
+ List values = null;
+ if (ldapAttribute != null && !ldapAttribute.isEmpty()) {
+ for (CustomAttribute customAttribute : customAttributes) {
+ if (StringHelper.equalsIgnoreCase(customAttribute.getName(), ldapAttribute)) {
+ values = customAttribute.getValues();
+ break;
+ }
+ }
+ }
+
+ return values;
+ }
+
+ public String[] getCustomObjectClasses() {
+ return customObjectClasses;
+ }
+
+ public void setCustomObjectClasses(String[] customObjectClasses) {
+ this.customObjectClasses = customObjectClasses;
+ }
+
+}
diff --git a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleUser.java b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleUser.java
index f88b0f49954..b2e5cff215f 100644
--- a/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleUser.java
+++ b/jans-orm/couchbase-sample/src/main/java/io/jans/orm/couchbase/model/SimpleUser.java
@@ -1,5 +1,5 @@
/*
- * Janssen Project software is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.
+ * Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text.
*
* Copyright (c) 2020, Janssen Project
*/
@@ -37,6 +37,15 @@ public class SimpleUser implements Serializable {
@AttributeName(name = "userPassword")
private String userPassword;
+ @AttributeName(name = "displayName")
+ private String displayName;
+
+ @AttributeName(name = "mail")
+ private String mail;
+
+ @AttributeName(name = "jansStatus")
+ private GluuStatus status;
+
@AttributeName(name = "role")
private UserRole userRole;
@@ -73,6 +82,30 @@ public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String getMail() {
+ return mail;
+ }
+
+ public void setMail(String mail) {
+ this.mail = mail;
+ }
+
+ public GluuStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(GluuStatus status) {
+ this.status = status;
+ }
+
public UserRole getUserRole() {
return userRole;
}
diff --git a/jans-orm/couchbase-sample/src/test/java/io/jans/couchbase/test/ManualCouchbaseEntryManagerTest.java b/jans-orm/couchbase-sample/src/test/java/io/jans/orm/couchbase/test/ManualCouchbaseEntryManagerTest.java
similarity index 57%
rename from jans-orm/couchbase-sample/src/test/java/io/jans/couchbase/test/ManualCouchbaseEntryManagerTest.java
rename to jans-orm/couchbase-sample/src/test/java/io/jans/orm/couchbase/test/ManualCouchbaseEntryManagerTest.java
index e56b2063fd3..a8120fb6fb6 100644
--- a/jans-orm/couchbase-sample/src/test/java/io/jans/couchbase/test/ManualCouchbaseEntryManagerTest.java
+++ b/jans-orm/couchbase-sample/src/test/java/io/jans/orm/couchbase/test/ManualCouchbaseEntryManagerTest.java
@@ -4,20 +4,23 @@
* Copyright (c) 2020, Janssen Project
*/
-package io.jans.couchbase.test;
+package io.jans.orm.couchbase.test;
+
+import org.testng.annotations.Test;
-import com.couchbase.client.core.message.kv.subdoc.multi.Lookup;
import com.couchbase.client.java.Bucket;
-import com.couchbase.client.java.document.JsonDocument;
-import com.couchbase.client.java.subdoc.DocumentFragment;
-import com.couchbase.client.java.subdoc.SubdocOptionsBuilder;
+import com.couchbase.client.java.json.JsonObject;
+import com.couchbase.client.java.kv.GetOptions;
+import com.couchbase.client.java.kv.GetResult;
+import com.couchbase.client.java.kv.LookupInMacro;
+import com.couchbase.client.java.kv.LookupInResult;
+import com.couchbase.client.java.kv.LookupInSpec;
import io.jans.orm.couchbase.impl.CouchbaseEntryManager;
import io.jans.orm.couchbase.impl.CouchbaseEntryManagerFactory;
import io.jans.orm.couchbase.model.SimpleClient;
import io.jans.orm.exception.operation.SearchException;
import io.jans.orm.util.Pair;
-import org.testng.annotations.Test;
import java.io.IOException;
import java.io.InputStream;
@@ -33,8 +36,8 @@ public void sample() throws IOException {
CouchbaseEntryManager manager = createCouchbaseEntryManager();
try {
- List attributeList = manager.findEntries("o=jans", SimpleClient.class, null);
- System.out.println(attributeList);
+ List resultList = manager.findEntries("ou=clietns,o=jans", SimpleClient.class, null);
+ System.out.println(resultList);
} finally {
manager.destroy();
}
@@ -52,17 +55,20 @@ public void sampleSessionId() throws IOException, SearchException {
System.out.println("Key: " + key + ", ttl:" + sessionId.getTtl());
Bucket sessionBucket = manager.getOperationService().getConnectionProvider().getBucketMapping("sessions").getBucket();
- final JsonDocument lookup = sessionBucket.get(key);
- System.out.println("expiry: " + lookup.expiry());
+ GetOptions getOptions1 = GetOptions.getOptions().withExpiry(true);
+ final GetResult lookup = sessionBucket.defaultCollection().get(key, getOptions1);
+ System.out.println("expiry: " + lookup.expiryTime());
- DocumentFragment ttl = sessionBucket.lookupIn(key).get("$document.exptime", new SubdocOptionsBuilder().xattr(true)).execute();
- System.out.println("ttl: " + ttl.content("$document.exptime"));
+ final LookupInResult ttl = sessionBucket.defaultCollection().lookupIn(key, Collections.singletonList(
+ LookupInSpec.get(LookupInMacro.EXPIRY_TIME).xattr()));
+ System.out.println("ttl: " + ttl.contentAs(0, Long.class));
updateSession(sessionId);
manager.merge(sessionId);
- final JsonDocument lookup2 = manager.getOperationService().getConnectionProvider().getBucketMapping("sessions").getBucket().get(key);
- System.out.println("expiry after update: " + lookup2.expiry());
+ GetOptions getOptions3 = GetOptions.getOptions().withExpiry(true);
+ final GetResult lookup2 = manager.getOperationService().getConnectionProvider().getBucketMapping("sessions").getBucket().defaultCollection().get(key, getOptions3);
+ System.out.println("expiry after update: " + lookup2.expiryTime());
} finally {
manager.destroy();
@@ -95,7 +101,7 @@ private Pair expirationDate(Date creationDate) {
}
// MODIFY ACCORDING TO YOUR SERVER
- public static Properties loadProperties() throws IOException {
+ private static Properties loadProperties() throws IOException {
Properties properties = new Properties();
properties.put("couchbase.auth.userPassword", "secret");
@@ -105,11 +111,30 @@ public static Properties loadProperties() throws IOException {
}
}
+ private static Properties getSampleConnectionProperties() {
+ Properties connectionProperties = new Properties();
+
+ connectionProperties.put("couchbase#servers", "localhost");
+ connectionProperties.put("couchbase#auth.userName", "admin");
+ connectionProperties.put("couchbase#auth.userPassword", "secret");
+ connectionProperties.put("couchbase#buckets", "jans, jans_user, jans_site, jans_cache, jans_token, jans_session");
+
+ connectionProperties.put("couchbase#bucket.default", "jans");
+ connectionProperties.put("couchbase#bucket.jans_user.mapping", "people, groups, authorizations");
+ connectionProperties.put("couchbase#bucket.jans_site.mapping", "cache-refresh");
+ connectionProperties.put("couchbase#bucket.jans_cache.mapping", "cache");
+ connectionProperties.put("couchbase#bucket.jans_token.mapping", "tokens");
+ connectionProperties.put("couchbase#bucket.jans_session.mapping", "sessions");
+
+ connectionProperties.put("couchbase#password.encryption.method", "SSHA-256");
+
+ return connectionProperties;
+ }
public static CouchbaseEntryManager createCouchbaseEntryManager() throws IOException {
CouchbaseEntryManagerFactory couchbaseEntryManagerFactory = new CouchbaseEntryManagerFactory();
couchbaseEntryManagerFactory.create();
- CouchbaseEntryManager couchbaseEntryManager = couchbaseEntryManagerFactory.createEntryManager(loadProperties());
+ CouchbaseEntryManager couchbaseEntryManager = couchbaseEntryManagerFactory.createEntryManager(getSampleConnectionProperties() /* loadProperties() */);
System.out.println("Created CouchbaseEntryManager: " + couchbaseEntryManager);
return couchbaseEntryManager;
diff --git a/jans-orm/couchbase-sample/src/test/java/io/jans/couchbase/test/SessionId.java b/jans-orm/couchbase-sample/src/test/java/io/jans/orm/couchbase/test/SessionId.java
similarity index 95%
rename from jans-orm/couchbase-sample/src/test/java/io/jans/couchbase/test/SessionId.java
rename to jans-orm/couchbase-sample/src/test/java/io/jans/orm/couchbase/test/SessionId.java
index 8e99165d4ee..4c032369476 100644
--- a/jans-orm/couchbase-sample/src/test/java/io/jans/couchbase/test/SessionId.java
+++ b/jans-orm/couchbase-sample/src/test/java/io/jans/orm/couchbase/test/SessionId.java
@@ -4,19 +4,23 @@
* Copyright (c) 2020, Janssen Project
*/
-package io.jans.couchbase.test;
+package io.jans.orm.couchbase.test;
-import com.couchbase.client.java.cluster.User;
-import com.google.common.collect.Maps;
-import io.jans.orm.annotation.*;
-import io.jans.orm.model.base.Deletable;
-
-import jakarta.inject.Named;
-import jakarta.persistence.Transient;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
+import com.google.common.collect.Maps;
+
+import io.jans.orm.annotation.AttributeName;
+import io.jans.orm.annotation.DN;
+import io.jans.orm.annotation.DataEntry;
+import io.jans.orm.annotation.Expiration;
+import io.jans.orm.annotation.JsonObject;
+import io.jans.orm.annotation.ObjectClass;
+import io.jans.orm.model.base.Deletable;
+import jakarta.persistence.Transient;
+
/**
* @author Yuriy Zabrovarnyy
* @author Javier Rojas Blum
@@ -74,9 +78,6 @@ public class SessionId implements Deletable, Serializable {
@Transient
private transient boolean persisted;
- @Transient
- private User user;
-
@Expiration
private int ttl;
@@ -155,14 +156,6 @@ public void setUserDn(String p_userDn) {
userDn = p_userDn != null ? p_userDn : "";
}
- public User getUser() {
- return user;
- }
-
- public void setUser(User user) {
- this.user = user;
- }
-
public Date getAuthenticationTime() {
return authenticationTime;
}
diff --git a/jans-orm/couchbase-sample/src/test/java/io/jans/couchbase/test/SessionIdState.java b/jans-orm/couchbase-sample/src/test/java/io/jans/orm/couchbase/test/SessionIdState.java
similarity index 96%
rename from jans-orm/couchbase-sample/src/test/java/io/jans/couchbase/test/SessionIdState.java
rename to jans-orm/couchbase-sample/src/test/java/io/jans/orm/couchbase/test/SessionIdState.java
index 4460e1ec408..29974dd42bd 100644
--- a/jans-orm/couchbase-sample/src/test/java/io/jans/couchbase/test/SessionIdState.java
+++ b/jans-orm/couchbase-sample/src/test/java/io/jans/orm/couchbase/test/SessionIdState.java
@@ -4,7 +4,7 @@
* Copyright (c) 2020, Janssen Project
*/
-package io.jans.couchbase.test;
+package io.jans.orm.couchbase.test;
import io.jans.orm.annotation.AttributeEnum;
diff --git a/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseBatchOperationWraper.java b/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseBatchOperationWraper.java
index 9b38f691d26..7cba72e3c55 100644
--- a/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseBatchOperationWraper.java
+++ b/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseBatchOperationWraper.java
@@ -6,13 +6,13 @@
package io.jans.orm.couchbase.impl;
-import com.couchbase.client.java.document.json.JsonObject;
-import com.couchbase.client.java.query.N1qlQueryRow;
+import java.util.ArrayList;
+import java.util.List;
+
import io.jans.orm.model.BatchOperation;
import io.jans.orm.reflect.property.PropertyAnnotation;
-import java.util.ArrayList;
-import java.util.List;
+import com.couchbase.client.java.json.JsonObject;
/**
* Couchbase batch operation wrapper
@@ -43,19 +43,12 @@ public final BatchOperation getBatchOperation() {
return batchOperation;
}
- public List createEntities(List searchResult) {
+ public List createEntities(List searchResult) {
if (couchbaseEntryManager == null) {
return new ArrayList(0);
}
- JsonObject[] resultObjects = new JsonObject[searchResult.size()];
-
- int index = 0;
- for (N1qlQueryRow row : searchResult) {
- resultObjects[index++] = row.value();
- }
-
- return couchbaseEntryManager.createEntities(entryClass, propertiesAnnotations, null, resultObjects);
+ return couchbaseEntryManager.createEntities(entryClass, propertiesAnnotations, null, searchResult.toArray(new JsonObject[0]));
}
}
diff --git a/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseEntryManager.java b/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseEntryManager.java
index 43ece668734..24550f48fe9 100644
--- a/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseEntryManager.java
+++ b/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseEntryManager.java
@@ -6,24 +6,27 @@
package io.jans.orm.couchbase.impl;
-import com.couchbase.client.core.message.kv.subdoc.multi.Mutation;
-import com.couchbase.client.java.document.json.JsonArray;
-import com.couchbase.client.java.document.json.JsonObject;
-import com.couchbase.client.java.query.consistency.ScanConsistency;
-import com.couchbase.client.java.query.dsl.Expression;
-import com.couchbase.client.java.query.dsl.Sort;
-import com.couchbase.client.java.subdoc.MutationSpec;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+import io.jans.orm.util.ArrayHelper;
+import io.jans.orm.util.StringHelper;
+import jakarta.inject.Inject;
import io.jans.orm.PersistenceEntryManager;
import io.jans.orm.annotation.AttributeName;
-import io.jans.orm.couchbase.model.ConvertedExpression;
-import io.jans.orm.couchbase.model.SearchReturnDataType;
-import io.jans.orm.couchbase.operation.CouchbaseOperationService;
-import io.jans.orm.couchbase.operation.impl.CouchbaseConnectionProvider;
import io.jans.orm.event.DeleteNotifier;
import io.jans.orm.exception.AuthenticationException;
import io.jans.orm.exception.EntryDeleteException;
import io.jans.orm.exception.EntryPersistenceException;
import io.jans.orm.exception.MappingException;
+import io.jans.orm.exception.UnsupportedOperationException;
import io.jans.orm.exception.operation.SearchException;
import io.jans.orm.impl.BaseEntryManager;
import io.jans.orm.impl.GenericKeyConverter;
@@ -35,37 +38,31 @@
import io.jans.orm.model.DefaultBatchOperation;
import io.jans.orm.model.PagedResult;
import io.jans.orm.model.SearchScope;
+import io.jans.orm.model.Sort;
import io.jans.orm.model.SortOrder;
import io.jans.orm.reflect.property.PropertyAnnotation;
import io.jans.orm.reflect.util.ReflectHelper;
import io.jans.orm.search.filter.Filter;
-import io.jans.orm.util.ArrayHelper;
-import io.jans.orm.util.StringHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import jakarta.inject.Inject;
-import java.io.Serializable;
-import java.time.DateTimeException;
-import java.time.Instant;
-import java.time.format.DateTimeParseException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
+import com.couchbase.client.core.msg.kv.SubdocCommandType;
+import com.couchbase.client.java.json.JsonArray;
+import com.couchbase.client.java.json.JsonObject;
+import com.couchbase.client.java.kv.MutateInSpec;
+import com.couchbase.client.java.query.QueryScanConsistency;
-import static java.time.format.DateTimeFormatter.ISO_INSTANT;
+import io.jans.orm.couchbase.model.ConvertedExpression;
+import io.jans.orm.couchbase.model.SearchReturnDataType;
+import io.jans.orm.couchbase.operation.CouchbaseOperationService;
+import io.jans.orm.couchbase.operation.impl.CouchbaseConnectionProvider;
/**
* Couchbase Entry Manager
*
* @author Yuriy Movchan Date: 05/14/2018
*/
-public class CouchbaseEntryManager extends BaseEntryManager implements Serializable {
+public class CouchbaseEntryManager extends BaseEntryManager implements Serializable {
public static final int EXPIRATION_30_DAYS = 30 * 86400;
@@ -83,7 +80,7 @@ public class CouchbaseEntryManager extends BaseEntryManager implements Serializa
protected CouchbaseEntryManager(CouchbaseOperationService operationService) {
this.operationService = operationService;
- this.FILTER_CONVERTER = new CouchbaseFilterConverter(this);
+ this.FILTER_CONVERTER = new CouchbaseFilterConverter(operationService);
subscribers = new LinkedList();
}
@@ -106,11 +103,11 @@ public boolean destroy() {
return true;
}
- return ((CouchbaseOperationService) this.operationService).destroy();
+ return this.operationService.destroy();
}
public CouchbaseOperationService getOperationService() {
- return (CouchbaseOperationService) operationService;
+ return operationService;
}
@Override
@@ -174,7 +171,7 @@ public void remove(Object entry) {
LOG.debug("LDAP entry to remove: '{}'", dnValue.toString());
- remove(dnValue.toString());
+ remove(dnValue.toString(), entryClass);
}
@Override
@@ -228,7 +225,7 @@ protected void persist(String dn, String[] objectClasses, List at
public void merge(String dn, String[] objectClasses, List attributeDataModifications, Integer expirationValue) {
// Update entry
try {
- List modifications = new ArrayList(attributeDataModifications.size());
+ List modifications = new ArrayList(attributeDataModifications.size());
for (AttributeDataModification attributeDataModification : attributeDataModifications) {
AttributeData attribute = attributeDataModification.getAttribute();
AttributeData oldAttribute = attributeDataModification.getOldAttribute();
@@ -249,14 +246,14 @@ public void merge(String dn, String[] objectClasses, List void removeByDn(String dn, String[] objectClasses) {
+ public void removeByDn(String dn, String[] objectClasses) {
// Remove entry
try {
for (DeleteNotifier subscriber : subscribers) {
@@ -351,7 +348,7 @@ protected int removeImpl(String dn, Class entryClass, Filter filter, int
}
try {
- int processed = getOperationService().delete(keyWithInum.getKey(), getScanConsistency(convertedExpression), convertedExpression.expression(), count);
+ int processed = getOperationService().delete(keyWithInum.getKey(), getQueryScanConsistency(convertedExpression), convertedExpression, count);
return processed;
} catch (Exception ex) {
@@ -364,8 +361,7 @@ protected List find(String dn, String[] objectClasses, Map result = getAttributeDataList(entry);
if (result != null) {
return result;
@@ -478,7 +474,7 @@ protected PagedResult findEntriesImpl(String baseDN, Class en
if (batchOperation != null) {
batchOperationWraper = new CouchbaseBatchOperationWraper(batchOperation, this, entryClass, propertiesAnnotations);
}
- searchResult = searchImpl(keyWithInum.getKey(), getScanConsistency(convertedExpression), convertedExpression.expression(), scope, currentLdapReturnAttributes,
+ searchResult = searchImpl(keyWithInum.getKey(), getQueryScanConsistency(convertedExpression), convertedExpression, scope, currentLdapReturnAttributes,
defaultSort, batchOperationWraper, returnDataType, start, count, chunkSize);
if (searchResult == null) {
@@ -518,7 +514,7 @@ protected boolean contains(String baseDN, String[] objectClasses, Class e
PagedResult searchResult = null;
try {
ParsedKey keyWithInum = toCouchbaseKey(baseDN);
- searchResult = searchImpl(keyWithInum.getKey(), getScanConsistency(convertedExpression), convertedExpression.expression(), SearchScope.SUB, ldapReturnAttributes, null,
+ searchResult = searchImpl(keyWithInum.getKey(), getQueryScanConsistency(convertedExpression), convertedExpression, SearchScope.SUB, ldapReturnAttributes, null,
null, SearchReturnDataType.SEARCH, 1, 1, 0);
if (searchResult == null) {
throw new EntryPersistenceException(String.format("Failed to find entry with baseDN: %s, filter: %s", baseDN, searchFilter));
@@ -530,7 +526,7 @@ protected boolean contains(String baseDN, String[] objectClasses, Class e
return (searchResult != null) && (searchResult.getEntriesCount() > 0);
}
- private PagedResult searchImpl(String key, ScanConsistency scanConsistency, Expression expression, SearchScope scope, String[] attributes, Sort[] orderBy,
+ private PagedResult searchImpl(String key, QueryScanConsistency scanConsistency, ConvertedExpression expression, SearchScope scope, String[] attributes, Sort[] orderBy,
CouchbaseBatchOperationWraper batchOperationWraper, SearchReturnDataType returnDataType, int start, int count, int pageSize) throws SearchException {
return getOperationService().search(key, scanConsistency, expression, scope, toInternalAttributes(attributes), orderBy, batchOperationWraper, returnDataType, start, count, pageSize);
}
@@ -606,7 +602,7 @@ private List getAttributeDataList(JsonObject entry) {
attributeValueObjects = new Object[] { attributeObject };
} else if (attributeObject instanceof String) {
// If it looks like date, treat as Date
- Object valueAsDate = decodeTime(null, attributeObject.toString(), true);
+ Object valueAsDate = decodeTime(null, attributeObject.toString(), true);
Object value = valueAsDate == null ? attributeObject.toString() : valueAsDate;
attributeValueObjects = new Object[] { value };
@@ -656,7 +652,7 @@ public boolean authenticate(String baseDN, Class entryClass, String userN
}
try {
- PagedResult searchResult = searchImpl(toCouchbaseKey(baseDN).getKey(), getScanConsistency(convertedExpression), convertedExpression.expression(),
+ PagedResult searchResult = searchImpl(toCouchbaseKey(baseDN).getKey(), getQueryScanConsistency(convertedExpression), convertedExpression,
SearchScope.SUB, CouchbaseOperationService.UID_ARRAY, null, null, SearchReturnDataType.SEARCH, 0, 1, 1);
if ((searchResult == null) || (searchResult.getEntriesCount() != 1)) {
return false;
@@ -723,7 +719,7 @@ public int countEntries(String baseDN, Class entryClass, Filter filter, S
PagedResult searchResult;
try {
- searchResult = searchImpl(toCouchbaseKey(baseDN).getKey(), getScanConsistency(convertedExpression), convertedExpression.expression(), scope, null, null,
+ searchResult = searchImpl(toCouchbaseKey(baseDN).getKey(), getQueryScanConsistency(convertedExpression), convertedExpression, scope, null, null,
null, SearchReturnDataType.COUNT, 0, 0, 0);
} catch (Exception ex) {
throw new EntryPersistenceException(
@@ -733,7 +729,7 @@ public int countEntries(String baseDN, Class entryClass, Filter filter, S
return searchResult.getTotalEntriesCount();
}
- private MutationSpec createModification(final Mutation type, final String attributeName, final Boolean multiValued, final Object... attributeValues) {
+ private MutateInSpec createModification(final SubdocCommandType type, final String attributeName, final Boolean multiValued, final Object... attributeValues) {
String realAttributeName = attributeName;
Object[] realValues = attributeValues;
@@ -743,21 +739,41 @@ private MutationSpec createModification(final Mutation type, final String attrib
escapeValues(realValues);
- if ((multiValued == null) || !multiValued) {
- return new MutationSpec(type, realAttributeName, realValues[0]);
+ MutateInSpec result = null;
+ if (SubdocCommandType.DELETE == type) {
+ result = MutateInSpec.remove(realAttributeName);
} else {
- return new MutationSpec(type, realAttributeName, realValues);
+ if ((multiValued == null) || !multiValued) {
+ if (SubdocCommandType.DICT_ADD == type) {
+ result = MutateInSpec.insert(realAttributeName, realValues[0]);
+ } else if (SubdocCommandType.REPLACE == type) {
+ result = MutateInSpec.replace(realAttributeName, realValues[0]);
+ }
+ } else {
+ // TODO: Check if we can use array here
+ if (SubdocCommandType.DICT_ADD == type) {
+ result = MutateInSpec.insert(realAttributeName, realValues);
+ } else if (SubdocCommandType.REPLACE == type) {
+ result = MutateInSpec.replace(realAttributeName, realValues);
+ }
+ }
}
+
+ if (result == null) {
+ throw new UnsupportedOperationException(String.format("Operation with type '%s' isn't supported", type));
+ }
+
+ return result;
}
protected Sort buildSort(String sortBy, SortOrder sortOrder) {
Sort requestedSort = null;
if (SortOrder.DESCENDING == sortOrder) {
- requestedSort = Sort.desc(Expression.path(sortBy));
+ requestedSort = Sort.desc(sortBy);
} else if (SortOrder.ASCENDING == sortOrder) {
- requestedSort = Sort.asc(Expression.path(sortBy));
+ requestedSort = Sort.asc(sortBy);
} else {
- requestedSort = Sort.def(Expression.path(sortBy));
+ requestedSort = Sort.def(sortBy);
}
return requestedSort;
}
@@ -775,7 +791,7 @@ protected Sort[] getDefaultSort(Class entryClass) {
Sort[] sort = new Sort[sortByProperties.length];
for (int i = 0; i < sortByProperties.length; i++) {
- sort[i] = Sort.def(Expression.path(sortByProperties[i]));
+ sort[i] = Sort.def(sortByProperties[i]);
}
return sort;
@@ -799,11 +815,12 @@ public List exportEntry(String dn) {
}
}
- public List exportEntry(String dn, String objectClass) {
+ @Override
+ public List exportEntry(String dn, String objectClass) {
return exportEntry(dn);
}
- private ConvertedExpression toCouchbaseFilter(Filter genericFilter, Map propertiesAnnotationsMap) throws SearchException {
+ private ConvertedExpression toCouchbaseFilter(Filter genericFilter, Map propertiesAnnotationsMap) throws SearchException {
return FILTER_CONVERTER.convertToCouchbaseFilter(genericFilter, propertiesAnnotationsMap);
}
@@ -851,19 +868,7 @@ public int getCountEntries() {
@Override
public String encodeTime(String baseDN, Date date) {
- if (date == null) {
- return null;
- }
-
- try {
- String utcDate = ISO_INSTANT.format(Instant.ofEpochMilli(date.getTime()));
- // Drop UTC zone identifier to comply with format employed in CB: yyyy-MM-dd'T'HH:mm:ss.SSS
- return utcDate.substring(0, utcDate.length() - 1);
- } catch (DateTimeException ex) {
- LOG.error("Cannot format date '{}' as ISO", date, ex);
- return null;
- }
-
+ return operationService.encodeTime(date);
}
@Override
@@ -877,21 +882,7 @@ public Date decodeTime(String baseDN, String date) {
}
protected Date decodeTime(String baseDN, String date, boolean silent) {
- if (StringHelper.isEmpty(date)) {
- return null;
- }
-
- // Add ending Z if necessary
- String dateZ = date.endsWith("Z") ? date : date + "Z";
- try {
- return new Date(Instant.parse(dateZ).toEpochMilli());
- } catch (DateTimeParseException ex) {
- if (!silent) {
- LOG.error("Failed to decode generalized time '{}'", date, ex);
- }
-
- return null;
- }
+ return operationService.decodeTime(date, silent);
}
@Override
@@ -950,15 +941,15 @@ protected Object getNativeDateAttributeValue(Date dateValue) {
return encodeTime(dateValue);
}
- private ScanConsistency getScanConsistency(ConvertedExpression convertedExpression) {
+ private QueryScanConsistency getQueryScanConsistency(ConvertedExpression convertedExpression) {
if (convertedExpression.consistency()) {
- return ScanConsistency.REQUEST_PLUS;
+ return QueryScanConsistency.REQUEST_PLUS;
}
return null;
}
- private ScanConsistency getScanConsistency(String attributeName, Map propertiesAnnotationsMap) {
+ private QueryScanConsistency getQueryScanConsistency(String attributeName, Map propertiesAnnotationsMap) {
if (StringHelper.isEmpty(attributeName)) {
return null;
}
@@ -971,7 +962,7 @@ private ScanConsistency getScanConsistency(String attributeName, Map sslTrustStoreType = Optional.ofNullable(couchbaseConnectionProperties.getProperty("ssl.trustStore.type"));
- builder.sslEnabled(true).sslTruststoreFile(sslTrustStoreFile).sslTruststorePassword(sslTrustStorePin);
+ clusterEnvironmentBuilder.securityConfig().enableTls(true).trustStore(FileSystems.getDefault().getPath(sslTrustStoreFile), sslTrustStorePin, sslTrustStoreType);
LOG.info("Configuring builder to enable SSL support");
} else {
- builder.sslEnabled(false);
+ clusterEnvironmentBuilder.securityConfig().enableTls(false);
LOG.info("Configuring builder to disable SSL support");
}
-
+
String connectTimeoutString = couchbaseConnectionProperties.getProperty("connection.connect-timeout");
if (StringHelper.isNotEmpty(connectTimeoutString)) {
int connectTimeout = Integer.valueOf(connectTimeoutString);
- builder.connectTimeout(connectTimeout);
+ clusterEnvironmentBuilder.timeoutConfig().connectTimeout(Duration.ofMillis(connectTimeout));
LOG.info("Configuring builder to override connectTimeout from properties");
}
- String operationTracingEnabledString = couchbaseConnectionProperties.getProperty("connection.operation-tracing-enabled");
- if (StringHelper.isNotEmpty(operationTracingEnabledString)) {
- boolean operationTracingEnabled = Boolean.valueOf(operationTracingEnabledString);
- builder.operationTracingEnabled(operationTracingEnabled);
- LOG.info("Configuring builder to override operationTracingEnabled from properties");
- }
-
- String mutationTokensEnabledString = couchbaseConnectionProperties.getProperty("connection.mutation-tokens-enabled");
- if (StringHelper.isNotEmpty(mutationTokensEnabledString)) {
- boolean mutationTokensEnabled = Boolean.valueOf(mutationTokensEnabledString);
- builder.mutationTokensEnabled(mutationTokensEnabled);
- LOG.info("Configuring builder to override mutationTokensEnabled from properties");
+ String connectDnsUseLookupString = couchbaseConnectionProperties.getProperty("connection.dns.use-lookup");
+ if (StringHelper.isNotEmpty(connectDnsUseLookupString)) {
+ boolean connectDnsUseLookup = Boolean.valueOf(connectDnsUseLookupString);
+ clusterEnvironmentBuilder.ioConfig().enableDnsSrv(connectDnsUseLookup);
+ LOG.info("Configuring builder to override enableDnsSrv from properties");
}
- String computationPoolSizeString = couchbaseConnectionProperties.getProperty("connection.computation-pool-size");
- if (StringHelper.isNotEmpty(computationPoolSizeString)) {
- int computationPoolSize = Integer.valueOf(computationPoolSizeString);
- builder.computationPoolSize(computationPoolSize);
- LOG.info("Configuring builder to override computationPoolSize from properties");
+ String kvTimeoutString = couchbaseConnectionProperties.getProperty("connection.kv-timeout");
+ if (StringHelper.isNotEmpty(kvTimeoutString)) {
+ int kvTimeout = Integer.valueOf(kvTimeoutString);
+ clusterEnvironmentBuilder.timeoutConfig().kvTimeout(Duration.ofMillis(kvTimeout));
+ LOG.info("Configuring builder to override kvTimeout from properties");
}
- String keepAliveTimeoutString = couchbaseConnectionProperties.getProperty("connection.keep-alive-timeout");
- if (StringHelper.isNotEmpty(keepAliveTimeoutString)) {
- long keepAliveTimeout = Integer.valueOf(keepAliveTimeoutString);
- builder.keepAliveTimeout(keepAliveTimeout);
- LOG.info("Configuring builder to override keepAliveTimeout from properties");
+ String queryTimeoutString = couchbaseConnectionProperties.getProperty("connection.query-timeout");
+ if (StringHelper.isNotEmpty(queryTimeoutString)) {
+ int queryTimeout = Integer.valueOf(queryTimeoutString);
+ clusterEnvironmentBuilder.timeoutConfig().queryTimeout(Duration.ofMillis(queryTimeout));
+ LOG.info("Configuring builder to override queryTimeout from properties");
}
- String keepAliveIntervalString = couchbaseConnectionProperties.getProperty("connection.keep-alive-interval");
- if (StringHelper.isNotEmpty(keepAliveIntervalString)) {
- long keepAliveInterval = Integer.valueOf(keepAliveIntervalString);
- builder.keepAliveInterval(keepAliveInterval);
- LOG.info("Configuring builder to override keepAliveInterval from properties");
+ String mutationTokensEnabledString = couchbaseConnectionProperties.getProperty("connection.mutation-tokens-enabled");
+ if (StringHelper.isNotEmpty(mutationTokensEnabledString)) {
+ boolean mutationTokensEnabled = Boolean.valueOf(mutationTokensEnabledString);
+ clusterEnvironmentBuilder.ioConfig().enableMutationTokens(mutationTokensEnabled);
+ LOG.info("Configuring builder to override mutationTokensEnabled from properties");
}
- this.couchbaseEnvironment = builder.build();
-
- this.builder = null;
+ this.clusterEnvironment = clusterEnvironmentBuilder.build();
}
@Override
@@ -136,8 +130,8 @@ public HashMap getConfigurationFileNames(String alias) {
return confs;
}
- public CouchbaseEnvironment getCouchbaseEnvironment() {
- return couchbaseEnvironment;
+ public ClusterEnvironment getClusterEnvironment() {
+ return clusterEnvironment;
}
@Override
@@ -155,7 +149,7 @@ public CouchbaseEntryManager createEntryManager(Properties conf) {
throw new ConfigurationException("Failed to create Couchbase environment!");
}
- CouchbaseConnectionProvider connectionProvider = new CouchbaseConnectionProvider(entryManagerConf, couchbaseEnvironment);
+ CouchbaseConnectionProvider connectionProvider = new CouchbaseConnectionProvider(entryManagerConf, clusterEnvironment);
connectionProvider.create();
if (!connectionProvider.isCreated()) {
throw new ConfigurationException(
@@ -171,22 +165,10 @@ public CouchbaseEntryManager createEntryManager(Properties conf) {
@Override
public void initStandalone(BaseFactoryService persistanceFactoryService) {
- this.builder = DefaultCouchbaseEnvironment.builder().mutationTokensEnabled(true).computationPoolSize(5);
- }
+ ClusterEnvironment.Builder clusterEnvironmentBuilder = ClusterEnvironment.builder();
+ clusterEnvironmentBuilder.ioConfig().enableMutationTokens(true).build();
-
-/*
- public static void main(String[] args) throws FileNotFoundException, IOException {
- Properties prop = new Properties();
- prop.load(new FileInputStream(new File("D:/Temp/jans-couchbase.properties")));
-
- CouchbaseEntryManagerFactory cemf = new CouchbaseEntryManagerFactory();
- cemf.create();
-
- CouchbaseEntryManager cem = cemf.createEntryManager(prop);
-
- System.out.println(cem.getOperationService().getConnectionProvider().isCreated());
-
+ this.clusterEnvironment = clusterEnvironmentBuilder.build();
}
-*/
+
}
diff --git a/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseFilterConverter.java b/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseFilterConverter.java
index f504380ff83..7aaf8b9af8d 100644
--- a/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseFilterConverter.java
+++ b/jans-orm/couchbase/src/main/java/io/jans/orm/couchbase/impl/CouchbaseFilterConverter.java
@@ -7,47 +7,48 @@
package io.jans.orm.couchbase.impl;
import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.function.Function;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.couchbase.client.java.document.json.JsonArray;
-import com.couchbase.client.java.query.dsl.Expression;
-import com.couchbase.client.java.query.dsl.functions.Collections;
-import com.couchbase.client.java.query.dsl.functions.Collections.SatisfiesBuilder;
-import com.couchbase.client.java.query.dsl.functions.StringFunctions;
-
+import io.jans.orm.util.ArrayHelper;
+import io.jans.orm.util.StringHelper;
import io.jans.orm.annotation.AttributeEnum;
import io.jans.orm.annotation.AttributeName;
-import io.jans.orm.couchbase.model.ConvertedExpression;
import io.jans.orm.exception.operation.SearchException;
import io.jans.orm.ldap.impl.LdapFilterConverter;
import io.jans.orm.reflect.property.PropertyAnnotation;
import io.jans.orm.reflect.util.ReflectHelper;
import io.jans.orm.search.filter.Filter;
import io.jans.orm.search.filter.FilterType;
-import io.jans.orm.util.ArrayHelper;
-import io.jans.orm.util.Pair;
-import io.jans.orm.util.StringHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.couchbase.client.java.json.JsonObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import io.jans.orm.couchbase.model.ConvertedExpression;
+import io.jans.orm.couchbase.operation.CouchbaseOperationService;
/**
- * Filter to Couchbase expressions convert
+ * Filter to N1QL parameterized Couchbase query converter
*
- * @author Yuriy Movchan Date: 05/15/2018
+ * @author Yuriy Movchan Date: 05/26/2022
*/
public class CouchbaseFilterConverter {
private static final Logger LOG = LoggerFactory.getLogger(CouchbaseFilterConverter.class);
private LdapFilterConverter ldapFilterConverter = new LdapFilterConverter();
+ private static final ObjectMapper JSON_OBJECT_MAPPER = new ObjectMapper();
- private CouchbaseEntryManager couchbaseEntryManager;
+ private CouchbaseOperationService operationService;
- public CouchbaseFilterConverter(CouchbaseEntryManager couchbaseEntryManager) {
- this.couchbaseEntryManager = couchbaseEntryManager;
+ public CouchbaseFilterConverter(CouchbaseOperationService operationService) {
+ this.operationService = operationService;
}
public ConvertedExpression convertToCouchbaseFilter(Filter genericFilter, Map propertiesAnnotationsMap) throws SearchException {
@@ -55,12 +56,22 @@ public ConvertedExpression convertToCouchbaseFilter(Filter genericFilter, Map propertiesAnnotationsMap, Function super Filter, Boolean> processor) throws SearchException {
- Filter currentGenericFilter = genericFilter;
+ JsonObject queryParameters = JsonObject.create();
+ return convertToCouchbaseFilter(genericFilter, propertiesAnnotationsMap, queryParameters, processor);
+ }
+
+ public ConvertedExpression convertToCouchbaseFilter(Filter genericFilter, Map propertiesAnnotationsMap, JsonObject queryParameters, Function super Filter, Boolean> processor) throws SearchException {
+ if (genericFilter == null) {
+ return null;
+ }
+
+ Filter currentGenericFilter = genericFilter;
FilterType type = currentGenericFilter.getType();
if (FilterType.RAW == type) {
- LOG.warn("RAW Ldap filter to Couchbase convertion will be removed in new version!!!");
+ LOG.warn("RAW Ldap filter to N1QL convertion will be removed in new version!!!");
currentGenericFilter = ldapFilterConverter.convertRawLdapFilterToFilter(currentGenericFilter.getFilterString());
+ LOG.debug(String.format("Converted RAW filter: %s", currentGenericFilter));
type = currentGenericFilter.getType();
}
@@ -80,7 +91,7 @@ public ConvertedExpression convertToCouchbaseFilter(Filter genericFilter, Map assertionValues = new ArrayList