Author: ilgrosso
Date: Thu Apr 10 15:56:50 2014
New Revision: 1586349
URL: http://svn.apache.org/r1586349
Log:
Refactoring JEXL evaluation
Added:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/ClassFreeUberspectImpl.java
(with props)
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/EmptyClassLoader.java
(with props)
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/JexlUtil.java
- copied, changed from r1586341,
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/JexlUtil.java
Removed:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/JexlUtil.java
Modified:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractDerAttr.java
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/propagation/PropagationManager.java
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/AbstractAttributableDataBinder.java
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/DerivedSchemaDataBinder.java
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/SchemaDataBinder.java
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/TaskDataBinder.java
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/ConnObjectUtil.java
syncope/branches/1_0_X/core/src/main/resources/syncopeContext.xml
Modified:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractDerAttr.java
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractDerAttr.java?rev=1586349&r1=1586348&r2=1586349&view=diff
==============================================================================
---
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractDerAttr.java
(original)
+++
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractDerAttr.java
Thu Apr 10 15:56:50 2014
@@ -26,7 +26,7 @@ import javax.persistence.MappedSuperclas
import org.apache.commons.jexl2.JexlContext;
import org.apache.syncope.core.persistence.beans.user.SyncopeUser;
import org.apache.syncope.core.util.ApplicationContextProvider;
-import org.apache.syncope.core.util.JexlUtil;
+import org.apache.syncope.core.util.jexl.JexlUtil;
import org.springframework.context.ConfigurableApplicationContext;
@MappedSuperclass
Modified:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/propagation/PropagationManager.java
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/propagation/PropagationManager.java?rev=1586349&r1=1586348&r2=1586349&view=diff
==============================================================================
---
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/propagation/PropagationManager.java
(original)
+++
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/propagation/PropagationManager.java
Thu Apr 10 15:56:50 2014
@@ -50,7 +50,7 @@ import org.apache.syncope.core.persisten
import org.apache.syncope.core.rest.data.UserDataBinder;
import org.apache.syncope.core.util.AttributableUtil;
import org.apache.syncope.core.util.ConnObjectUtil;
-import org.apache.syncope.core.util.JexlUtil;
+import org.apache.syncope.core.util.jexl.JexlUtil;
import org.apache.syncope.core.util.SchemaMappingUtil;
import org.apache.syncope.core.util.VirAttrCache;
import org.apache.syncope.core.workflow.WorkflowResult;
Modified:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/AbstractAttributableDataBinder.java
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/AbstractAttributableDataBinder.java?rev=1586349&r1=1586348&r2=1586349&view=diff
==============================================================================
---
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/AbstractAttributableDataBinder.java
(original)
+++
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/AbstractAttributableDataBinder.java
Thu Apr 10 15:56:50 2014
@@ -63,7 +63,7 @@ import org.apache.syncope.core.persisten
import org.apache.syncope.core.persistence.dao.VirSchemaDAO;
import org.apache.syncope.core.propagation.PropagationByResource;
import org.apache.syncope.core.util.AttributableUtil;
-import org.apache.syncope.core.util.JexlUtil;
+import org.apache.syncope.core.util.jexl.JexlUtil;
import org.apache.syncope.types.AttributableType;
import org.apache.syncope.types.PropagationOperation;
import org.apache.syncope.types.SyncopeClientExceptionType;
Modified:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/DerivedSchemaDataBinder.java
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/DerivedSchemaDataBinder.java?rev=1586349&r1=1586348&r2=1586349&view=diff
==============================================================================
---
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/DerivedSchemaDataBinder.java
(original)
+++
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/DerivedSchemaDataBinder.java
Thu Apr 10 15:56:50 2014
@@ -27,7 +27,7 @@ import org.apache.syncope.client.validat
import org.apache.syncope.client.validation.SyncopeClientException;
import org.apache.syncope.core.persistence.beans.AbstractDerSchema;
import org.apache.syncope.core.persistence.beans.AbstractSchema;
-import org.apache.syncope.core.util.JexlUtil;
+import org.apache.syncope.core.util.jexl.JexlUtil;
import org.apache.syncope.types.SyncopeClientExceptionType;
@Component
Modified:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java?rev=1586349&r1=1586348&r2=1586349&view=diff
==============================================================================
---
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java
(original)
+++
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java
Thu Apr 10 15:56:50 2014
@@ -44,7 +44,7 @@ import org.apache.syncope.core.persisten
import org.apache.syncope.core.persistence.beans.SyncPolicy;
import org.apache.syncope.core.persistence.dao.ConnInstanceDAO;
import org.apache.syncope.core.persistence.dao.PolicyDAO;
-import org.apache.syncope.core.util.JexlUtil;
+import org.apache.syncope.core.util.jexl.JexlUtil;
import org.apache.syncope.types.ConnConfProperty;
import org.apache.syncope.types.IntMappingType;
import org.apache.syncope.types.SyncopeClientExceptionType;
Modified:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/SchemaDataBinder.java
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/SchemaDataBinder.java?rev=1586349&r1=1586348&r2=1586349&view=diff
==============================================================================
---
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/SchemaDataBinder.java
(original)
+++
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/SchemaDataBinder.java
Thu Apr 10 15:56:50 2014
@@ -33,7 +33,7 @@ import org.apache.syncope.core.persisten
import org.apache.syncope.core.persistence.beans.AbstractSchema;
import org.apache.syncope.core.persistence.dao.SchemaDAO;
import org.apache.syncope.core.util.AttributableUtil;
-import org.apache.syncope.core.util.JexlUtil;
+import org.apache.syncope.core.util.jexl.JexlUtil;
import org.apache.syncope.types.SyncopeClientExceptionType;
@Component
Modified:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/TaskDataBinder.java
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/TaskDataBinder.java?rev=1586349&r1=1586348&r2=1586349&view=diff
==============================================================================
---
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/TaskDataBinder.java
(original)
+++
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/data/TaskDataBinder.java
Thu Apr 10 15:56:50 2014
@@ -41,7 +41,7 @@ import org.apache.syncope.core.persisten
import org.apache.syncope.core.persistence.beans.TaskExec;
import org.apache.syncope.core.persistence.dao.ResourceDAO;
import org.apache.syncope.core.persistence.dao.TaskExecDAO;
-import org.apache.syncope.core.util.JexlUtil;
+import org.apache.syncope.core.util.jexl.JexlUtil;
import org.apache.syncope.core.util.TaskUtil;
import org.apache.syncope.types.SyncopeClientExceptionType;
import org.quartz.Scheduler;
Modified:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/ConnObjectUtil.java
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/ConnObjectUtil.java?rev=1586349&r1=1586348&r2=1586349&view=diff
==============================================================================
---
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/ConnObjectUtil.java
(original)
+++
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/ConnObjectUtil.java
Thu Apr 10 15:56:50 2014
@@ -18,6 +18,7 @@
*/
package org.apache.syncope.core.util;
+import org.apache.syncope.core.util.jexl.JexlUtil;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
Added:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/ClassFreeUberspectImpl.java
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/ClassFreeUberspectImpl.java?rev=1586349&view=auto
==============================================================================
---
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/ClassFreeUberspectImpl.java
(added)
+++
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/ClassFreeUberspectImpl.java
Thu Apr 10 15:56:50 2014
@@ -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.syncope.core.util.jexl;
+
+import org.apache.commons.jexl2.JexlInfo;
+import org.apache.commons.jexl2.introspection.JexlMethod;
+import org.apache.commons.jexl2.introspection.JexlPropertyGet;
+import org.apache.commons.jexl2.introspection.UberspectImpl;
+import org.apache.commons.logging.Log;
+
+class ClassFreeUberspectImpl extends UberspectImpl {
+
+ public ClassFreeUberspectImpl(final Log runtimeLogger) {
+ super(runtimeLogger);
+ }
+
+ @Override
+ public JexlPropertyGet getPropertyGet(final Object obj, final Object
identifier, final JexlInfo info) {
+ return "class".equals(identifier) ? null : super.getPropertyGet(obj,
identifier, info);
+ }
+
+ @Override
+ public JexlMethod getMethod(final Object obj, final String method, final
Object[] args, final JexlInfo info) {
+ return "getClass".equals(method) ? null : super.getMethod(obj, method,
args, info);
+ }
+
+}
Propchange:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/ClassFreeUberspectImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/ClassFreeUberspectImpl.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/ClassFreeUberspectImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/EmptyClassLoader.java
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/EmptyClassLoader.java?rev=1586349&view=auto
==============================================================================
---
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/EmptyClassLoader.java
(added)
+++
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/EmptyClassLoader.java
Thu Apr 10 15:56:50 2014
@@ -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.syncope.core.util.jexl;
+
+/**
+ * A class loader that will throw {@link ClassNotFoundException} for every
class name.
+ */
+class EmptyClassLoader extends ClassLoader {
+
+ @Override
+ public Class<?> loadClass(final String name) throws ClassNotFoundException
{
+ throw new ClassNotFoundException("This classloader won't attemp to
load " + name);
+ }
+
+ @Override
+ protected Class<?> loadClass(final String name, boolean resolve) throws
ClassNotFoundException {
+ throw new ClassNotFoundException("This classloader won't attemp to
load " + name);
+ }
+
+}
Propchange:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/EmptyClassLoader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/EmptyClassLoader.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/EmptyClassLoader.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Copied:
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/JexlUtil.java
(from r1586341,
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/JexlUtil.java)
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/JexlUtil.java?p2=syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/JexlUtil.java&p1=syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/JexlUtil.java&r1=1586341&r2=1586349&rev=1586349&view=diff
==============================================================================
---
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/JexlUtil.java
(original)
+++
syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/jexl/JexlUtil.java
Thu Apr 10 15:56:50 2014
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.syncope.core.util;
+package org.apache.syncope.core.util.jexl;
import java.util.Collection;
import java.util.List;
@@ -25,9 +25,9 @@ import org.apache.commons.jexl2.JexlCont
import org.apache.commons.jexl2.JexlEngine;
import org.apache.commons.jexl2.JexlException;
import org.apache.commons.jexl2.MapContext;
+import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
import org.apache.syncope.client.to.AbstractAttributableTO;
import org.apache.syncope.client.to.AttributeTO;
import org.apache.syncope.client.to.UserTO;
@@ -46,13 +46,26 @@ public class JexlUtil {
*/
private static final Logger LOG = LoggerFactory.getLogger(JexlUtil.class);
- @Autowired
- private JexlEngine jexlEngine;
+ private static JexlEngine jexlEngine;
+
+ private static JexlEngine getEngine() {
+ synchronized (LOG) {
+ if (jexlEngine == null) {
+ jexlEngine = new JexlEngine(new ClassFreeUberspectImpl(null),
null, null, null);
+ jexlEngine.setClassLoader(new EmptyClassLoader());
+ jexlEngine.setCache(512);
+ jexlEngine.setLenient(true);
+ jexlEngine.setSilent(false);
+ }
+ }
+
+ return jexlEngine;
+ }
public boolean isExpressionValid(final String expression) {
boolean result;
try {
- jexlEngine.createExpression(expression);
+ getEngine().createExpression(expression);
result = true;
} catch (JexlException e) {
LOG.error("Invalid jexl expression: " + expression, e);
@@ -63,20 +76,19 @@ public class JexlUtil {
}
public String evaluate(final String expression, final JexlContext
jexlContext) {
-
- String result = "";
+ String result = StringUtils.EMPTY;
if (expression != null && !expression.isEmpty() && jexlContext !=
null) {
try {
- Expression jexlExpression =
jexlEngine.createExpression(expression);
+ Expression jexlExpression =
getEngine().createExpression(expression);
Object evaluated = jexlExpression.evaluate(jexlContext);
if (evaluated != null) {
result = evaluated.toString();
}
} catch (JexlException e) {
LOG.error("Invalid jexl expression: " + expression, e);
- result = "";
+ result = StringUtils.EMPTY;
}
} else {
LOG.debug("Expression not provided or invalid context");
@@ -94,19 +106,19 @@ public class JexlUtil {
jexlContext.set("username", user.getUsername() != null
? user.getUsername()
- : "");
+ : StringUtils.EMPTY);
jexlContext.set("creationDate", user.getCreationDate() != null
? user.getDateFormatter().format(user.getCreationDate())
- : "");
+ : StringUtils.EMPTY);
jexlContext.set("lastLoginDate", user.getLastLoginDate() != null
? user.getDateFormatter().format(user.getLastLoginDate())
- : "");
+ : StringUtils.EMPTY);
jexlContext.set("failedLogins", user.getFailedLogins() != null
? user.getFailedLogins()
- : "");
+ : StringUtils.EMPTY);
jexlContext.set("changePwdDate", user.getChangePwdDate() != null
? user.getDateFormatter().format(user.getChangePwdDate())
- : "");
+ : StringUtils.EMPTY);
}
addAttrsToContext(attributable.getAttributes(), jexlContext);
@@ -127,7 +139,7 @@ public class JexlUtil {
for (AbstractAttr attribute : attributes) {
List<String> attributeValues = attribute.getValuesAsStrings();
String expressionValue = attributeValues.isEmpty()
- ? ""
+ ? StringUtils.EMPTY
: attributeValues.get(0);
LOG.debug("Add attribute {} with value {}",
@@ -149,11 +161,11 @@ public class JexlUtil {
for (AbstractDerAttr attribute : derAttributes) {
String expressionValue = attribute.getValue(attributes);
if (expressionValue == null) {
- expressionValue = "";
+ expressionValue = StringUtils.EMPTY;
}
LOG.debug("Add derived attribute {} with value {}", new Object[] {
attribute.getDerivedSchema().getName(),
- expressionValue });
+ expressionValue });
context.set(attribute.getDerivedSchema().getName(),
expressionValue);
}
@@ -170,16 +182,16 @@ public class JexlUtil {
context.set("username", user.getUsername() != null
? user.getUsername()
- : "");
+ : StringUtils.EMPTY);
context.set("password", user.getPassword() != null
? user.getPassword()
- : "");
+ : StringUtils.EMPTY);
}
for (AttributeTO attribute : attributableTO.getAttributes()) {
List<String> attributeValues = attribute.getValues();
String expressionValue = attributeValues.isEmpty()
- ? ""
+ ? StringUtils.EMPTY
: attributeValues.get(0);
LOG.debug("Add attribute {} with value {}", new Object[] {
attribute.getSchema(), expressionValue });
@@ -189,7 +201,7 @@ public class JexlUtil {
for (AttributeTO attribute : attributableTO.getDerivedAttributes()) {
List<String> attributeValues = attribute.getValues();
String expressionValue = attributeValues.isEmpty()
- ? ""
+ ? StringUtils.EMPTY
: attributeValues.get(0);
LOG.debug("Add attribute {} with value {}", new Object[] {
attribute.getSchema(), expressionValue });
@@ -199,7 +211,7 @@ public class JexlUtil {
for (AttributeTO attribute : attributableTO.getVirtualAttributes()) {
List<String> attributeValues = attribute.getValues();
String expressionValue = attributeValues.isEmpty()
- ? ""
+ ? StringUtils.EMPTY
: attributeValues.get(0);
LOG.debug("Add attribute {} with value {}", new Object[] {
attribute.getSchema(), expressionValue });
Modified: syncope/branches/1_0_X/core/src/main/resources/syncopeContext.xml
URL:
http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/resources/syncopeContext.xml?rev=1586349&r1=1586348&r2=1586349&view=diff
==============================================================================
--- syncope/branches/1_0_X/core/src/main/resources/syncopeContext.xml (original)
+++ syncope/branches/1_0_X/core/src/main/resources/syncopeContext.xml Thu Apr
10 15:56:50 2014
@@ -79,13 +79,7 @@ under the License.
<task:annotation-driven executor="connectorExecutor"/>
<task:executor id="connectorExecutor" pool-size="10"/>
- <bean id="jexlEngine" class="org.apache.commons.jexl2.JexlEngine">
- <property name="cache" value="512"/>
- <property name="lenient" value="true"/>
- <property name="silent" value="false"/>
- </bean>
-
- <bean id="jexlUtil" class="org.apache.syncope.core.util.JexlUtil"/>
+ <bean id="jexlUtil" class="org.apache.syncope.core.util.jexl.JexlUtil"
scope="singleton"/>
<bean id="virAttrCache" class="org.apache.syncope.core.util.VirAttrCache"
scope="singleton">
<constructor-arg value="60"/>