This is an automated email from the ASF dual-hosted git repository.
shuber pushed a commit to branch
UNOMI-400-hardcodedpropertyaccessors-refactoring
in repository https://gitbox.apache.org/repos/asf/unomi.git
The following commit(s) were added to
refs/heads/UNOMI-400-hardcodedpropertyaccessors-refactoring by this push:
new e939be1 UNOMI-400 Refactoring of hardcoded property accessors
e939be1 is described below
commit e939be19cb3c0dd708f4119f4268f5517e38e3d8
Author: Serge Huber <[email protected]>
AuthorDate: Tue Nov 17 23:19:20 2020 +0100
UNOMI-400 Refactoring of hardcoded property accessors
---
.../conditions/PropertyConditionEvaluator.java | 256 +--------------------
.../CampaignHardcodedPropertyAccessor.java | 43 ++++
.../ConsentHardcodedPropertyAccessor.java | 43 ++++
.../CustomItemHardcodedPropertyAccessor.java | 34 +++
.../accessors/EventHardcodedPropertyAccessor.java | 55 +++++
.../accessors/GoalHardcodedPropertyAccessor.java | 34 +++
.../accessors/HardcodedPropertyAccessor.java | 36 +++
.../HardcodedPropertyAccessorRegistry.java | 131 +++++++++++
.../accessors/ItemHardcodedPropertyAccessor.java | 43 ++++
.../accessors/MapHardcodedPropertyAccessor.java | 38 +++
.../MetadataHardcodedPropertyAccessor.java | 52 +++++
.../MetadataItemHardcodedPropertyAccessor.java | 33 +++
.../ProfileHardcodedPropertyAccessor.java | 49 ++++
.../accessors/RuleHardcodedPropertyAccessor.java | 37 +++
.../SessionHardcodedPropertyAccessor.java | 52 +++++
.../TimestampedItemHardcodedPropertyAccessor.java | 34 +++
.../conditions/PropertyConditionEvaluatorTest.java | 4 +-
17 files changed, 725 insertions(+), 249 deletions(-)
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java
index 00f3787..aa50586 100644
---
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java
@@ -23,7 +23,10 @@ import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.unomi.api.*;
import org.apache.unomi.api.conditions.Condition;
+import org.apache.unomi.api.goals.Goal;
import org.apache.unomi.api.rules.Rule;
+import
org.apache.unomi.plugins.baseplugin.conditions.accessors.HardcodedPropertyAccessor;
+import
org.apache.unomi.plugins.baseplugin.conditions.accessors.HardcodedPropertyAccessorRegistry;
import org.apache.unomi.scripting.ExpressionFilter;
import org.apache.unomi.scripting.ExpressionFilterFactory;
import org.apache.unomi.scripting.SecureFilteringClassLoader;
@@ -52,14 +55,14 @@ public class PropertyConditionEvaluator implements
ConditionEvaluator {
private static final Logger logger =
LoggerFactory.getLogger(PropertyConditionEvaluator.class.getName());
private static final SimpleDateFormat yearMonthDayDateFormat = new
SimpleDateFormat("yyyyMMdd");
- public static final String NOT_OPTIMIZED_MARKER =
"$$$###NOT_OPTIMIZED###$$$";
- private Map<String, Map<String, ExpressionAccessor>> expressionCache = new
HashMap<>(64);
+ private final Map<String, Map<String, ExpressionAccessor>> expressionCache
= new HashMap<>(64);
private boolean usePropertyConditionOptimizations = true;
- private static ClassLoader secureFilteringClassLoader = new
SecureFilteringClassLoader(PropertyConditionEvaluator.class.getClassLoader());
+ private static final ClassLoader secureFilteringClassLoader = new
SecureFilteringClassLoader(PropertyConditionEvaluator.class.getClassLoader());
+ private static final HardcodedPropertyAccessorRegistry
hardcodedPropertyAccessorRegistry = new HardcodedPropertyAccessorRegistry();
private ExpressionFilterFactory expressionFilterFactory;
- private boolean useOGNLScripting =
Boolean.parseBoolean(System.getProperty("org.apache.unomi.security.properties.useOGNLScripting",
"false"));
+ private final boolean useOGNLScripting =
Boolean.parseBoolean(System.getProperty("org.apache.unomi.security.properties.useOGNLScripting",
"false"));
public void setUsePropertyConditionOptimizations(boolean
usePropertyConditionOptimizations) {
this.usePropertyConditionOptimizations =
usePropertyConditionOptimizations;
@@ -293,7 +296,7 @@ public class PropertyConditionEvaluator implements
ConditionEvaluator {
protected Object getPropertyValue(Item item, String expression) throws
Exception {
if (usePropertyConditionOptimizations) {
Object result = getHardcodedPropertyValue(item, expression);
- if (!NOT_OPTIMIZED_MARKER.equals(result)) {
+ if
(!HardcodedPropertyAccessor.PROPERTY_NOT_FOUND_MARKER.equals(result)) {
return result;
}
}
@@ -308,7 +311,7 @@ public class PropertyConditionEvaluator implements
ConditionEvaluator {
protected Object getHardcodedPropertyValue(Item item, String expression) {
// the following are optimizations to avoid using the expressions that
are slower. The main objective here is
// to avoid the most used expression that may also trigger calls to
the Java Reflection API.
- return getItemProperty(item, expression);
+ return hardcodedPropertyAccessorRegistry.getProperty(item, expression);
}
protected Object getOGNLPropertyValue(Item item, String expression) throws
Exception {
@@ -329,21 +332,6 @@ public class PropertyConditionEvaluator implements
ConditionEvaluator {
return null;
}
- private Object getNestedPropertyValue(String expressionPart, Map<String,
Object> properties) {
- int nextDotPos = expressionPart.indexOf(".");
- if (nextDotPos > -1) {
- String mapKey = expressionPart.substring(0, nextDotPos);
- Object mapValue = properties.get(mapKey);
- if (mapValue == null) {
- return null;
- }
- String nextExpression = expressionPart.substring(nextDotPos + 1);
- return getNestedPropertyValue(nextExpression, (Map<String,
Object>) mapValue);
- } else {
- return properties.get(expressionPart);
- }
- }
-
private class ClassLoaderClassResolver extends DefaultClassResolver {
private ClassLoader classLoader;
@@ -448,230 +436,4 @@ public class PropertyConditionEvaluator implements
ConditionEvaluator {
}
}
- private Object getEventProperty(Event event, String expression) {
- if (expression.startsWith("properties.")) {
- return
getNestedPropertyValue(expression.substring("properties.".length()),
event.getProperties());
- }
- if ("scope".equals(expression)) {
- return event.getScope();
- }
- if ("eventType".equals(expression)) {
- return event.getEventType();
- }
- if (expression.startsWith("profile")) {
- if ("profile".equals(expression)) {
- return event.getProfile();
- } else {
- return getProfileProperty(event.getProfile(),
expression.substring("profile".length()+1));
- }
- }
- if ("profileId".equals(expression)) {
- return event.getProfileId();
- }
- if (expression.startsWith("session")) {
- if ("session".equals(expression)) {
- return event.getSession();
- } else {
- return getSessionProperty(event.getSession(),
expression.substring("session".length()+1));
- }
- }
- if ("sessionId".equals(expression)) {
- return event.getSessionId();
- }
- if (expression.startsWith("source")) {
- if ("source".equals(expression)) {
- return event.getSource();
- } else {
- return getItemProperty(event.getSource(),
expression.substring("source".length()+1));
- }
- }
- if (expression.startsWith("target")) {
- if ("target".equals(expression)) {
- return event.getTarget();
- } else {
- return getItemProperty(event.getTarget(),
expression.substring("target".length()+1));
- }
- }
- if ("timeStamp".equals(expression)) {
- return event.getTimeStamp();
- }
- if ("itemId".equals(expression)) {
- return event.getItemId();
- }
- if ("itemType".equals(expression)) {
- return event.getItemType();
- }
- logger.warn("Requested unimplemented property {} on Event object",
expression);
- return NOT_OPTIMIZED_MARKER;
- }
-
- private Object getSessionProperty(Session session, String expression) {
- if ("scope".equals(expression)) {
- return session.getScope();
- }
- if ("timeStamp".equals(expression)) {
- return session.getTimeStamp();
- }
- if ("duration".equals(expression)) {
- return session.getDuration();
- }
- if ("size".equals(expression)) {
- return session.getSize();
- }
- if ("lastEventDate".equals(expression)) {
- return session.getLastEventDate();
- }
- if (expression.startsWith("properties.")) {
- return
getNestedPropertyValue(expression.substring("properties.".length()),
session.getProperties());
- }
- if (expression.startsWith("systemProperties.")) {
- return
getNestedPropertyValue(expression.substring("systemProperties.".length()),
session.getSystemProperties());
- }
- if ("itemId".equals(expression)) {
- return session.getItemId();
- }
- if ("itemType".equals(expression)) {
- return session.getItemType();
- }
- if (expression.startsWith("profile")) {
- if ("profile".equals(expression)) {
- return session.getProfile();
- } else {
- return getProfileProperty((Profile) session.getProfile(),
expression.substring("profile".length()+1));
- }
- }
- if ("profileId".equals(expression)) {
- return session.getProfileId();
- }
- logger.warn("Requested unimplemented property {} on Session object",
expression);
- return NOT_OPTIMIZED_MARKER;
- }
-
- private Object getProfileProperty(Profile profile, String expression) {
- if ("segments".equals(expression)) {
- return profile.getSegments();
- }
- if (expression.startsWith("consents")) {
- if ("consents".equals(expression)) {
- return profile.getConsents();
- } else {
- String consentLookupName = null;
- String leftoverExpression = expression;
- if (expression.startsWith("consents[\"")) {
- int lookupNameBeginPos = "consents[\"".length();
- int lookupNameEndPos = expression.indexOf("\"].",
lookupNameBeginPos);
- if (lookupNameEndPos > lookupNameBeginPos) {
- consentLookupName =
expression.substring(lookupNameBeginPos, lookupNameEndPos);
- leftoverExpression =
expression.substring(lookupNameEndPos+3);
- } else {
- consentLookupName =
expression.substring(lookupNameBeginPos);
- leftoverExpression = null;
- }
- } else if (expression.startsWith("consents.")) {
- int lookupNameBeginPos = "consents.".length();
- int lookupNameEndPos = expression.indexOf(".",
lookupNameBeginPos);
- if (lookupNameEndPos > lookupNameBeginPos) {
- consentLookupName =
expression.substring(lookupNameBeginPos, lookupNameEndPos);
- leftoverExpression =
expression.substring(lookupNameEndPos+1);
- } else {
- consentLookupName =
expression.substring(lookupNameBeginPos);
- leftoverExpression =
expression.substring(lookupNameEndPos);
- }
- }
- Consent consent = profile.getConsents().get(consentLookupName);
- if (consent == null) {
- return null;
- }
- if (leftoverExpression == null) {
- return consent;
- }
- return getConsentProperty(consent, leftoverExpression);
- }
- }
- if (expression.startsWith("scores.")) {
- return
profile.getScores().get(expression.substring("scores.".length()));
- }
- if (expression.startsWith("properties.")) {
- return
getNestedPropertyValue(expression.substring("properties.".length()),
profile.getProperties());
- }
- if (expression.startsWith("systemProperties.")) {
- return
getNestedPropertyValue(expression.substring("systemProperties.".length()),
profile.getSystemProperties());
- }
- if ("itemId".equals(expression)) {
- return profile.getItemId();
- }
- if ("itemType".equals(expression)) {
- return profile.getItemType();
- }
- if ("mergedWith".equals(expression)) {
- return profile.getMergedWith();
- }
- logger.warn("Requested unimplemented property {} on Profile object",
expression);
- return NOT_OPTIMIZED_MARKER;
- }
-
- private Object getCustomItemProperty(CustomItem customItem, String
expression) {
- if (expression.startsWith("properties.")) {
- return
getNestedPropertyValue(expression.substring("properties.".length()),
customItem.getProperties());
- }
- if ("itemId".equals(expression)) {
- return customItem.getItemId();
- }
- if ("itemType".equals(expression)) {
- return customItem.getItemType();
- }
- if ("scope".equals(expression)) {
- return customItem.getScope();
- }
- logger.warn("Requested unimplemented property {} on CustomItem
object", expression);
- return NOT_OPTIMIZED_MARKER;
- }
-
- private Object getRuleProperty(Rule rule, String expression) {
- if ("itemId".equals(expression)) {
- return rule.getItemId();
- }
- if ("itemType".equals(expression)) {
- return rule.getItemType();
- }
- if ("scope".equals(expression)) {
- return rule.getScope();
- }
- logger.warn("Requested unimplemented property {} on Rule object",
expression);
- return NOT_OPTIMIZED_MARKER;
- }
-
- private Object getItemProperty(Item item, String expression) {
- if (item instanceof Profile) {
- return getProfileProperty((Profile) item, expression);
- } else if (item instanceof Session) {
- return getSessionProperty((Session) item, expression);
- } else if (item instanceof Rule) {
- return getRuleProperty((Rule) item, expression);
- } else if (item instanceof Event) {
- return getEventProperty((Event) item, expression);
- } else if (item instanceof CustomItem) {
- return getCustomItemProperty((CustomItem) item, expression);
- } else {
- logger.warn("Requested unrecognized property {} on {} class",
expression, item.getClass().getName());
- return NOT_OPTIMIZED_MARKER;
- }
- }
-
- private Object getConsentProperty(Consent consent, String expression) {
- if ("typeIdentifier".equals(expression)) {
- return consent.getTypeIdentifier();
- } else if ("scope".equals(expression)) {
- return consent.getScope();
- } else if ("status".equals(expression)) {
- return consent.getStatus();
- } else if ("statusDate".equals(expression)) {
- return consent.getStatusDate();
- } else if ("revokeDate".equals(expression)) {
- return consent.getRevokeDate();
- } else {
- logger.warn("Requested unrecognized property {} on Consent object
{}", expression, consent);
- return NOT_OPTIMIZED_MARKER;
- }
- }
}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/CampaignHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/CampaignHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..2718cfb
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/CampaignHardcodedPropertyAccessor.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.campaigns.Campaign;
+
+public class CampaignHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<Campaign> {
+ public CampaignHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(Campaign object, String propertyName, String
leftoverExpression) {
+ if ("startDate".equals(propertyName)) {
+ return object.getStartDate();
+ } else if ("endDate".equals(propertyName)) {
+ return object.getEndDate();
+ } else if ("cost".equals(propertyName)) {
+ return object.getCost();
+ } else if ("currency".equals(propertyName)) {
+ return object.getCurrency();
+ } else if ("primaryGoal".equals(propertyName)) {
+ return object.getPrimaryGoal();
+ } else if ("timezone".equals(propertyName)) {
+ return object.getTimezone();
+ }
+ return PROPERTY_NOT_FOUND_MARKER;
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/ConsentHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/ConsentHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..5f63e3a
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/ConsentHardcodedPropertyAccessor.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.Consent;
+
+public class ConsentHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<Consent> {
+
+ public ConsentHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(Consent object, String propertyName, String
leftoverExpression) {
+ if ("typeIdentifier".equals(propertyName)) {
+ return object.getTypeIdentifier();
+ } else if ("scope".equals(propertyName)) {
+ return object.getScope();
+ } else if ("status".equals(propertyName)) {
+ return object.getStatus();
+ } else if ("statusDate".equals(propertyName)) {
+ return object.getStatusDate();
+ } else if ("revokeDate".equals(propertyName)) {
+ return object.getRevokeDate();
+ } else {
+ return PROPERTY_NOT_FOUND_MARKER;
+ }
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/CustomItemHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/CustomItemHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..ed85103
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/CustomItemHardcodedPropertyAccessor.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.CustomItem;
+
+public class CustomItemHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<CustomItem> {
+
+ public
CustomItemHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry registry)
{
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(CustomItem object, String propertyName, String
leftoverExpression) {
+ if ("properties".equals(propertyName)) {
+ return registry.getProperty(object.getProperties(),
leftoverExpression);
+ }
+ return PROPERTY_NOT_FOUND_MARKER;
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/EventHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/EventHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..81c1fb6
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/EventHardcodedPropertyAccessor.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.Event;
+
+public class EventHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<Event> {
+
+ public EventHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(Event object, String propertyName, String
leftoverExpression) {
+ if ("properties".equals(propertyName)) {
+ return registry.getProperty(object.getProperties(),
leftoverExpression);
+ }
+ if ("eventType".equals(propertyName)) {
+ return object.getEventType();
+ }
+ if ("profile".equals(propertyName)) {
+ return registry.getProperty(object.getProfile(),
leftoverExpression);
+ }
+ if ("profileId".equals(propertyName)) {
+ return object.getProfileId();
+ }
+ if ("session".equals(propertyName)) {
+ return registry.getProperty(object.getSession(),
leftoverExpression);
+ }
+ if ("sessionId".equals(propertyName)) {
+ return object.getSessionId();
+ }
+ if ("source".equals(propertyName)) {
+ return registry.getProperty(object.getSource(),
leftoverExpression);
+ }
+ if ("target".equals(propertyName)) {
+ return registry.getProperty(object.getTarget(),
leftoverExpression);
+ }
+ return PROPERTY_NOT_FOUND_MARKER;
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/GoalHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/GoalHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..c1cbbf0
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/GoalHardcodedPropertyAccessor.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.goals.Goal;
+
+public class GoalHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<Goal> {
+
+ public GoalHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(Goal object, String propertyName, String
leftoverExpression) {
+ if ("campaignId".equals(propertyName)) {
+ return object.getCampaignId();
+ }
+ return PROPERTY_NOT_FOUND_MARKER;
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/HardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/HardcodedPropertyAccessor.java
new file mode 100644
index 0000000..9a8385b
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/HardcodedPropertyAccessor.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+/**
+ * Hardcoded property accessors serve two purpose:
+ * - control access to object fields, only expose the ones that are "safe" to
use
+ * - prevent using Java Reflection API that is both slower and potentially
unsafe as there could be potential to abuse it.
+ */
+public abstract class HardcodedPropertyAccessor<T> {
+
+ public static final String PROPERTY_NOT_FOUND_MARKER =
"$$$###PROPERTY_NOT_FOUND###$$$";
+
+ protected HardcodedPropertyAccessorRegistry registry;
+
+ public HardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ this.registry = registry;
+ }
+
+ abstract Object getProperty(T object, String propertyName, String
leftoverExpression);
+
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/HardcodedPropertyAccessorRegistry.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/HardcodedPropertyAccessorRegistry.java
new file mode 100644
index 0000000..6094a8f
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/HardcodedPropertyAccessorRegistry.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.*;
+import org.apache.unomi.api.campaigns.Campaign;
+import org.apache.unomi.api.goals.Goal;
+import org.apache.unomi.api.rules.Rule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+/**
+ * This class contains the registry of all the hardcoded property accessors.
+ * For the moment this list of accessors is hardcoded, but in a future update
it could be made dynamic.
+ */
+public class HardcodedPropertyAccessorRegistry {
+
+ private static final Logger logger =
LoggerFactory.getLogger(HardcodedPropertyAccessorRegistry.class.getName());
+
+ Map<String, HardcodedPropertyAccessor> propertyAccessors = new HashMap<>();
+
+ public HardcodedPropertyAccessorRegistry() {
+ propertyAccessors.put(Item.class.getName(), new
ItemHardcodedPropertyAccessor(this));
+ propertyAccessors.put(MetadataItem.class.getName(), new
MetadataItemHardcodedPropertyAccessor(this));
+ propertyAccessors.put(Metadata.class.getName(), new
MetadataHardcodedPropertyAccessor(this));
+ propertyAccessors.put(TimestampedItem.class.getName(), new
TimestampedItemHardcodedPropertyAccessor(this));
+ propertyAccessors.put(Event.class.getName(), new
EventHardcodedPropertyAccessor(this));
+ propertyAccessors.put(Profile.class.getName(), new
ProfileHardcodedPropertyAccessor(this));
+ propertyAccessors.put(Consent.class.getName(), new
ConsentHardcodedPropertyAccessor(this));
+ propertyAccessors.put(Session.class.getName(), new
SessionHardcodedPropertyAccessor(this));
+ propertyAccessors.put(Rule.class.getName(), new
RuleHardcodedPropertyAccessor(this));
+ propertyAccessors.put(Goal.class.getName(), new
GoalHardcodedPropertyAccessor(this));
+ propertyAccessors.put(CustomItem.class.getName(), new
CustomItemHardcodedPropertyAccessor(this));
+ propertyAccessors.put(Campaign.class.getName(), new
CampaignHardcodedPropertyAccessor(this));
+ propertyAccessors.put(Map.class.getName(), new
MapHardcodedPropertyAccessor(this));
+ }
+
+ public static class NextTokens {
+ public String propertyName;
+ public String leftoverExpression;
+ }
+
+ protected NextTokens getNextTokens(String expression) {
+ NextTokens nextTokens = new NextTokens();
+ if (expression.startsWith("[\"")) {
+ int lookupNameBeginPos = "[\"".length();
+ int lookupNameEndPos = expression.indexOf("\"].",
lookupNameBeginPos);
+ if (lookupNameEndPos > lookupNameBeginPos) {
+ nextTokens.propertyName =
expression.substring(lookupNameBeginPos, lookupNameEndPos);
+ nextTokens.leftoverExpression =
expression.substring(lookupNameEndPos+2);
+ } else {
+ nextTokens.propertyName =
expression.substring(lookupNameBeginPos);
+ nextTokens.leftoverExpression = null;
+ }
+ } else if (expression.startsWith(".")) {
+ int lookupNameBeginPos = ".".length();
+ int lookupNameEndPos = lookupNameBeginPos;
+ int dotlookupNameEndPos = expression.indexOf(".",
lookupNameBeginPos);
+ int squareBracketlookupNameEndPos = expression.indexOf("[",
lookupNameBeginPos);
+ if (dotlookupNameEndPos > lookupNameBeginPos &&
squareBracketlookupNameEndPos > lookupNameBeginPos) {
+ lookupNameEndPos = Math.min(dotlookupNameEndPos,
squareBracketlookupNameEndPos);
+ } else if (dotlookupNameEndPos > lookupNameBeginPos) {
+ lookupNameEndPos = dotlookupNameEndPos;
+ } else if (squareBracketlookupNameEndPos > lookupNameBeginPos) {
+ lookupNameEndPos = squareBracketlookupNameEndPos;
+ } else {
+ lookupNameEndPos = -1;
+ }
+ if (lookupNameEndPos > lookupNameBeginPos) {
+ nextTokens.propertyName =
expression.substring(lookupNameBeginPos, lookupNameEndPos);
+ nextTokens.leftoverExpression =
expression.substring(lookupNameEndPos);
+ } else {
+ nextTokens.propertyName =
expression.substring(lookupNameBeginPos);
+ nextTokens.leftoverExpression = null;
+ }
+ } else {
+ int lookupNameBeginPos = 0;
+ int lookupNameEndPos = expression.indexOf(".", lookupNameBeginPos);
+ if (lookupNameEndPos > lookupNameBeginPos) {
+ nextTokens.propertyName =
expression.substring(lookupNameBeginPos, lookupNameEndPos);
+ nextTokens.leftoverExpression =
expression.substring(lookupNameEndPos);
+ } else {
+ nextTokens.propertyName =
expression.substring(lookupNameBeginPos);
+ nextTokens.leftoverExpression = null;
+ }
+ }
+ return nextTokens;
+ }
+
+
+ public Object getProperty(Object object, String expression) {
+ if (expression == null) {
+ return object;
+ }
+ if (expression.trim().equals("")) {
+ return object;
+ }
+ NextTokens nextTokens = getNextTokens(expression);
+ List<Class<?>> lookupClasses = new ArrayList<>();
+ lookupClasses.add(object.getClass());
+ lookupClasses.add(object.getClass().getSuperclass());
+ lookupClasses.addAll(Arrays.asList(object.getClass().getInterfaces()));
+ for (Class<?> lookupClass : lookupClasses) {
+ HardcodedPropertyAccessor propertyAccessor =
propertyAccessors.get(lookupClass.getName());
+ if (propertyAccessor != null) {
+ Object result = propertyAccessor.getProperty(object,
nextTokens.propertyName, nextTokens.leftoverExpression);
+ if
(!HardcodedPropertyAccessor.PROPERTY_NOT_FOUND_MARKER.equals(result)) {
+ return result;
+ }
+ }
+ }
+ logger.warn("Couldn't find any property access for class {} and
expression {}", object.getClass().getName(), expression);
+ return HardcodedPropertyAccessor.PROPERTY_NOT_FOUND_MARKER;
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/ItemHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/ItemHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..41ce3a4
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/ItemHardcodedPropertyAccessor.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.Item;
+
+public class ItemHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<Item> {
+
+ public ItemHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(Item object, String propertyName, String
leftoverExpression) {
+ if ("itemId".equals(propertyName)) {
+ return object.getItemId();
+ }
+ if ("itemType".equals(propertyName)) {
+ return object.getItemType();
+ }
+ if ("scope".equals(propertyName)) {
+ return object.getScope();
+ }
+ if ("version".equals(propertyName)) {
+ return object.getVersion();
+ }
+ return PROPERTY_NOT_FOUND_MARKER;
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/MapHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/MapHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..92895fe
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/MapHardcodedPropertyAccessor.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import java.util.Map;
+
+public class MapHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<Map> {
+ public MapHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(Map object, String propertyName, String
leftoverExpression) {
+ Object mapValue = object.get(propertyName);
+ if (mapValue == null) {
+ return null;
+ }
+ if (leftoverExpression != null) {
+ return registry.getProperty(mapValue, leftoverExpression);
+ } else {
+ return mapValue;
+ }
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/MetadataHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/MetadataHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..edb3310
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/MetadataHardcodedPropertyAccessor.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.Metadata;
+
+public class MetadataHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<Metadata> {
+
+ public MetadataHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(Metadata object, String propertyName, String
leftoverExpression) {
+ if ("id".equals(propertyName)) {
+ return object.getId();
+ } else if ("name".equals(propertyName)) {
+ return object.getName();
+ } else if ("description".equals(propertyName)) {
+ return object.getDescription();
+ } else if ("scope".equals(propertyName)) {
+ return object.getScope();
+ } else if ("tags".equals(propertyName)) {
+ return object.getTags();
+ } else if ("systemTags".equals(propertyName)) {
+ return object.getSystemTags();
+ } else if ("enabled".equals(propertyName)) {
+ return object.isEnabled();
+ } else if ("missingPlugins".equals(propertyName)) {
+ return object.isMissingPlugins();
+ } else if ("hidden".equals(propertyName)) {
+ return object.isHidden();
+ } else if ("readOnly".equals(propertyName)) {
+ return object.isReadOnly();
+ }
+ return PROPERTY_NOT_FOUND_MARKER;
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/MetadataItemHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/MetadataItemHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..7c26c59
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/MetadataItemHardcodedPropertyAccessor.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.MetadataItem;
+
+public class MetadataItemHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<MetadataItem> {
+ public
MetadataItemHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(MetadataItem object, String propertyName, String
leftoverExpression) {
+ if ("metadata".equals(propertyName)) {
+ registry.getProperty(object.getMetadata(), leftoverExpression);
+ }
+ return null;
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/ProfileHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/ProfileHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..3778c27
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/ProfileHardcodedPropertyAccessor.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.Profile;
+
+public class ProfileHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<Profile> {
+
+ public ProfileHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ public Object getProperty(Profile object, String propertyName, String
leftoverExpression) {
+ if ("segments".equals(propertyName)) {
+ return object.getSegments();
+ }
+ if ("consents".equals(propertyName)) {
+ return registry.getProperty(object.getConsents(),
leftoverExpression);
+ }
+ if ("scores".equals(propertyName)) {
+ return registry.getProperty(object.getScores(),
leftoverExpression);
+ }
+ if ("properties".equals(propertyName)) {
+ return registry.getProperty(object.getProperties(),
leftoverExpression);
+ }
+ if ("systemProperties".equals(propertyName)) {
+ return registry.getProperty(object.getSystemProperties(),
leftoverExpression);
+ }
+ if ("mergedWith".equals(propertyName)) {
+ return object.getMergedWith();
+ }
+ return PROPERTY_NOT_FOUND_MARKER;
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/RuleHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/RuleHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..28e9bb1
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/RuleHardcodedPropertyAccessor.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.rules.Rule;
+
+public class RuleHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<Rule> {
+
+ public RuleHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(Rule object, String propertyName, String
leftoverExpression) {
+ if ("linkedItems".equals(propertyName)) {
+ return object.getLinkedItems();
+ } else if ("priority".equals(propertyName)) {
+ return object.getPriority();
+ }
+ return PROPERTY_NOT_FOUND_MARKER;
+ }
+
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/SessionHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/SessionHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..a318721
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/SessionHardcodedPropertyAccessor.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.Session;
+
+public class SessionHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<Session> {
+
+ public SessionHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(Session object, String propertyName, String
leftoverExpression) {
+ if ("duration".equals(propertyName)) {
+ return object.getDuration();
+ }
+ if ("size".equals(propertyName)) {
+ return object.getSize();
+ }
+ if ("lastEventDate".equals(propertyName)) {
+ return object.getLastEventDate();
+ }
+ if ("properties".equals(propertyName)) {
+ return registry.getProperty(object.getProperties(),
leftoverExpression);
+ }
+ if ("systemProperties".equals(propertyName)) {
+ return registry.getProperty(object.getSystemProperties(),
leftoverExpression);
+ }
+ if ("profile".equals(propertyName)) {
+ return registry.getProperty(object.getProfile(),
leftoverExpression);
+ }
+ if ("profileId".equals(propertyName)) {
+ return object.getProfileId();
+ }
+ return PROPERTY_NOT_FOUND_MARKER;
+ }
+}
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/TimestampedItemHardcodedPropertyAccessor.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/TimestampedItemHardcodedPropertyAccessor.java
new file mode 100644
index 0000000..c408e8c
--- /dev/null
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/accessors/TimestampedItemHardcodedPropertyAccessor.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.plugins.baseplugin.conditions.accessors;
+
+import org.apache.unomi.api.TimestampedItem;
+
+public class TimestampedItemHardcodedPropertyAccessor extends
HardcodedPropertyAccessor<TimestampedItem> {
+
+ public
TimestampedItemHardcodedPropertyAccessor(HardcodedPropertyAccessorRegistry
registry) {
+ super(registry);
+ }
+
+ @Override
+ Object getProperty(TimestampedItem object, String propertyName, String
leftoverExpression) {
+ if ("timeStamp".equals(propertyName)) {
+ return object.getTimeStamp();
+ }
+ return PROPERTY_NOT_FOUND_MARKER;
+ }
+}
diff --git
a/plugins/baseplugin/src/test/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluatorTest.java
b/plugins/baseplugin/src/test/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluatorTest.java
index af039a5..1ba3c72 100644
---
a/plugins/baseplugin/src/test/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluatorTest.java
+++
b/plugins/baseplugin/src/test/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluatorTest.java
@@ -18,6 +18,7 @@ package org.apache.unomi.plugins.baseplugin.conditions;
import ognl.MethodFailedException;
import org.apache.unomi.api.*;
+import
org.apache.unomi.plugins.baseplugin.conditions.accessors.HardcodedPropertyAccessor;
import org.apache.unomi.scripting.ExpressionFilter;
import org.apache.unomi.scripting.ExpressionFilterFactory;
import org.junit.Before;
@@ -33,7 +34,6 @@ import java.util.regex.Pattern;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertNull;
-import static
org.apache.unomi.plugins.baseplugin.conditions.PropertyConditionEvaluator.NOT_OPTIMIZED_MARKER;
import static org.junit.Assert.assertFalse;
public class PropertyConditionEvaluatorTest {
@@ -94,7 +94,7 @@ public class PropertyConditionEvaluatorTest {
assertEquals("Unexisting property should be null", null,
propertyConditionEvaluator.getHardcodedPropertyValue(mockProfile,
"properties.email"));
// here let's make sure our reporting of non optimized expressions
works.
- assertEquals("Should have received the non-optimized marker string",
NOT_OPTIMIZED_MARKER,
propertyConditionEvaluator.getHardcodedPropertyValue(mockSession,
"profile.non-existing-field"));
+ assertEquals("Should have received the non-optimized marker string",
HardcodedPropertyAccessor.PROPERTY_NOT_FOUND_MARKER,
propertyConditionEvaluator.getHardcodedPropertyValue(mockSession,
"profile.non-existing-field"));
}