You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2020/02/12 09:44:39 UTC
[syncope] branch 2_1_X updated: [SYNCOPE-1517] Making
JdbcAuditAppender configurable (but still enabled by default)
This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch 2_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/2_1_X by this push:
new 8caf2b5 [SYNCOPE-1517] Making JdbcAuditAppender configurable (but still enabled by default)
8caf2b5 is described below
commit 8caf2b5511fb853400875fa475e0cac12c58d295
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Wed Feb 12 10:44:21 2020 +0100
[SYNCOPE-1517] Making JdbcAuditAppender configurable (but still enabled by default)
---
.../client/console/audit/AuditHistoryDetails.java | 16 +-
.../console/audit/AuditHistoryDirectoryPanel.java | 35 ++--
.../console/rest/AuditHistoryRestClient.java | 72 -------
.../client/console/rest/LoggerRestClient.java | 47 ++++-
.../apache/syncope/common/lib/log/AuditEntry.java | 158 ++++++++++++++++
.../apache/syncope/common/lib/to/AuditEntryTO.java | 141 --------------
.../common/rest/api/service/AuditService.java | 54 ------
.../common/rest/api/service/LoggerService.java | 15 ++
.../syncope/core/logic/AbstractAuditAppender.java | 72 -------
.../org/apache/syncope/core/logic/AuditLogic.java | 73 -------
.../org/apache/syncope/core/logic/LoggerLogic.java | 50 +++--
.../syncope/core/logic/audit/AuditAppender.java | 21 +--
.../core/logic/audit/DefaultAuditAppender.java | 32 ++--
.../logic/audit/DefaultRewriteAuditAppender.java | 39 ++--
.../core/logic/audit/JdbcAuditAppender.java | 102 ++++++++++
.../logic/audit/PassThroughAuditRewritePolicy.java | 1 -
.../init/ClassPathScanImplementationLookup.java | 5 +-
.../syncope/core/logic/init/LoggerLoader.java | 138 ++++----------
core/logic/src/main/resources/logic.properties | 1 +
.../syncope/core/persistence/api/dao/AuditDAO.java | 45 -----
.../core/persistence/api/dao/LoggerDAO.java | 20 ++
.../core/persistence/api/entity/AuditEntry.java | 40 ----
...AuditDAO.java => AbstractJPAJSONLoggerDAO.java} | 2 +-
...PAJSONAuditDAO.java => MyJPAJSONLoggerDAO.java} | 10 +-
...PAJSONAuditDAO.java => PGJPAJSONLoggerDAO.java} | 14 +-
.../main/resources/myjson/persistence.properties | 2 +-
.../main/resources/pgjsonb/persistence.properties | 2 +-
.../core/persistence/jpa/dao/JPAAuditDAO.java | 163 ----------------
.../core/persistence/jpa/dao/JPALoggerDAO.java | 141 +++++++++++++-
.../persistence/jpa/entity/AbstractEntity.java | 3 +
.../persistence/jpa/entity/JPAConnInstance.java | 1 -
.../src/main/resources/persistence.properties | 2 +-
.../src/main/resources/persistenceContext.xml | 2 +-
.../core/provisioning/api/AuditEntryImpl.java | 210 ---------------------
...{AuditDataBinder.java => LoggerDataBinder.java} | 11 +-
.../provisioning/api/serialization/POJOHelper.java | 12 --
.../core/provisioning/api/AuditEntryImplTest.java | 93 ---------
.../api/serialization/POJOHelperTest.java | 7 -
.../provisioning/java/DefaultAuditManager.java | 76 +++++---
.../java/data/AuditDataBinderImpl.java | 66 -------
.../java/data/LoggerDataBinderImpl.java} | 44 ++---
.../java/job/report/AuditReportlet.java | 18 +-
.../PriorityPropagationTaskExecutor.java | 4 +-
.../core/rest/cxf/service/AuditServiceImpl.java | 52 -----
.../core/rest/cxf/service/LoggerServiceImpl.java | 40 +++-
.../src/main/resources/persistence.properties.all | 2 +-
.../main/resources/persistence.properties.myjson | 2 +-
.../main/resources/persistence.properties.pgjsonb | 2 +-
.../src/main/resources/persistence.properties | 2 +-
.../core/reference/SyslogRewriteAuditAppender.java | 47 +++--
.../fit/core/reference/TestFileAuditAppender.java | 30 ++-
.../reference/TestFileRewriteAuditAppender.java | 23 +--
.../fit/core/reference/TestRewritePolicy.java | 7 +-
.../resources/elasticsearch/persistence.properties | 2 +-
.../src/main/resources/logic.properties | 1 +
.../org/apache/syncope/fit/AbstractITCase.java | 4 -
.../org/apache/syncope/fit/core/AuditITCase.java | 36 ++--
.../org/apache/syncope/fit/core/LoggerITCase.java | 6 +-
.../systemadministration/dbms.adoc | 4 +-
59 files changed, 833 insertions(+), 1487 deletions(-)
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDetails.java
index 8d491df..4b58d90 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDetails.java
@@ -20,12 +20,13 @@ package org.apache.syncope.client.console.audit;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.Serializable;
import java.util.Date;
import org.apache.syncope.client.console.SyncopeConsoleSession;
import org.apache.syncope.client.console.panels.MultilevelPanel;
import org.apache.syncope.client.console.wicket.markup.html.form.JsonDiffPanel;
+import org.apache.syncope.common.lib.log.AuditEntry;
import org.apache.syncope.common.lib.to.AbstractAnnotatedBean;
-import org.apache.syncope.common.lib.to.AuditEntryTO;
import org.apache.syncope.common.lib.to.EntityTO;
import org.apache.syncope.common.lib.to.UserTO;
import org.apache.wicket.PageReference;
@@ -38,7 +39,7 @@ import org.apache.wicket.model.Model;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public abstract class AuditHistoryDetails<T extends EntityTO> extends MultilevelPanel.SecondLevel {
+public abstract class AuditHistoryDetails<T extends Serializable> extends MultilevelPanel.SecondLevel {
private static final long serialVersionUID = -7400543686272100483L;
@@ -46,19 +47,16 @@ public abstract class AuditHistoryDetails<T extends EntityTO> extends Multilevel
private static final ObjectMapper MAPPER = new ObjectMapper();
- private static final String KEY_CURRENT = "current";
-
public AuditHistoryDetails(
final MultilevelPanel mlp,
- final AuditEntryTO selected,
- final T currentEntity,
+ final AuditEntry selected,
+ final EntityTO currentEntity,
final String auditRestoreEntitlement,
final PageReference pageRef) {
super();
- AuditEntryTO current = new AuditEntryTO();
- current.setKey(KEY_CURRENT);
+ AuditEntry current = new AuditEntry();
if (currentEntity instanceof AbstractAnnotatedBean) {
current.setWho(((AbstractAnnotatedBean) currentEntity).getCreator());
current.setDate(((AbstractAnnotatedBean) currentEntity).getCreationDate());
@@ -112,7 +110,7 @@ public abstract class AuditHistoryDetails<T extends EntityTO> extends Multilevel
protected abstract void restore(String json, AjaxRequestTarget target);
- private Model<String> toJSON(final AuditEntryTO auditEntry, final Class<T> reference) {
+ private Model<String> toJSON(final AuditEntry auditEntry, final Class<T> reference) {
try {
String content = auditEntry.getBefore() == null
? MAPPER.readTree(auditEntry.getOutput()).get("entity").toPrettyString()
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDirectoryPanel.java
index 394eab4..13ec6a2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDirectoryPanel.java
@@ -18,6 +18,7 @@
*/
package org.apache.syncope.client.console.audit;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -30,12 +31,12 @@ import org.apache.syncope.client.console.panels.AjaxDataTablePanel;
import org.apache.syncope.client.console.panels.DirectoryPanel;
import org.apache.syncope.client.console.panels.ModalPanel;
import org.apache.syncope.client.console.panels.MultilevelPanel;
-import org.apache.syncope.client.console.rest.AuditHistoryRestClient;
+import org.apache.syncope.client.console.rest.LoggerRestClient;
import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
-import org.apache.syncope.common.lib.to.AuditEntryTO;
+import org.apache.syncope.common.lib.log.AuditEntry;
import org.apache.syncope.common.lib.to.EntityTO;
import org.apache.syncope.common.lib.types.AuditElements;
import org.apache.syncope.common.lib.types.StandardEntitlement;
@@ -49,8 +50,8 @@ import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.StringResourceModel;
-public abstract class AuditHistoryDirectoryPanel<T extends EntityTO> extends DirectoryPanel<
- AuditEntryTO, AuditEntryTO, AuditHistoryDirectoryPanel<T>.AuditHistoryProvider, AuditHistoryRestClient>
+public abstract class AuditHistoryDirectoryPanel<T extends Serializable> extends DirectoryPanel<
+ AuditEntry, AuditEntry, AuditHistoryDirectoryPanel<T>.AuditHistoryProvider, LoggerRestClient>
implements ModalPanel {
private static final long serialVersionUID = -8248734710505211261L;
@@ -67,7 +68,7 @@ public abstract class AuditHistoryDirectoryPanel<T extends EntityTO> extends Dir
private final String category;
- private final T entity;
+ private final EntityTO entity;
private final String auditRestoreEntitlement;
@@ -76,7 +77,7 @@ public abstract class AuditHistoryDirectoryPanel<T extends EntityTO> extends Dir
final MultilevelPanel mlp,
final AuditElements.EventCategoryType type,
final String category,
- final T entity,
+ final EntityTO entity,
final String auditRestoreEntitlement,
final PageReference pageRef) {
@@ -91,7 +92,7 @@ public abstract class AuditHistoryDirectoryPanel<T extends EntityTO> extends Dir
this.auditRestoreEntitlement = auditRestoreEntitlement;
this.pageRef = pageRef;
- this.restClient = new AuditHistoryRestClient();
+ this.restClient = new LoggerRestClient();
initResultTable();
}
@@ -106,30 +107,30 @@ public abstract class AuditHistoryDirectoryPanel<T extends EntityTO> extends Dir
}
@Override
- protected List<IColumn<AuditEntryTO, String>> getColumns() {
- List<IColumn<AuditEntryTO, String>> columns = new ArrayList<>();
+ protected List<IColumn<AuditEntry, String>> getColumns() {
+ List<IColumn<AuditEntry, String>> columns = new ArrayList<>();
columns.add(new PropertyColumn<>(new StringResourceModel("who", this), "who"));
columns.add(new DatePropertyColumn<>(new StringResourceModel("date", this), null, "date"));
return columns;
}
@Override
- protected void resultTableCustomChanges(final AjaxDataTablePanel.Builder<AuditEntryTO, String> resultTableBuilder) {
+ protected void resultTableCustomChanges(final AjaxDataTablePanel.Builder<AuditEntry, String> resultTableBuilder) {
resultTableBuilder.setMultiLevelPanel(baseModal, mlp);
}
protected abstract void restore(String json, AjaxRequestTarget target);
@Override
- protected ActionsPanel<AuditEntryTO> getActions(final IModel<AuditEntryTO> model) {
- final ActionsPanel<AuditEntryTO> panel = super.getActions(model);
+ protected ActionsPanel<AuditEntry> getActions(final IModel<AuditEntry> model) {
+ final ActionsPanel<AuditEntry> panel = super.getActions(model);
- panel.add(new ActionLink<AuditEntryTO>() {
+ panel.add(new ActionLink<AuditEntry>() {
private static final long serialVersionUID = -6745431735457245600L;
@Override
- public void onClick(final AjaxRequestTarget target, final AuditEntryTO modelObject) {
+ public void onClick(final AjaxRequestTarget target, final AuditEntry modelObject) {
AuditHistoryDirectoryPanel.this.getTogglePanel().close(target);
mlp.next(
@@ -161,7 +162,7 @@ public abstract class AuditHistoryDirectoryPanel<T extends EntityTO> extends Dir
return Collections.emptyList();
}
- protected class AuditHistoryProvider extends DirectoryDataProvider<AuditEntryTO> {
+ protected class AuditHistoryProvider extends DirectoryDataProvider<AuditEntry> {
private static final long serialVersionUID = 415113175628260864L;
@@ -176,7 +177,7 @@ public abstract class AuditHistoryDirectoryPanel<T extends EntityTO> extends Dir
}
@Override
- public Iterator<AuditEntryTO> iterator(final long first, final long count) {
+ public Iterator<AuditEntry> iterator(final long first, final long count) {
int page = ((int) first / paginatorRows);
return restClient.search(
entity.getKey(),
@@ -191,7 +192,7 @@ public abstract class AuditHistoryDirectoryPanel<T extends EntityTO> extends Dir
}
@Override
- public IModel<AuditEntryTO> model(final AuditEntryTO auditEntryBean) {
+ public IModel<AuditEntry> model(final AuditEntry auditEntryBean) {
return new CompoundPropertyModel<>(auditEntryBean);
}
}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/AuditHistoryRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/AuditHistoryRestClient.java
deleted file mode 100644
index 8666aa1..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/AuditHistoryRestClient.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.client.console.rest;
-
-import java.util.List;
-import org.apache.syncope.common.lib.to.AuditEntryTO;
-import org.apache.syncope.common.lib.types.AuditElements;
-import org.apache.syncope.common.rest.api.beans.AuditQuery;
-import org.apache.syncope.common.rest.api.service.AuditService;
-import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
-
-public class AuditHistoryRestClient extends BaseRestClient {
-
- private static final long serialVersionUID = -381814125643246243L;
-
- public List<AuditEntryTO> search(
- final String key,
- final int page,
- final int size,
- final AuditElements.EventCategoryType type,
- final String category,
- final List<String> events,
- final AuditElements.Result result,
- final SortParam<String> sort) {
-
- AuditQuery query = new AuditQuery.Builder(key).
- size(size).
- page(page).
- type(type).
- category(category).
- events(events).
- result(result).
- orderBy(toOrderBy(sort)).
- build();
-
- return getService(AuditService.class).search(query).getResult();
- }
-
- public int count(
- final String key,
- final AuditElements.EventCategoryType type,
- final String category,
- final List<String> events,
- final AuditElements.Result result) {
-
- AuditQuery query = new AuditQuery.Builder(key).
- page(1).
- size(1).
- type(type).
- category(category).
- events(events).
- result(result).
- build();
- return getService(AuditService.class).search(query).getTotalCount();
- }
-}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
index 445f7b3..5bba7c5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
@@ -27,15 +27,19 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
+import org.apache.syncope.common.lib.log.AuditEntry;
import org.apache.syncope.common.lib.log.EventCategory;
import org.apache.syncope.common.lib.log.LogAppender;
import org.apache.syncope.common.lib.log.LogStatement;
import org.apache.syncope.common.lib.log.LoggerTO;
+import org.apache.syncope.common.lib.types.AuditElements;
import org.apache.syncope.common.lib.types.AuditLoggerName;
import org.apache.syncope.common.lib.types.LoggerLevel;
import org.apache.syncope.common.lib.types.LoggerType;
import org.apache.syncope.common.rest.api.LoggerWrapper;
+import org.apache.syncope.common.rest.api.beans.AuditQuery;
import org.apache.syncope.common.rest.api.service.LoggerService;
+import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
public class LoggerRestClient extends BaseRestClient {
@@ -104,7 +108,48 @@ public class LoggerRestClient extends BaseRestClient {
try {
return getService(LoggerService.class).events();
} catch (Exception e) {
- return Collections.<EventCategory>emptyList();
+ return Collections.emptyList();
}
}
+
+ public List<AuditEntry> search(
+ final String key,
+ final int page,
+ final int size,
+ final AuditElements.EventCategoryType type,
+ final String category,
+ final List<String> events,
+ final AuditElements.Result result,
+ final SortParam<String> sort) {
+
+ AuditQuery query = new AuditQuery.Builder(key).
+ size(size).
+ page(page).
+ type(type).
+ category(category).
+ events(events).
+ result(result).
+ orderBy(toOrderBy(sort)).
+ build();
+
+ return getService(LoggerService.class).search(query).getResult();
+ }
+
+ public int count(
+ final String key,
+ final AuditElements.EventCategoryType type,
+ final String category,
+ final List<String> events,
+ final AuditElements.Result result) {
+
+ AuditQuery query = new AuditQuery.Builder(key).
+ page(1).
+ size(1).
+ type(type).
+ category(category).
+ events(events).
+ result(result).
+ build();
+ return getService(LoggerService.class).search(query).getTotalCount();
+ }
}
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/log/AuditEntry.java b/common/lib/src/main/java/org/apache/syncope/common/lib/log/AuditEntry.java
new file mode 100644
index 0000000..47f5acf
--- /dev/null
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/log/AuditEntry.java
@@ -0,0 +1,158 @@
+/*
+ * 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.common.lib.log;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
+import org.apache.syncope.common.lib.types.AuditLoggerName;
+
+@XmlRootElement(name = "auditEntry")
+@XmlType
+public class AuditEntry extends BaseBean {
+
+ private static final long serialVersionUID = 1215115961911228005L;
+
+ private String who;
+
+ private Date date;
+
+ private AuditLoggerName logger;
+
+ private String before;
+
+ private final List<String> inputs = new ArrayList<>();
+
+ private String output;
+
+ private String throwable;
+
+ @Schema(accessMode = Schema.AccessMode.READ_ONLY)
+ public String getWho() {
+ return who;
+ }
+
+ public void setWho(final String who) {
+ this.who = who;
+ }
+
+ @Schema(accessMode = Schema.AccessMode.READ_ONLY)
+ public Date getDate() {
+ return date == null
+ ? null
+ : new Date(date.getTime());
+ }
+
+ public void setDate(final Date date) {
+ this.date = date == null
+ ? null
+ : new Date(date.getTime());
+ }
+
+ @Schema(accessMode = Schema.AccessMode.READ_ONLY)
+ public AuditLoggerName getLogger() {
+ return logger;
+ }
+
+ public void setLogger(final AuditLoggerName logger) {
+ this.logger = logger;
+ }
+
+ @Schema(accessMode = Schema.AccessMode.READ_ONLY)
+ public String getBefore() {
+ return before;
+ }
+
+ @XmlElementWrapper(name = "inputs")
+ @XmlElement(name = "input")
+ @JsonProperty("inputs")
+ @Schema(accessMode = Schema.AccessMode.READ_ONLY)
+ public List<String> getInputs() {
+ return inputs;
+ }
+
+ public void setBefore(final String before) {
+ this.before = before;
+ }
+
+ @Schema(accessMode = Schema.AccessMode.READ_ONLY)
+ public String getOutput() {
+ return output;
+ }
+
+ public void setOutput(final String output) {
+ this.output = output;
+ }
+
+ @Schema(accessMode = Schema.AccessMode.READ_ONLY)
+ public String getThrowable() {
+ return throwable;
+ }
+
+ public void setThrowable(final String throwable) {
+ this.throwable = throwable;
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().
+ appendSuper(super.hashCode()).
+ append(who).
+ append(date).
+ append(logger).
+ append(before).
+ append(inputs).
+ append(output).
+ append(throwable).
+ build();
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final AuditEntry other = (AuditEntry) obj;
+ return new EqualsBuilder().
+ appendSuper(super.equals(obj)).
+ append(who, other.who).
+ append(date, other.date).
+ append(logger, other.logger).
+ append(before, other.before).
+ append(inputs, other.inputs).
+ append(output, other.output).
+ append(throwable, other.throwable).
+ build();
+ }
+}
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AuditEntryTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AuditEntryTO.java
deleted file mode 100644
index 9d183e6..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AuditEntryTO.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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.common.lib.to;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.BaseBean;
-
-@XmlRootElement(name = "audit")
-@XmlType
-public class AuditEntryTO extends BaseBean implements EntityTO {
-
- private static final long serialVersionUID = 1215115961911228005L;
-
- private String who;
-
- private String subCategory;
-
- private String event;
-
- private String result;
-
- private String before;
-
- private final List<String> inputs = new ArrayList<>();
-
- private String output;
-
- private Date date;
-
- private String throwable;
-
- private String key;
-
- private String loggerName;
-
- public Date getDate() {
- return date;
- }
-
- public void setDate(final Date date) {
- this.date = date;
- }
-
- public String getThrowable() {
- return throwable;
- }
-
- public void setThrowable(final String throwable) {
- this.throwable = throwable;
- }
-
- public String getOutput() {
- return output;
- }
-
- public void setOutput(final String output) {
- this.output = output;
- }
-
- public String getBefore() {
- return before;
- }
-
- public void setBefore(final String before) {
- this.before = before;
- }
-
- public List<String> getInputs() {
- return inputs;
- }
-
- public String getSubCategory() {
- return subCategory;
- }
-
- public void setSubCategory(final String subCategory) {
- this.subCategory = subCategory;
- }
-
- public String getEvent() {
- return event;
- }
-
- public void setEvent(final String event) {
- this.event = event;
- }
-
- public String getResult() {
- return result;
- }
-
- public void setResult(final String result) {
- this.result = result;
- }
-
- public String getWho() {
- return who;
- }
-
- public void setWho(final String who) {
- this.who = who;
- }
-
- public String getLoggerName() {
- return loggerName;
- }
-
- public void setLoggerName(final String loggerName) {
- this.loggerName = loggerName;
- }
-
- @Override
- public String getKey() {
- return this.key;
- }
-
- @Override
- public void setKey(final String key) {
- this.key = key;
- }
-}
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AuditService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AuditService.java
deleted file mode 100644
index 5035494..0000000
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AuditService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.common.rest.api.service;
-
-import io.swagger.v3.oas.annotations.security.SecurityRequirement;
-import io.swagger.v3.oas.annotations.security.SecurityRequirements;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.apache.syncope.common.lib.to.AuditEntryTO;
-import org.apache.syncope.common.lib.to.PagedResult;
-import org.apache.syncope.common.rest.api.RESTHeaders;
-import org.apache.syncope.common.rest.api.beans.AuditQuery;
-
-import javax.ws.rs.BeanParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-/**
- * REST operations for audit events.
- */
-@Tag(name = "Audits")
-@SecurityRequirements({
- @SecurityRequirement(name = "BasicAuthentication"),
- @SecurityRequirement(name = "Bearer") })
-@Path("audits")
-public interface AuditService {
-
- /**
- * Returns a paged list of audit objects matching the given query.
- *
- * @param auditQuery query conditions
- * @return paged list of objects matching the given query
- */
- @GET
- @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
- PagedResult<AuditEntryTO> search(@BeanParam AuditQuery auditQuery);
-}
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
index 293aeba..1b494a3 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
@@ -28,6 +28,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirements;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import javax.validation.constraints.NotNull;
+import javax.ws.rs.BeanParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
@@ -36,12 +37,15 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
+import org.apache.syncope.common.lib.log.AuditEntry;
import org.apache.syncope.common.lib.log.EventCategory;
import org.apache.syncope.common.lib.log.LogAppender;
import org.apache.syncope.common.lib.log.LogStatement;
import org.apache.syncope.common.lib.log.LoggerTO;
+import org.apache.syncope.common.lib.to.PagedResult;
import org.apache.syncope.common.lib.types.LoggerType;
import org.apache.syncope.common.rest.api.RESTHeaders;
+import org.apache.syncope.common.rest.api.beans.AuditQuery;
/**
* REST operations for logging and auditing.
@@ -85,6 +89,17 @@ public interface LoggerService extends JAXRSService {
List<EventCategory> events();
/**
+ * Returns a paged list of audit entries matching the given query.
+ *
+ * @param auditQuery query conditions
+ * @return paged list of audit entries matching the given query
+ */
+ @GET
+ @Path("AUDIT/entries")
+ @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
+ PagedResult<AuditEntry> search(@BeanParam AuditQuery auditQuery);
+
+ /**
* Returns logger with matching type and name.
*
* @param type LoggerType to be selected.
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAuditAppender.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAuditAppender.java
deleted file mode 100644
index 0065543..0000000
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAuditAppender.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.logic;
-
-import org.apache.syncope.core.logic.audit.AuditAppender;
-import org.apache.logging.log4j.core.Appender;
-import org.apache.logging.log4j.core.appender.rewrite.RewriteAppender;
-import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy;
-
-public abstract class AbstractAuditAppender implements AuditAppender {
-
- protected String domainName;
-
- protected Appender targetAppender;
-
- protected RewriteAppender rewriteAppender;
-
- @Override
- public abstract void init();
-
- public abstract void initTargetAppender();
-
- public abstract void initRewriteAppender();
-
- @Override
- public abstract RewritePolicy getRewritePolicy();
-
- @Override
- public String getDomainName() {
- return domainName;
- }
-
- @Override
- public void setDomainName(final String domainName) {
- this.domainName = domainName;
- }
-
- @Override
- public abstract String getTargetAppenderName();
-
- @Override
- public boolean isRewriteEnabled() {
- return rewriteAppender != null;
- }
-
- @Override
- public RewriteAppender getRewriteAppender() {
- return rewriteAppender;
- }
-
- @Override
- public Appender getTargetAppender() {
- return targetAppender;
- }
-
-}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AuditLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AuditLogic.java
deleted file mode 100644
index b43c3b1..0000000
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AuditLogic.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.logic;
-
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.stream.Collectors;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.common.lib.to.AuditEntryTO;
-import org.apache.syncope.common.lib.types.AuditElements;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.syncope.core.persistence.api.dao.AuditDAO;
-import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
-import org.apache.syncope.core.persistence.api.entity.AuditEntry;
-import org.apache.syncope.core.provisioning.api.data.AuditDataBinder;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-@Component
-public class AuditLogic extends AbstractTransactionalLogic<AuditEntryTO> {
-
- @Autowired
- private AuditDataBinder binder;
-
- @Autowired
- private AuditDAO auditDAO;
-
- @PreAuthorize("hasRole('" + StandardEntitlement.AUDIT_SEARCH + "')")
- @Transactional(readOnly = true)
- public Pair<Integer, List<AuditEntryTO>> search(
- final String entityKey,
- final int page,
- final int size,
- final AuditElements.EventCategoryType type,
- final String category,
- final String subcategory,
- final List<String> events,
- final AuditElements.Result result,
- final List<OrderByClause> orderByClauses) {
-
- Integer count = auditDAO.count(entityKey);
- List<AuditEntry> matching = auditDAO.findByEntityKey(
- entityKey, page, size, type, category, subcategory, events, result, orderByClauses);
- List<AuditEntryTO> searchResults = matching.stream().
- map(auditEntry -> binder.getAuditTO(entityKey, auditEntry)).
- collect(Collectors.toList());
- return Pair.of(count, searchResults);
- }
-
- @Override
- protected AuditEntryTO resolveReference(final Method method, final Object... args)
- throws UnresolvedReferenceException {
- throw new UnresolvedReferenceException();
- }
-}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
index c0f144a..e935a00 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
@@ -26,10 +26,12 @@ import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
+import org.apache.commons.lang3.tuple.Pair;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.LoggerConfig;
+import org.apache.syncope.common.lib.log.AuditEntry;
import org.apache.syncope.common.lib.SyncopeClientException;
import org.apache.syncope.common.lib.SyncopeConstants;
import org.apache.syncope.common.lib.log.EventCategory;
@@ -54,6 +56,7 @@ import org.apache.syncope.core.persistence.api.dao.DomainDAO;
import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
import org.apache.syncope.core.persistence.api.dao.LoggerDAO;
import org.apache.syncope.core.persistence.api.dao.NotFoundException;
+import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
import org.apache.syncope.core.persistence.api.entity.EntityFactory;
import org.apache.syncope.core.persistence.api.entity.Logger;
import org.apache.syncope.core.provisioning.java.pushpull.PushJobDelegate;
@@ -71,6 +74,7 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ClassUtils;
import org.springframework.util.SystemPropertyUtils;
+import org.apache.syncope.core.provisioning.api.data.LoggerDataBinder;
@Component
public class LoggerLogic extends AbstractTransactionalLogic<EntityTO> {
@@ -90,6 +94,9 @@ public class LoggerLogic extends AbstractTransactionalLogic<EntityTO> {
@Autowired
private EntityFactory entityFactory;
+ @Autowired
+ private LoggerDataBinder binder;
+
@PreAuthorize("hasRole('" + StandardEntitlement.LOG_LIST + "') and authentication.details.domain == "
+ "T(org.apache.syncope.common.lib.SyncopeConstants).MASTER_DOMAIN")
@Transactional(readOnly = true)
@@ -114,12 +121,7 @@ public class LoggerLogic extends AbstractTransactionalLogic<EntityTO> {
}
private List<LoggerTO> list(final LoggerType type) {
- return loggerDAO.findAll(type).stream().map(logger -> {
- LoggerTO loggerTO = new LoggerTO();
- loggerTO.setKey(logger.getKey());
- loggerTO.setLevel(logger.getLevel());
- return loggerTO;
- }).collect(Collectors.toList());
+ return loggerDAO.findAll(type).stream().map(binder::getLoggerTO).collect(Collectors.toList());
}
@PreAuthorize("hasRole('" + StandardEntitlement.LOG_LIST + "') and authentication.details.domain == "
@@ -172,12 +174,7 @@ public class LoggerLogic extends AbstractTransactionalLogic<EntityTO> {
public LoggerTO readAudit(final String name) {
return listAudits().stream().
filter(logger -> logger.toLoggerName().equals(name)).findFirst().
- map(logger -> {
- LoggerTO loggerTO = new LoggerTO();
- loggerTO.setKey(logger.toLoggerName());
- loggerTO.setLevel(LoggerLevel.DEBUG);
- return loggerTO;
- }).orElseThrow(() -> new NotFoundException("Audit " + name));
+ map(binder::getLoggerTO).orElseThrow(() -> new NotFoundException("Audit " + name));
}
private LoggerTO setLevel(final String name, final Level level, final LoggerType expectedType) {
@@ -230,11 +227,7 @@ public class LoggerLogic extends AbstractTransactionalLogic<EntityTO> {
logConf.setLevel(level);
ctx.updateLoggers();
- LoggerTO result = new LoggerTO();
- result.setKey(syncopeLogger.getKey());
- result.setLevel(syncopeLogger.getLevel());
-
- return result;
+ return binder.getLoggerTO(syncopeLogger);
}
@PreAuthorize("hasRole('" + StandardEntitlement.LOG_SET_LEVEL + "') and authentication.details.domain == "
@@ -263,9 +256,7 @@ public class LoggerLogic extends AbstractTransactionalLogic<EntityTO> {
throwInvalidLogger(expectedType);
}
- LoggerTO loggerToDelete = new LoggerTO();
- loggerToDelete.setKey(syncopeLogger.getKey());
- loggerToDelete.setLevel(syncopeLogger.getLevel());
+ LoggerTO loggerToDelete = binder.getLoggerTO(syncopeLogger);
// remove SyncopeLogger from local storage, so that LoggerLoader won't load this next time
loggerDAO.delete(syncopeLogger);
@@ -404,6 +395,25 @@ public class LoggerLogic extends AbstractTransactionalLogic<EntityTO> {
return new ArrayList<>(events);
}
+ @PreAuthorize("hasRole('" + StandardEntitlement.AUDIT_SEARCH + "')")
+ @Transactional(readOnly = true)
+ public Pair<Integer, List<AuditEntry>> search(
+ final String entityKey,
+ final int page,
+ final int size,
+ final AuditElements.EventCategoryType type,
+ final String category,
+ final String subcategory,
+ final List<String> events,
+ final AuditElements.Result result,
+ final List<OrderByClause> orderByClauses) {
+
+ int count = loggerDAO.countAuditEntries(entityKey);
+ List<AuditEntry> matching = loggerDAO.findAuditEntries(
+ entityKey, page, size, type, category, subcategory, events, result, orderByClauses);
+ return Pair.of(count, matching);
+ }
+
@Override
protected EntityTO resolveReference(final Method method, final Object... args)
throws UnresolvedReferenceException {
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/audit/AuditAppender.java b/core/logic/src/main/java/org/apache/syncope/core/logic/audit/AuditAppender.java
index f6a0716..acfe35f 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/audit/AuditAppender.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/audit/AuditAppender.java
@@ -18,10 +18,11 @@
*/
package org.apache.syncope.core.logic.audit;
+import java.util.Collections;
+import java.util.Optional;
import java.util.Set;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.appender.rewrite.RewriteAppender;
-import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy;
import org.apache.syncope.common.lib.types.AuditLoggerName;
/**
@@ -32,21 +33,17 @@ import org.apache.syncope.common.lib.types.AuditLoggerName;
*/
public interface AuditAppender {
- void init();
+ void init(String domain);
- Set<AuditLoggerName> getEvents();
+ default Set<AuditLoggerName> getEvents() {
+ return Collections.emptySet();
+ }
Appender getTargetAppender();
- RewritePolicy getRewritePolicy();
-
String getTargetAppenderName();
- void setDomainName(String name);
-
- String getDomainName();
-
- boolean isRewriteEnabled();
-
- RewriteAppender getRewriteAppender();
+ default Optional<RewriteAppender> getRewriteAppender() {
+ return Optional.empty();
+ }
}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/audit/DefaultAuditAppender.java b/core/logic/src/main/java/org/apache/syncope/core/logic/audit/DefaultAuditAppender.java
index 0fdd0b5..a78f82f 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/audit/DefaultAuditAppender.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/audit/DefaultAuditAppender.java
@@ -18,37 +18,31 @@
*/
package org.apache.syncope.core.logic.audit;
-import java.util.Collections;
-import java.util.Set;
-import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy;
-import org.apache.syncope.common.lib.types.AuditLoggerName;
-import org.apache.syncope.core.logic.AbstractAuditAppender;
+import org.apache.logging.log4j.core.Appender;
/**
* Default (abstract) implementation of custom audit appender.
+ *
* It is bound to an empty collection of events, i.e. it does not create any logger.
- * This class shall be extended by non-rewriting appenders; for rewriting, extend
+ * This class shall be extended by non-rewrite appenders; for rewrite, extend
* {@link DefaultRewriteAuditAppender} instead.
*/
-public abstract class DefaultAuditAppender extends AbstractAuditAppender {
+public abstract class DefaultAuditAppender implements AuditAppender {
- @Override
- public void init() {
- initTargetAppender();
- }
+ protected String domain;
- @Override
- public Set<AuditLoggerName> getEvents() {
- return Collections.emptySet();
- }
+ protected Appender targetAppender;
@Override
- public void initRewriteAppender() {
+ public void init(final String domain) {
+ this.domain = domain;
+ initTargetAppender();
}
+ protected abstract void initTargetAppender();
+
@Override
- public RewritePolicy getRewritePolicy() {
- return null;
+ public Appender getTargetAppender() {
+ return targetAppender;
}
-
}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/audit/DefaultRewriteAuditAppender.java b/core/logic/src/main/java/org/apache/syncope/core/logic/audit/DefaultRewriteAuditAppender.java
index a937cc9..ed62206 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/audit/DefaultRewriteAuditAppender.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/audit/DefaultRewriteAuditAppender.java
@@ -18,47 +18,44 @@
*/
package org.apache.syncope.core.logic.audit;
-import java.util.Collections;
-import java.util.Set;
+import java.util.Optional;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.rewrite.RewriteAppender;
import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy;
import org.apache.logging.log4j.core.config.AppenderRef;
-import org.apache.syncope.common.lib.types.AuditLoggerName;
-import org.apache.syncope.core.logic.AbstractAuditAppender;
/**
- * Default (abstract) implementation of custom rewriting audit appender; it provides rewrite appender definition and
- * a default "pass-through" policy.
+ * Default (abstract) implementation of rewrite audit appender, allowing the logging event to be manipulated
+ * before it is processed.
+ * It provides rewrite appender definition and a default "pass-through" policy.
* It is bound to an empty collection of events, i.e. it does not create any logger.
- * This class shall be extended by rewriting appenders; for non-rewriting, extend {@link DefaultAuditAppender} instead.
+ * This class shall be extended by rewrite appenders; for non-rewrite, extend {@link DefaultAuditAppender} instead.
+ *
+ * @see RewriteAppender
*/
-public abstract class DefaultRewriteAuditAppender extends AbstractAuditAppender {
+public abstract class DefaultRewriteAuditAppender extends DefaultAuditAppender {
- @Override
- public void init() {
- initTargetAppender();
- initRewriteAppender();
- }
+ protected RewriteAppender rewriteAppender;
@Override
- public void initRewriteAppender() {
- rewriteAppender = RewriteAppender.createAppender(getTargetAppenderName() + "_rewrite",
+ public void init(final String domain) {
+ super.init(domain);
+
+ rewriteAppender = RewriteAppender.createAppender(
+ getTargetAppenderName() + "_rewrite",
"true",
new AppenderRef[] { AppenderRef.createAppenderRef(getTargetAppenderName(), Level.DEBUG, null) },
((LoggerContext) LogManager.getContext(false)).getConfiguration(), getRewritePolicy(), null);
}
- @Override
- public Set<AuditLoggerName> getEvents() {
- return Collections.emptySet();
+ protected RewritePolicy getRewritePolicy() {
+ return PassThroughAuditRewritePolicy.createPolicy();
}
@Override
- public RewritePolicy getRewritePolicy() {
- return PassThroughAuditRewritePolicy.createPolicy();
+ public Optional<RewriteAppender> getRewriteAppender() {
+ return Optional.of(rewriteAppender);
}
-
}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/audit/JdbcAuditAppender.java b/core/logic/src/main/java/org/apache/syncope/core/logic/audit/JdbcAuditAppender.java
new file mode 100644
index 0000000..15575d2
--- /dev/null
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/audit/JdbcAuditAppender.java
@@ -0,0 +1,102 @@
+/*
+ * 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.logic.audit;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import javax.sql.DataSource;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.db.ColumnMapping;
+import org.apache.logging.log4j.core.appender.db.jdbc.AbstractConnectionSource;
+import org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender;
+import org.apache.syncope.core.persistence.api.DomainsHolder;
+import org.apache.syncope.core.persistence.api.dao.LoggerDAO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.datasource.DataSourceUtils;
+
+public class JdbcAuditAppender extends DefaultAuditAppender {
+
+ @Autowired
+ protected DomainsHolder domainsHolder;
+
+ @Override
+ protected void initTargetAppender() {
+ LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
+
+ ColumnMapping[] columnMappings = {
+ ColumnMapping.newBuilder().
+ setConfiguration(ctx.getConfiguration()).setName("EVENT_DATE").setType(Timestamp.class).build(),
+ ColumnMapping.newBuilder().
+ setConfiguration(ctx.getConfiguration()).setName("LOGGER_LEVEL").setPattern("%level").build(),
+ ColumnMapping.newBuilder().
+ setConfiguration(ctx.getConfiguration()).setName("LOGGER").setPattern("%logger").build(),
+ ColumnMapping.newBuilder().
+ setConfiguration(ctx.getConfiguration()).
+ setName(LoggerDAO.AUDIT_MESSAGE_COLUMN).setPattern("%message").build(),
+ ColumnMapping.newBuilder().
+ setConfiguration(ctx.getConfiguration()).setName("THROWABLE").setPattern("%ex{full}").build()
+ };
+
+ Appender appender = ctx.getConfiguration().getAppender("audit_for_" + domain);
+ if (appender == null) {
+ appender = JdbcAppender.newBuilder().
+ setName("audit_for_" + domain).
+ setIgnoreExceptions(false).
+ setConnectionSource(new DataSourceConnectionSource(domain, domainsHolder.getDomains().get(domain))).
+ setBufferSize(0).
+ setTableName(LoggerDAO.AUDIT_TABLE).
+ setColumnMappings(columnMappings).
+ build();
+ appender.start();
+ ctx.getConfiguration().addAppender(appender);
+ }
+ targetAppender = appender;
+ }
+
+ @Override
+ public String getTargetAppenderName() {
+ // not used
+ return null;
+ }
+
+ protected static class DataSourceConnectionSource extends AbstractConnectionSource {
+
+ private final String description;
+
+ private final DataSource dataSource;
+
+ DataSourceConnectionSource(final String domain, final DataSource dataSource) {
+ this.description = "dataSource{ domain=" + domain + ", value=" + dataSource + " }";
+ this.dataSource = dataSource;
+ }
+
+ @Override
+ public Connection getConnection() throws SQLException {
+ return DataSourceUtils.getConnection(dataSource);
+ }
+
+ @Override
+ public String toString() {
+ return this.description;
+ }
+ }
+}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/audit/PassThroughAuditRewritePolicy.java b/core/logic/src/main/java/org/apache/syncope/core/logic/audit/PassThroughAuditRewritePolicy.java
index b3ee968..609c486 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/audit/PassThroughAuditRewritePolicy.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/audit/PassThroughAuditRewritePolicy.java
@@ -39,5 +39,4 @@ public class PassThroughAuditRewritePolicy implements RewritePolicy {
public static PassThroughAuditRewritePolicy createPolicy() {
return new PassThroughAuditRewritePolicy();
}
-
}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java b/core/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java
index e77e09b..abd3de4 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java
@@ -32,6 +32,7 @@ import org.apache.syncope.common.lib.policy.PushCorrelationRuleConf;
import org.apache.syncope.common.lib.report.ReportletConf;
import org.apache.syncope.common.lib.types.ImplementationType;
import org.apache.syncope.core.logic.audit.AuditAppender;
+import org.apache.syncope.core.logic.audit.JdbcAuditAppender;
import org.apache.syncope.core.persistence.api.ImplementationLookup;
import org.apache.syncope.core.persistence.api.attrvalue.validation.Validator;
import org.apache.syncope.core.persistence.api.dao.AccountRule;
@@ -239,7 +240,9 @@ public class ClassPathScanImplementationLookup implements ImplementationLookup {
classNames.get(ImplementationType.RECIPIENTS_PROVIDER).add(bd.getBeanClassName());
}
- if (AuditAppender.class.isAssignableFrom(clazz) && !isAbstractClazz) {
+ if (AuditAppender.class.isAssignableFrom(clazz)
+ && !JdbcAuditAppender.class.equals(clazz) && !isAbstractClazz) {
+
classNames.get(ImplementationType.AUDIT_APPENDER).add(clazz.getName());
auditAppenderClasses.add(clazz);
}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
index 4a8a66b..aff916d 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
@@ -18,36 +18,30 @@
*/
package org.apache.syncope.core.logic.init;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.stream.Collectors;
-import javax.sql.DataSource;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.appender.db.ColumnMapping;
-import org.apache.logging.log4j.core.appender.db.jdbc.AbstractConnectionSource;
-import org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender;
import org.apache.logging.log4j.core.appender.rewrite.RewriteAppender;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.syncope.common.lib.types.AuditLoggerName;
import org.apache.syncope.core.logic.audit.AuditAppender;
import org.apache.syncope.core.logic.MemoryAppender;
+import org.apache.syncope.core.logic.audit.JdbcAuditAppender;
import org.apache.syncope.core.spring.security.AuthContextUtils;
import org.apache.syncope.core.persistence.api.DomainsHolder;
import org.apache.syncope.core.persistence.api.ImplementationLookup;
import org.apache.syncope.core.persistence.api.SyncopeLoader;
-import org.apache.syncope.core.persistence.api.dao.AuditDAO;
import org.apache.syncope.core.spring.ApplicationContextProvider;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
-import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.stereotype.Component;
@Component
@@ -62,6 +56,9 @@ public class LoggerLoader implements SyncopeLoader {
@Autowired
private ImplementationLookup implementationLookup;
+ @Value("${enable.jdbcAuditAppender:true}")
+ private boolean enableJdbcAuditAppender;
+
private final Map<String, MemoryAppender> memoryAppenders = new HashMap<>();
@Override
@@ -74,64 +71,38 @@ public class LoggerLoader implements SyncopeLoader {
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
ctx.getConfiguration().getAppenders().entrySet().stream().
- filter(entry -> (entry.getValue() instanceof MemoryAppender)).
- forEach(entry -> {
- memoryAppenders.put(entry.getKey(), (MemoryAppender) entry.getValue());
- });
-
- // Audit table and DataSource for each configured domain
- ColumnMapping[] columnMappings = {
- ColumnMapping.newBuilder().
- setConfiguration(ctx.getConfiguration()).setName("EVENT_DATE").setType(Timestamp.class).build(),
- ColumnMapping.newBuilder().
- setConfiguration(ctx.getConfiguration()).setName("LOGGER_LEVEL").setPattern("%level").build(),
- ColumnMapping.newBuilder().
- setConfiguration(ctx.getConfiguration()).setName("LOGGER").setPattern("%logger").build(),
- ColumnMapping.newBuilder().
- setConfiguration(ctx.getConfiguration()).setName(AuditDAO.MESSAGE_COLUMN).setPattern("%message").build(),
- ColumnMapping.newBuilder().
- setConfiguration(ctx.getConfiguration()).setName("THROWABLE").setPattern("%ex{full}").build()
- };
-
- domainsHolder.getDomains().forEach((key, value) -> {
- Appender appender = ctx.getConfiguration().getAppender("audit_for_" + key);
- if (appender == null) {
- appender = JdbcAppender.newBuilder().
- setName("audit_for_" + key).
- setIgnoreExceptions(false).
- setConnectionSource(new DataSourceConnectionSource(key, value)).
- setBufferSize(0).
- setTableName(AuditDAO.TABLE).
- setColumnMappings(columnMappings).
- build();
- appender.start();
- ctx.getConfiguration().addAppender(appender);
+ filter(entry -> entry.getValue() instanceof MemoryAppender).
+ forEach(entry -> memoryAppenders.put(entry.getKey(), (MemoryAppender) entry.getValue()));
+
+ domainsHolder.getDomains().keySet().forEach(domain -> {
+ if (enableJdbcAuditAppender) {
+ JdbcAuditAppender jdbcAuditAppender = (JdbcAuditAppender) ApplicationContextProvider.getBeanFactory().
+ createBean(JdbcAuditAppender.class, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
+ jdbcAuditAppender.init(domain);
+
+ LoggerConfig logConf = new LoggerConfig(AuditLoggerName.getAuditLoggerName(domain), null, false);
+ logConf.addAppender(jdbcAuditAppender.getTargetAppender(), Level.DEBUG, null);
+ logConf.setLevel(Level.DEBUG);
+ ctx.getConfiguration().addLogger(logConf.getName(), logConf);
}
- LoggerConfig logConf = new LoggerConfig(AuditLoggerName.getAuditLoggerName(key), null, false);
- logConf.addAppender(appender, Level.DEBUG, null);
- logConf.setLevel(Level.DEBUG);
- ctx.getConfiguration().addLogger(logConf.getName(), logConf);
-
// SYNCOPE-1144 For each custom audit appender class add related appenders to log4j logger
- auditAppenders(key).forEach(auditAppender -> {
- auditAppender.getEvents().stream().
- map(event -> AuditLoggerName.getAuditEventLoggerName(key, event.toLoggerName())).
- forEachOrdered(domainAuditLoggerName -> {
- LoggerConfig eventLogConf = ctx.getConfiguration().getLoggerConfig(domainAuditLoggerName);
- boolean isRootLogConf = LogManager.ROOT_LOGGER_NAME.equals(eventLogConf.getName());
- if (isRootLogConf) {
- eventLogConf = new LoggerConfig(domainAuditLoggerName, null, false);
- }
- addAppenderToContext(ctx, auditAppender, eventLogConf);
- eventLogConf.setLevel(Level.DEBUG);
- if (isRootLogConf) {
- ctx.getConfiguration().addLogger(domainAuditLoggerName, eventLogConf);
- }
- });
- });
-
- AuthContextUtils.execWithAuthContext(key, () -> {
+ auditAppenders(domain).forEach(auditAppender -> auditAppender.getEvents().stream().
+ map(event -> AuditLoggerName.getAuditEventLoggerName(domain, event.toLoggerName())).
+ forEach(domainAuditLoggerName -> {
+ LoggerConfig eventLogConf = ctx.getConfiguration().getLoggerConfig(domainAuditLoggerName);
+ boolean isRootLogConf = LogManager.ROOT_LOGGER_NAME.equals(eventLogConf.getName());
+ if (isRootLogConf) {
+ eventLogConf = new LoggerConfig(domainAuditLoggerName, null, false);
+ }
+ addAppenderToContext(ctx, auditAppender, eventLogConf);
+ eventLogConf.setLevel(Level.DEBUG);
+ if (isRootLogConf) {
+ ctx.getConfiguration().addLogger(domainAuditLoggerName, eventLogConf);
+ }
+ }));
+
+ AuthContextUtils.execWithAuthContext(domain, () -> {
loggerAccessor.synchronizeLog4J(ctx);
return null;
});
@@ -153,8 +124,7 @@ public class LoggerLoader implements SyncopeLoader {
} else {
auditAppender = (AuditAppender) ApplicationContextProvider.getBeanFactory().
createBean(clazz, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
- auditAppender.setDomainName(domain);
- auditAppender.init();
+ auditAppender.init(domain);
}
return auditAppender;
}).collect(Collectors.toList());
@@ -171,39 +141,13 @@ public class LoggerLoader implements SyncopeLoader {
}
targetAppender.start();
ctx.getConfiguration().addAppender(targetAppender);
- if (auditAppender.isRewriteEnabled()) {
- RewriteAppender rewriteAppender = ctx.getConfiguration().getAppender(auditAppender.
- getTargetAppenderName() + "_rewrite");
- if (rewriteAppender == null) {
- rewriteAppender = auditAppender.getRewriteAppender();
- }
- rewriteAppender.start();
- ctx.getConfiguration().addAppender(rewriteAppender);
- eventLogConf.addAppender(rewriteAppender, Level.DEBUG, null);
+
+ Optional<RewriteAppender> rewriteAppender = auditAppender.getRewriteAppender();
+ if (rewriteAppender.isPresent()) {
+ rewriteAppender.get().start();
+ eventLogConf.addAppender(rewriteAppender.get(), Level.DEBUG, null);
} else {
eventLogConf.addAppender(targetAppender, Level.DEBUG, null);
}
}
-
- private static class DataSourceConnectionSource extends AbstractConnectionSource {
-
- private final String description;
-
- private final DataSource dataSource;
-
- DataSourceConnectionSource(final String domain, final DataSource dataSource) {
- this.description = "dataSource{ domain=" + domain + ", value=" + dataSource + " }";
- this.dataSource = dataSource;
- }
-
- @Override
- public Connection getConnection() throws SQLException {
- return DataSourceUtils.getConnection(dataSource);
- }
-
- @Override
- public String toString() {
- return this.description;
- }
- }
}
diff --git a/core/logic/src/main/resources/logic.properties b/core/logic/src/main/resources/logic.properties
index a9a71b1..60dcae6 100644
--- a/core/logic/src/main/resources/logic.properties
+++ b/core/logic/src/main/resources/logic.properties
@@ -16,3 +16,4 @@
# under the License.
logicInvocationHandler=org.apache.syncope.core.logic.LogicInvocationHandler
classPathScanImplementationLookup=org.apache.syncope.core.logic.init.ClassPathScanImplementationLookup
+enable.jdbcAuditAppender=true
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AuditDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AuditDAO.java
deleted file mode 100644
index 5a78787..0000000
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AuditDAO.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.persistence.api.dao;
-
-import java.util.List;
-
-import org.apache.syncope.common.lib.types.AuditElements;
-import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
-import org.apache.syncope.core.persistence.api.entity.AuditEntry;
-
-public interface AuditDAO {
-
- String TABLE = "SYNCOPEAUDIT";
-
- String MESSAGE_COLUMN = "MESSAGE";
-
- List<AuditEntry> findByEntityKey(
- String entityKey,
- int page,
- int size,
- AuditElements.EventCategoryType type,
- String category,
- String subcategory,
- List<String> events,
- AuditElements.Result result,
- List<OrderByClause> orderByClauses);
-
- int count(String key);
-}
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/LoggerDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/LoggerDAO.java
index 55a5db7..e8cfe5a 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/LoggerDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/LoggerDAO.java
@@ -19,11 +19,18 @@
package org.apache.syncope.core.persistence.api.dao;
import java.util.List;
+import org.apache.syncope.common.lib.log.AuditEntry;
+import org.apache.syncope.common.lib.types.AuditElements;
import org.apache.syncope.common.lib.types.LoggerType;
+import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
import org.apache.syncope.core.persistence.api.entity.Logger;
public interface LoggerDAO extends DAO<Logger> {
+ String AUDIT_TABLE = "SYNCOPEAUDIT";
+
+ String AUDIT_MESSAGE_COLUMN = "MESSAGE";
+
Logger find(String key);
List<Logger> findAll(LoggerType type);
@@ -33,4 +40,17 @@ public interface LoggerDAO extends DAO<Logger> {
void delete(String key);
void delete(Logger logger);
+
+ List<AuditEntry> findAuditEntries(
+ String entityKey,
+ int page,
+ int size,
+ AuditElements.EventCategoryType type,
+ String category,
+ String subcategory,
+ List<String> events,
+ AuditElements.Result result,
+ List<OrderByClause> orderByClauses);
+
+ int countAuditEntries(String entityKey);
}
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AuditEntry.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AuditEntry.java
deleted file mode 100644
index 2b10e43..0000000
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AuditEntry.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.persistence.api.entity;
-
-import java.io.Serializable;
-import java.util.Date;
-import org.apache.syncope.common.lib.types.AuditLoggerName;
-
-public interface AuditEntry extends Serializable {
-
- String getWho();
-
- AuditLoggerName getLogger();
-
- Object getBefore();
-
- Object getOutput();
-
- Object[] getInput();
-
- String getThrowable();
-
- Date getDate();
-}
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAuditDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONLoggerDAO.java
similarity index 98%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAuditDAO.java
rename to core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONLoggerDAO.java
index a921db1..3a7c1f3 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAuditDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONLoggerDAO.java
@@ -27,7 +27,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.syncope.common.lib.types.AuditElements;
import org.springframework.util.CollectionUtils;
-public abstract class AbstractJPAJSONAuditDAO extends JPAAuditDAO {
+public abstract class AbstractJPAJSONLoggerDAO extends JPALoggerDAO {
private static final ObjectMapper MAPPER = new ObjectMapper();
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAuditDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONLoggerDAO.java
similarity index 79%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAuditDAO.java
rename to core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONLoggerDAO.java
index 020069b..bbffaed 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAuditDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONLoggerDAO.java
@@ -23,20 +23,20 @@ import java.util.List;
import java.util.stream.Collectors;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
-public class MyJPAJSONAuditDAO extends AbstractJPAJSONAuditDAO {
+public class MyJPAJSONLoggerDAO extends AbstractJPAJSONLoggerDAO {
private static class MyMessageCriteriaBuilder extends JSONMessageCriteriaBuilder {
@Override
protected String doBuild(final List<ObjectNode> containers) {
- query.append('(').append(MESSAGE_COLUMN).append(" -> '$.before' LIKE '%").append(entityKey).
- append("%' OR ").append(MESSAGE_COLUMN).append(" -> '$.input' LIKE '%").append(entityKey).
- append("%' OR ").append(MESSAGE_COLUMN).append(" -> '$.output' LIKE '%").append(entityKey).
+ query.append('(').append(AUDIT_MESSAGE_COLUMN).append(" -> '$.before' LIKE '%").append(entityKey).
+ append("%' OR ").append(AUDIT_MESSAGE_COLUMN).append(" -> '$.input' LIKE '%").append(entityKey).
+ append("%' OR ").append(AUDIT_MESSAGE_COLUMN).append(" -> '$.output' LIKE '%").append(entityKey).
append("%')");
if (!containers.isEmpty()) {
query.append(" AND (").
- append(containers.stream().map(container -> "JSON_CONTAINS(" + MESSAGE_COLUMN + ", '"
+ append(containers.stream().map(container -> "JSON_CONTAINS(" + AUDIT_MESSAGE_COLUMN + ", '"
+ POJOHelper.serialize(container).replace("'", "''")
+ "')").collect(Collectors.joining(" OR "))).
append(')');
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAuditDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONLoggerDAO.java
similarity index 78%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAuditDAO.java
rename to core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONLoggerDAO.java
index 54ea828..c9ee797 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAuditDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONLoggerDAO.java
@@ -21,23 +21,23 @@ package org.apache.syncope.core.persistence.jpa.dao;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.List;
import java.util.stream.Collectors;
-import org.apache.syncope.core.persistence.jpa.dao.AbstractJPAJSONAuditDAO.JSONMessageCriteriaBuilder;
+import org.apache.syncope.core.persistence.jpa.dao.AbstractJPAJSONLoggerDAO.JSONMessageCriteriaBuilder;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
-public class PGJPAJSONAuditDAO extends AbstractJPAJSONAuditDAO {
+public class PGJPAJSONLoggerDAO extends AbstractJPAJSONLoggerDAO {
private static class PGMessageCriteriaBuilder extends JSONMessageCriteriaBuilder {
@Override
protected String doBuild(final List<ObjectNode> containers) {
- query.append('(').append(MESSAGE_COLUMN).append(" ->> 'before' LIKE '%").append(entityKey).
- append("%' OR ").append(MESSAGE_COLUMN).append(" ->> 'input' LIKE '%").append(entityKey).
- append("%' OR ").append(MESSAGE_COLUMN).append(" ->> 'output' LIKE '%").append(entityKey).
+ query.append('(').append(AUDIT_MESSAGE_COLUMN).append(" ->> 'before' LIKE '%").append(entityKey).
+ append("%' OR ").append(AUDIT_MESSAGE_COLUMN).append(" ->> 'input' LIKE '%").append(entityKey).
+ append("%' OR ").append(AUDIT_MESSAGE_COLUMN).append(" ->> 'output' LIKE '%").append(entityKey).
append("%')");
if (!containers.isEmpty()) {
query.append(" AND (").
- append(containers.stream().map(container -> MESSAGE_COLUMN + " @> '"
+ append(containers.stream().map(container -> AUDIT_MESSAGE_COLUMN + " @> '"
+ POJOHelper.serialize(container).replace("'", "''")
+ "'::jsonb").collect(Collectors.joining(" OR "))).
append(')');
@@ -49,7 +49,7 @@ public class PGJPAJSONAuditDAO extends AbstractJPAJSONAuditDAO {
@Override
protected String select() {
- return MESSAGE_COLUMN + "::text";
+ return AUDIT_MESSAGE_COLUMN + "::text";
}
@Override
diff --git a/core/persistence-jpa-json/src/main/resources/myjson/persistence.properties b/core/persistence-jpa-json/src/main/resources/myjson/persistence.properties
index dc034b6..20b19a8 100644
--- a/core/persistence-jpa-json/src/main/resources/myjson/persistence.properties
+++ b/core/persistence-jpa-json/src/main/resources/myjson/persistence.properties
@@ -25,5 +25,5 @@ user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONUserDAO
group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONGroupDAO
anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONAnyObjectDAO
conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONConfDAO
-audit.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONAuditDAO
+logger.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONLoggerDAO
openjpa.RemoteCommitProvider=sjvm
diff --git a/core/persistence-jpa-json/src/main/resources/pgjsonb/persistence.properties b/core/persistence-jpa-json/src/main/resources/pgjsonb/persistence.properties
index 8c7b40a..78d0d87 100644
--- a/core/persistence-jpa-json/src/main/resources/pgjsonb/persistence.properties
+++ b/core/persistence-jpa-json/src/main/resources/pgjsonb/persistence.properties
@@ -25,5 +25,5 @@ user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONUserDAO
group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONGroupDAO
anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONAnyObjectDAO
conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONConfDAO
-audit.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONAuditDAO
+logger.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONLoggerDAO
openjpa.RemoteCommitProvider=sjvm
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAuditDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAuditDAO.java
deleted file mode 100644
index be47a81..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAuditDAO.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * 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.persistence.jpa.dao;
-
-import java.sql.Clob;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-import javax.persistence.Query;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.types.AuditElements;
-import org.apache.syncope.core.persistence.api.dao.AuditDAO;
-import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
-import org.apache.syncope.core.persistence.api.entity.AuditEntry;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractEntity;
-import org.apache.syncope.core.provisioning.api.AuditEntryImpl;
-import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
-import org.springframework.transaction.annotation.Transactional;
-
-public class JPAAuditDAO extends AbstractDAO<AbstractEntity> implements AuditDAO {
-
- protected static class MessageCriteriaBuilder {
-
- protected final StringBuilder query = new StringBuilder();
-
- protected MessageCriteriaBuilder entityKey(final String entityKey) {
- query.append(' ').append(MESSAGE_COLUMN).append(" LIKE '%\"key\":\"").append(entityKey).append("\"%'");
- return this;
- }
-
- public MessageCriteriaBuilder type(final AuditElements.EventCategoryType type) {
- if (type != null) {
- query.append(" AND " + MESSAGE_COLUMN + " LIKE '%\"type\":\"").append(type.name()).append("\"%'");
- }
- return this;
- }
-
- public MessageCriteriaBuilder category(final String category) {
- if (StringUtils.isNotBlank(category)) {
- query.append(" AND " + MESSAGE_COLUMN + " LIKE '%\"category\":\"").append(category).append("\"%'");
- }
- return this;
- }
-
- public MessageCriteriaBuilder subcategory(final String subcategory) {
- if (StringUtils.isNotBlank(subcategory)) {
- query.append(" AND " + MESSAGE_COLUMN + " LIKE '%\"subcategory\":\"").
- append(subcategory).append("\"%'");
- }
- return this;
- }
-
- public MessageCriteriaBuilder events(final List<String> events) {
- if (!events.isEmpty()) {
- query.append(" AND ( ").
- append(events.stream().
- map(event -> MESSAGE_COLUMN + " LIKE '%\"event\":\"" + event + "\"%'").
- collect(Collectors.joining(" OR "))).
- append(" )");
- }
- return this;
- }
-
- public MessageCriteriaBuilder result(final AuditElements.Result result) {
- if (result != null) {
- query.append(" AND ").
- append(MESSAGE_COLUMN).append(" LIKE '%\"result\":\"").append(result.name()).append("\"%' ");
- }
- return this;
- }
-
- public String build() {
- return query.toString();
- }
- }
-
- protected MessageCriteriaBuilder messageCriteriaBuilder(final String entityKey) {
- return new MessageCriteriaBuilder().entityKey(entityKey);
- }
-
- protected String select() {
- return MESSAGE_COLUMN;
- }
-
- @Transactional(readOnly = true)
- @Override
- public List<AuditEntry> findByEntityKey(
- final String entityKey,
- final int page,
- final int itemsPerPage,
- final AuditElements.EventCategoryType type,
- final String category,
- final String subcategory,
- final List<String> events,
- final AuditElements.Result result,
- final List<OrderByClause> orderByClauses) {
-
- String queryString = "SELECT " + select()
- + " FROM " + TABLE
- + " WHERE " + messageCriteriaBuilder(entityKey).
- type(type).
- category(category).
- subcategory(subcategory).
- result(result).
- events(events).
- build();
- if (!orderByClauses.isEmpty()) {
- queryString += " ORDER BY " + orderByClauses.stream().
- map(orderBy -> orderBy.getField() + ' ' + orderBy.getDirection().name()).
- collect(Collectors.joining(","));
- }
-
- Query query = entityManager().createNativeQuery(queryString);
- query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
- if (itemsPerPage >= 0) {
- query.setMaxResults(itemsPerPage);
- }
-
- @SuppressWarnings("unchecked")
- List<Object> entries = query.getResultList();
- return entries.stream().map(row -> {
- String value;
- if (row instanceof Clob) {
- Clob clob = (Clob) row;
- try {
- value = clob.getSubString(1, (int) clob.length());
- } catch (SQLException e) {
- LOG.error("Unexpected error reading Audit Entry for entity key {}", entityKey, e);
- return null;
- }
- } else {
- value = row.toString();
- }
- return POJOHelper.deserialize(value, AuditEntryImpl.class);
- }).filter(Objects::nonNull).collect(Collectors.toList());
- }
-
- @Override
- public int count(final String key) {
- String queryString = "SELECT COUNT(0) FROM " + TABLE
- + " WHERE " + messageCriteriaBuilder(key).build();
- Query countQuery = entityManager().createNativeQuery(queryString);
-
- return ((Number) countQuery.getSingleResult()).intValue();
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPALoggerDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPALoggerDAO.java
index 6e4f414..6e85952 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPALoggerDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPALoggerDAO.java
@@ -18,18 +18,85 @@
*/
package org.apache.syncope.core.persistence.jpa.dao;
+import java.sql.Clob;
+import java.sql.SQLException;
import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import javax.persistence.Query;
import javax.persistence.TypedQuery;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.log.AuditEntry;
+import org.apache.syncope.common.lib.types.AuditElements;
import org.apache.syncope.common.lib.types.LoggerLevel;
import org.apache.syncope.common.lib.types.LoggerType;
import org.apache.syncope.core.persistence.api.dao.LoggerDAO;
+import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
import org.apache.syncope.core.persistence.api.entity.Logger;
import org.apache.syncope.core.persistence.jpa.entity.JPALogger;
-import org.springframework.stereotype.Repository;
+import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
+import org.springframework.transaction.annotation.Transactional;
-@Repository
public class JPALoggerDAO extends AbstractDAO<Logger> implements LoggerDAO {
+ protected static class MessageCriteriaBuilder {
+
+ protected final StringBuilder query = new StringBuilder();
+
+ protected MessageCriteriaBuilder entityKey(final String entityKey) {
+ query.append(' ').append(AUDIT_MESSAGE_COLUMN).
+ append(" LIKE '%key%").append(entityKey).append("%'");
+ return this;
+ }
+
+ public MessageCriteriaBuilder type(final AuditElements.EventCategoryType type) {
+ if (type != null) {
+ query.append(" AND ").append(AUDIT_MESSAGE_COLUMN).
+ append(" LIKE '%\"type\":\"").append(type.name()).append("\"%'");
+ }
+ return this;
+ }
+
+ public MessageCriteriaBuilder category(final String category) {
+ if (StringUtils.isNotBlank(category)) {
+ query.append(" AND ").append(AUDIT_MESSAGE_COLUMN).
+ append(" LIKE '%\"category\":\"").append(category).append("\"%'");
+ }
+ return this;
+ }
+
+ public MessageCriteriaBuilder subcategory(final String subcategory) {
+ if (StringUtils.isNotBlank(subcategory)) {
+ query.append(" AND ").append(AUDIT_MESSAGE_COLUMN).
+ append(" LIKE '%\"subcategory\":\"").append(subcategory).append("\"%'");
+ }
+ return this;
+ }
+
+ public MessageCriteriaBuilder events(final List<String> events) {
+ if (!events.isEmpty()) {
+ query.append(" AND ( ").
+ append(events.stream().
+ map(event -> AUDIT_MESSAGE_COLUMN + " LIKE '%\"event\":\"" + event + "\"%'").
+ collect(Collectors.joining(" OR "))).
+ append(" )");
+ }
+ return this;
+ }
+
+ public MessageCriteriaBuilder result(final AuditElements.Result result) {
+ if (result != null) {
+ query.append(" AND ").append(AUDIT_MESSAGE_COLUMN).
+ append(" LIKE '%\"result\":\"").append(result.name()).append("\"%' ");
+ }
+ return this;
+ }
+
+ public String build() {
+ return query.toString();
+ }
+ }
+
@Override
public Logger find(final String key) {
return entityManager().find(JPALogger.class, key);
@@ -66,4 +133,74 @@ public class JPALoggerDAO extends AbstractDAO<Logger> implements LoggerDAO {
delete(logger);
}
+
+ protected MessageCriteriaBuilder messageCriteriaBuilder(final String entityKey) {
+ return new MessageCriteriaBuilder().entityKey(entityKey);
+ }
+
+ @Override
+ public int countAuditEntries(final String entityKey) {
+ String queryString = "SELECT COUNT(0) FROM " + AUDIT_TABLE
+ + " WHERE " + messageCriteriaBuilder(entityKey).build();
+ Query countQuery = entityManager().createNativeQuery(queryString);
+
+ return ((Number) countQuery.getSingleResult()).intValue();
+ }
+
+ protected String select() {
+ return AUDIT_MESSAGE_COLUMN;
+ }
+
+ @Transactional(readOnly = true)
+ @Override
+ public List<AuditEntry> findAuditEntries(
+ final String entityKey,
+ final int page,
+ final int itemsPerPage,
+ final AuditElements.EventCategoryType type,
+ final String category,
+ final String subcategory,
+ final List<String> events,
+ final AuditElements.Result result,
+ final List<OrderByClause> orderByClauses) {
+
+ String queryString = "SELECT " + select()
+ + " FROM " + AUDIT_TABLE
+ + " WHERE " + messageCriteriaBuilder(entityKey).
+ type(type).
+ category(category).
+ subcategory(subcategory).
+ result(result).
+ events(events).
+ build();
+ if (!orderByClauses.isEmpty()) {
+ queryString += " ORDER BY " + orderByClauses.stream().
+ map(orderBy -> orderBy.getField() + ' ' + orderBy.getDirection().name()).
+ collect(Collectors.joining(","));
+ }
+
+ Query query = entityManager().createNativeQuery(queryString);
+ query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
+ if (itemsPerPage >= 0) {
+ query.setMaxResults(itemsPerPage);
+ }
+
+ @SuppressWarnings("unchecked")
+ List<Object> entries = query.getResultList();
+ return entries.stream().map(row -> {
+ String value;
+ if (row instanceof Clob) {
+ Clob clob = (Clob) row;
+ try {
+ value = clob.getSubString(1, (int) clob.length());
+ } catch (SQLException e) {
+ LOG.error("Unexpected error reading Audit Entry for entity key {}", entityKey, e);
+ return null;
+ }
+ } else {
+ value = row.toString();
+ }
+ return POJOHelper.deserialize(value, AuditEntry.class);
+ }).filter(Objects::nonNull).collect(Collectors.toList());
+ }
}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java
index 93e281e..641503c 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java
@@ -18,6 +18,8 @@
*/
package org.apache.syncope.core.persistence.jpa.entity;
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
+import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import java.util.Objects;
import org.apache.syncope.common.lib.types.ImplementationType;
import org.apache.syncope.core.persistence.api.entity.Entity;
@@ -25,6 +27,7 @@ import org.apache.syncope.core.persistence.api.entity.Implementation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "key")
public abstract class AbstractEntity implements Entity {
private static final long serialVersionUID = -9017214159540857901L;
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
index 8feb82d..606f561 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
@@ -246,5 +246,4 @@ public class JPAConnInstance extends AbstractGeneratedKeyEntity implements ConnI
checkType(poolConf, JPAConnPoolConf.class);
this.poolConf = (JPAConnPoolConf) poolConf;
}
-
}
diff --git a/core/persistence-jpa/src/main/resources/persistence.properties b/core/persistence-jpa/src/main/resources/persistence.properties
index 5804764..7fb8738 100644
--- a/core/persistence-jpa/src/main/resources/persistence.properties
+++ b/core/persistence-jpa/src/main/resources/persistence.properties
@@ -25,5 +25,5 @@ user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAUserDAO
group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAGroupDAO
anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAAnyObjectDAO
conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAConfDAO
-audit.dao=org.apache.syncope.core.persistence.jpa.dao.JPAAuditDAO
+logger.dao=org.apache.syncope.core.persistence.jpa.dao.JPALoggerDAO
openjpa.RemoteCommitProvider=sjvm
diff --git a/core/persistence-jpa/src/main/resources/persistenceContext.xml b/core/persistence-jpa/src/main/resources/persistenceContext.xml
index 4af0010..a36eb36 100644
--- a/core/persistence-jpa/src/main/resources/persistenceContext.xml
+++ b/core/persistence-jpa/src/main/resources/persistenceContext.xml
@@ -40,7 +40,7 @@ under the License.
<bean class="${group.dao:org.apache.syncope.core.persistence.jpa.dao.JPAGroupDAO}"/>
<bean class="${anyObject.dao:org.apache.syncope.core.persistence.jpa.dao.JPAAnyObjectDAO}"/>
<bean class="${conf.dao:org.apache.syncope.core.persistence.jpa.dao.JPAConfDAO}"/>
- <bean class="${audit.dao:org.apache.syncope.core.persistence.jpa.dao.JPAAuditDAO}"/>
+ <bean class="${logger.dao:org.apache.syncope.core.persistence.jpa.dao.JPALoggerDAO}"/>
<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AuditEntryImpl.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AuditEntryImpl.java
deleted file mode 100644
index f66e2b1..0000000
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AuditEntryImpl.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * 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.provisioning.api;
-
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.SerializationUtils;
-import org.apache.syncope.common.lib.patch.UserPatch;
-import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.AuditLoggerName;
-import org.apache.syncope.core.persistence.api.entity.AuditEntry;
-
-@SuppressWarnings({ "squid:S1450", "squid:S1948" })
-public class AuditEntryImpl implements AuditEntry {
-
- private static final long serialVersionUID = -2299082316063743582L;
-
- private static final String MASKED_VALUE = "<MASKED>";
-
- private final String who;
-
- private final AuditLoggerName logger;
-
- private final Object before;
-
- private final Object output;
-
- private final Object[] input;
-
- private String throwable;
-
- private Date date;
-
- @JsonCreator
- public AuditEntryImpl(
- @JsonProperty("who") final String who,
- @JsonProperty("logger") final AuditLoggerName logger,
- @JsonProperty("before") final Object before,
- @JsonProperty("output") final Object output,
- @JsonProperty("input") final Object[] input) {
-
- super();
-
- this.who = who;
- this.logger = logger;
- this.before = maskSensitive(before);
- this.output = maskSensitive(output);
- this.input = ArrayUtils.clone(input);
- if (this.input != null) {
- for (int i = 0; i < this.input.length; i++) {
- this.input[i] = maskSensitive(this.input[i]);
- }
- }
- }
-
- private static Object maskSensitive(final Object object) {
- Object masked;
-
- if (object instanceof UserTO) {
- masked = SerializationUtils.clone((UserTO) object);
- if (((UserTO) masked).getPassword() != null) {
- ((UserTO) masked).setPassword(MASKED_VALUE);
- }
- if (((UserTO) masked).getSecurityAnswer() != null) {
- ((UserTO) masked).setSecurityAnswer(MASKED_VALUE);
- }
- } else if (object instanceof UserPatch && ((UserPatch) object).getPassword() != null) {
- masked = SerializationUtils.clone((UserPatch) object);
- ((UserPatch) masked).getPassword().setValue(MASKED_VALUE);
- } else {
- masked = object;
- }
-
- return masked;
- }
-
- @Override
- public String getWho() {
- return who;
- }
-
- @Override
- public AuditLoggerName getLogger() {
- return logger;
- }
-
- @Override
- public Object getBefore() {
- return before;
- }
-
- @Override
- public Object getOutput() {
- return output;
- }
-
- @Override
- public Object[] getInput() {
- return input;
- }
-
- @Override
- public String getThrowable() {
- return throwable;
- }
-
- public void setThrowable(final String throwable) {
- this.throwable = throwable;
- }
-
- @Override
- public Date getDate() {
- return date;
- }
-
- public void setDate(final Date date) {
- this.date = date;
- }
-
- public static Builder builder() {
- return new Builder();
- }
-
- public static final class Builder {
-
- private String who;
-
- private AuditLoggerName logger;
-
- private Object before;
-
- private Object output;
-
- private Object[] input;
-
- private String throwable;
-
- private Date date;
-
- private String key;
-
- private Builder() {
- }
-
- public Builder date(final Date date) {
- this.date = date;
- return this;
- }
-
- public Builder throwable(final String throwable) {
- this.throwable = throwable;
- return this;
- }
-
- public Builder key(final String key) {
- this.key = key;
- return this;
- }
-
- public Builder who(final String who) {
- this.who = who;
- return this;
- }
-
- public Builder logger(final AuditLoggerName logger) {
- this.logger = logger;
- return this;
- }
-
- public Builder before(final Object before) {
- this.before = before;
- return this;
- }
-
- public Builder output(final Object output) {
- this.output = output;
- return this;
- }
-
- public Builder input(final Object[] input) {
- this.input = input;
- return this;
- }
-
- public AuditEntryImpl build() {
- AuditEntryImpl entry = new AuditEntryImpl(who, logger, before, output, input);
- entry.setDate(date);
- entry.setThrowable(throwable);
- return entry;
- }
- }
-}
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/AuditDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/LoggerDataBinder.java
similarity index 73%
rename from core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/AuditDataBinder.java
rename to core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/LoggerDataBinder.java
index 082f71f..1b491ce 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/AuditDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/LoggerDataBinder.java
@@ -18,10 +18,13 @@
*/
package org.apache.syncope.core.provisioning.api.data;
-import org.apache.syncope.common.lib.to.AuditEntryTO;
-import org.apache.syncope.core.persistence.api.entity.AuditEntry;
+import org.apache.syncope.common.lib.log.LoggerTO;
+import org.apache.syncope.common.lib.types.AuditLoggerName;
+import org.apache.syncope.core.persistence.api.entity.Logger;
-public interface AuditDataBinder {
+public interface LoggerDataBinder {
- AuditEntryTO getAuditTO(String key, AuditEntry auditEntry);
+ LoggerTO getLoggerTO(Logger logger);
+
+ LoggerTO getLoggerTO(AuditLoggerName auditLoggerName);
}
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/serialization/POJOHelper.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/serialization/POJOHelper.java
index c7b8faa..af99906 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/serialization/POJOHelper.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/serialization/POJOHelper.java
@@ -64,18 +64,6 @@ public final class POJOHelper {
return result;
}
- public static String serializeWithDefaultPrettyPrinter(final Object object) {
- String result = null;
-
- try {
- result = MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(object);
- } catch (Exception e) {
- LOG.error("During serialization", e);
- }
-
- return result;
- }
-
public static <T extends Object> T deserialize(final String serialized, final Class<T> reference) {
T result = null;
diff --git a/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/AuditEntryImplTest.java b/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/AuditEntryImplTest.java
deleted file mode 100644
index 81da84d..0000000
--- a/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/AuditEntryImplTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * 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.provisioning.api;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNotEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.util.Date;
-import java.util.UUID;
-import org.apache.commons.lang3.SerializationUtils;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.syncope.common.lib.patch.UserPatch;
-import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.AuditLoggerName;
-import org.junit.jupiter.api.Test;
-import org.mockito.Mock;
-import org.springframework.test.util.ReflectionTestUtils;
-
-public class AuditEntryImplTest extends AbstractTest {
-
- @Mock
- private AuditLoggerName logger;
-
- private final String who = "testUser";
-
- private final Object before = "before";
-
- private final String output = "output";
-
- private final String[] input = { "test1", "test2" };
-
- private final String throwable = "throwable";
-
- private final String key = UUID.randomUUID().toString();
-
- private final Date date = new Date();
-
- @Test
- public void AuditEntryImpl() {
- AuditEntryImpl auditEntryImpl = new AuditEntryImpl(who, logger, before, output, input);
- AuditEntryImpl auditEntryImpl2 = AuditEntryImpl.builder().
- who(who).
- before(before).
- logger(logger).
- output(output).
- input(null).
- date(date).
- key(key).
- throwable(throwable).
- build();
-
- assertEquals(auditEntryImpl2.getWho(), auditEntryImpl.getWho());
- assertEquals(auditEntryImpl2.getLogger(), auditEntryImpl.getLogger());
- assertNotEquals(auditEntryImpl2.getInput(), auditEntryImpl.getInput().length);
- assertEquals(auditEntryImpl2.getDate(), auditEntryImpl2.getDate());
- assertEquals(auditEntryImpl2.getThrowable(), auditEntryImpl2.getThrowable());
- }
-
- @Test
- public void AuditEntryImplWithUserTO(@Mock UserTO userTO) {
- AuditEntryImpl auditEntryImpl = new AuditEntryImpl(who, logger, before, userTO, input);
- assertTrue(EqualsBuilder.reflectionEquals(SerializationUtils.clone(userTO), auditEntryImpl.getOutput()));
-
- ReflectionTestUtils.setField(userTO, "password", "testP4ssw0rd!");
- ReflectionTestUtils.setField(userTO, "securityAnswer", "42");
- AuditEntryImpl auditEntryImpl2 = new AuditEntryImpl(who, logger, before, userTO, input);
- assertFalse(EqualsBuilder.reflectionEquals(SerializationUtils.clone(userTO), auditEntryImpl2.getOutput()));
- }
-
- @Test
- public void AuditEntryImplWithUserPatch(@Mock UserPatch userPatch) {
- AuditEntryImpl auditEntryImpl = new AuditEntryImpl(who, logger, userPatch, output, input);
- assertTrue(EqualsBuilder.reflectionEquals(SerializationUtils.clone(userPatch), auditEntryImpl.getBefore()));
- }
-}
diff --git a/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/serialization/POJOHelperTest.java b/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/serialization/POJOHelperTest.java
index d94a87e..e3d83dd 100644
--- a/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/serialization/POJOHelperTest.java
+++ b/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/serialization/POJOHelperTest.java
@@ -36,13 +36,6 @@ public class POJOHelperTest extends AbstractTest {
}
@Test
- public void serializeWithDefaultPrettyPrinter() {
- Object object = 9001;
-
- assertEquals(String.valueOf(object), POJOHelper.serializeWithDefaultPrettyPrinter(object));
- }
-
- @Test
public void deserializeWithClassReference() {
String serialized = "false";
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
index 374c717..ff27cbf 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
@@ -18,8 +18,13 @@
*/
package org.apache.syncope.core.provisioning.java;
-import org.apache.syncope.core.persistence.api.entity.AuditEntry;
-import org.apache.syncope.core.provisioning.api.AuditEntryImpl;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.stream.Collectors;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.syncope.common.lib.log.AuditEntry;
+import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.UserTO;
import org.apache.syncope.core.provisioning.api.AuditManager;
import org.apache.syncope.common.lib.types.AuditElements;
import org.apache.syncope.common.lib.types.AuditElements.Result;
@@ -28,6 +33,7 @@ import org.apache.syncope.common.lib.types.LoggerLevel;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
import org.apache.syncope.core.persistence.api.dao.LoggerDAO;
import org.apache.syncope.core.provisioning.api.event.AfterHandlingEvent;
+import org.apache.syncope.core.provisioning.api.utils.ExceptionUtils2;
import org.apache.syncope.core.spring.security.AuthContextUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,11 +41,32 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
-import java.util.Date;
-
@Transactional(readOnly = true)
public class DefaultAuditManager implements AuditManager {
+ private static final String MASKED_VALUE = "<MASKED>";
+
+ private static Object maskSensitive(final Object object) {
+ Object masked;
+
+ if (object instanceof UserTO) {
+ masked = SerializationUtils.clone((UserTO) object);
+ if (((UserTO) masked).getPassword() != null) {
+ ((UserTO) masked).setPassword(MASKED_VALUE);
+ }
+ if (((UserTO) masked).getSecurityAnswer() != null) {
+ ((UserTO) masked).setSecurityAnswer(MASKED_VALUE);
+ }
+ } else if (object instanceof UserPatch && ((UserPatch) object).getPassword() != null) {
+ masked = SerializationUtils.clone((UserPatch) object);
+ ((UserPatch) masked).getPassword().setValue(MASKED_VALUE);
+ } else {
+ masked = object;
+ }
+
+ return masked;
+ }
+
@Autowired
private LoggerDAO loggerDAO;
@@ -51,11 +78,11 @@ public class DefaultAuditManager implements AuditManager {
final String subcategory,
final String event) {
- AuditEntry auditEntry = AuditEntryImpl.builder().
- who(who).
- logger(new AuditLoggerName(type, category, subcategory, event, Result.SUCCESS)).
- date(new Date()).
- build();
+ AuditEntry auditEntry = new AuditEntry();
+ auditEntry.setWho(who);
+ auditEntry.setLogger(new AuditLoggerName(type, category, subcategory, event, Result.SUCCESS));
+ auditEntry.setDate(new Date());
+
org.apache.syncope.core.persistence.api.entity.Logger syncopeLogger =
loggerDAO.find(auditEntry.getLogger().toLoggerName());
boolean auditRequested = syncopeLogger != null && syncopeLogger.getLevel() == LoggerLevel.DEBUG;
@@ -64,11 +91,8 @@ public class DefaultAuditManager implements AuditManager {
return true;
}
- auditEntry = AuditEntryImpl.builder()
- .who(who)
- .logger(new AuditLoggerName(type, category, subcategory, event, Result.FAILURE))
- .date(new Date())
- .build();
+ auditEntry.setLogger(new AuditLoggerName(type, category, subcategory, event, Result.FAILURE));
+
syncopeLogger = loggerDAO.find(auditEntry.getLogger().toLoggerName());
auditRequested = syncopeLogger != null && syncopeLogger.getLevel() == LoggerLevel.DEBUG;
@@ -108,14 +132,22 @@ public class DefaultAuditManager implements AuditManager {
throwable = (Throwable) output;
}
- AuditEntry auditEntry = AuditEntryImpl.builder().
- who(who).
- logger(new AuditLoggerName(type, category, subcategory, event, condition)).
- before(before).
- output(throwable == null ? output : throwable.getMessage()).
- input(input).
- date(new Date()).
- build();
+ AuditEntry auditEntry = new AuditEntry();
+ auditEntry.setWho(who);
+ auditEntry.setLogger(new AuditLoggerName(type, category, subcategory, event, condition));
+ auditEntry.setDate(new Date());
+ auditEntry.setBefore(POJOHelper.serialize((maskSensitive(before))));
+ if (throwable == null) {
+ auditEntry.setOutput(POJOHelper.serialize((maskSensitive(output))));
+ } else {
+ auditEntry.setOutput(throwable.getMessage());
+ auditEntry.setThrowable(ExceptionUtils2.getFullStackTrace(throwable));
+ }
+ if (input != null) {
+ auditEntry.getInputs().addAll(Arrays.stream(input).
+ map(DefaultAuditManager::maskSensitive).map(POJOHelper::serialize).
+ collect(Collectors.toList()));
+ }
org.apache.syncope.core.persistence.api.entity.Logger syncopeLogger =
loggerDAO.find(auditEntry.getLogger().toLoggerName());
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AuditDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AuditDataBinderImpl.java
deleted file mode 100644
index 4937503..0000000
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AuditDataBinderImpl.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.provisioning.java.data;
-
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.stream.Collectors;
-import org.apache.syncope.common.lib.to.AuditEntryTO;
-import org.apache.syncope.core.persistence.api.entity.AuditEntry;
-import org.apache.syncope.core.provisioning.api.data.AuditDataBinder;
-import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
-import org.springframework.stereotype.Component;
-
-@Component
-public class AuditDataBinderImpl implements AuditDataBinder {
-
- @Override
- public AuditEntryTO getAuditTO(final String key, final AuditEntry auditEntry) {
- AuditEntryTO auditEntryTO = new AuditEntryTO();
- auditEntryTO.setKey(key);
- auditEntryTO.setWho(auditEntry.getWho());
- auditEntryTO.setDate(auditEntry.getDate());
- auditEntryTO.setThrowable(auditEntry.getThrowable());
- auditEntryTO.setLoggerName(auditEntry.getLogger().toLoggerName());
-
- auditEntryTO.setSubCategory(auditEntry.getLogger().getSubcategory());
- auditEntryTO.setEvent(auditEntry.getLogger().getEvent());
-
- if (auditEntry.getLogger().getResult() != null) {
- auditEntryTO.setResult(auditEntry.getLogger().getResult().name());
- }
-
- if (auditEntry.getBefore() != null) {
- auditEntryTO.setBefore(POJOHelper.serializeWithDefaultPrettyPrinter(auditEntry.getBefore()));
- }
-
- if (auditEntry.getInput() != null) {
- auditEntryTO.getInputs().addAll(Arrays.stream(auditEntry.getInput()).
- filter(Objects::nonNull).
- map(POJOHelper::serializeWithDefaultPrettyPrinter).
- collect(Collectors.toList()));
- }
-
- if (auditEntry.getOutput() != null) {
- auditEntryTO.setOutput(POJOHelper.serializeWithDefaultPrettyPrinter(auditEntry.getOutput()));
- }
-
- return auditEntryTO;
- }
-}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/audit/DefaultAuditAppender.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/LoggerDataBinderImpl.java
similarity index 51%
copy from core/logic/src/main/java/org/apache/syncope/core/logic/audit/DefaultAuditAppender.java
copy to core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/LoggerDataBinderImpl.java
index 0fdd0b5..906c92d 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/audit/DefaultAuditAppender.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/LoggerDataBinderImpl.java
@@ -16,39 +16,31 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.syncope.core.logic.audit;
+package org.apache.syncope.core.provisioning.java.data;
-import java.util.Collections;
-import java.util.Set;
-import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy;
+import org.apache.syncope.common.lib.log.LoggerTO;
import org.apache.syncope.common.lib.types.AuditLoggerName;
-import org.apache.syncope.core.logic.AbstractAuditAppender;
+import org.apache.syncope.common.lib.types.LoggerLevel;
+import org.apache.syncope.core.persistence.api.entity.Logger;
+import org.springframework.stereotype.Component;
+import org.apache.syncope.core.provisioning.api.data.LoggerDataBinder;
-/**
- * Default (abstract) implementation of custom audit appender.
- * It is bound to an empty collection of events, i.e. it does not create any logger.
- * This class shall be extended by non-rewriting appenders; for rewriting, extend
- * {@link DefaultRewriteAuditAppender} instead.
- */
-public abstract class DefaultAuditAppender extends AbstractAuditAppender {
-
- @Override
- public void init() {
- initTargetAppender();
- }
+@Component
+public class LoggerDataBinderImpl implements LoggerDataBinder {
@Override
- public Set<AuditLoggerName> getEvents() {
- return Collections.emptySet();
+ public LoggerTO getLoggerTO(final Logger logger) {
+ LoggerTO loggerTO = new LoggerTO();
+ loggerTO.setKey(logger.getKey());
+ loggerTO.setLevel(logger.getLevel());
+ return loggerTO;
}
@Override
- public void initRewriteAppender() {
+ public LoggerTO getLoggerTO(final AuditLoggerName auditLoggerName) {
+ LoggerTO loggerTO = new LoggerTO();
+ loggerTO.setKey(auditLoggerName.toLoggerName());
+ loggerTO.setLevel(LoggerLevel.DEBUG);
+ return loggerTO;
}
-
- @Override
- public RewritePolicy getRewritePolicy() {
- return null;
- }
-
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java
index d613ffc..fb7a4d3 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java
@@ -23,12 +23,11 @@ import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import javax.sql.DataSource;
import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.log.AuditEntry;
import org.apache.syncope.common.lib.report.AuditReportletConf;
import org.apache.syncope.common.lib.report.ReportletConf;
import org.apache.syncope.core.persistence.api.DomainsHolder;
-import org.apache.syncope.core.persistence.api.dao.AuditDAO;
-import org.apache.syncope.core.persistence.api.entity.AuditEntry;
-import org.apache.syncope.core.provisioning.api.AuditEntryImpl;
+import org.apache.syncope.core.persistence.api.dao.LoggerDAO;
import org.apache.syncope.core.spring.security.AuthContextUtils;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
import org.apache.syncope.core.persistence.api.dao.ReportletConfClass;
@@ -49,17 +48,17 @@ public class AuditReportlet extends AbstractReportlet {
private DataSource datasource;
private void doExtractConf(final ContentHandler handler, final AtomicReference<String> status) throws SAXException {
- status.set("Fetching " + conf.getSize() + " rows from the " + AuditDAO.TABLE + " table");
+ status.set("Fetching " + conf.getSize() + " rows from the " + LoggerDAO.AUDIT_TABLE + " table");
JdbcTemplate jdbcTemplate = new JdbcTemplate(datasource);
jdbcTemplate.setMaxRows(conf.getSize());
List<Map<String, Object>> rows = jdbcTemplate.
- queryForList("SELECT * FROM " + AuditDAO.TABLE + " ORDER BY EVENT_DATE DESC");
+ queryForList("SELECT * FROM " + LoggerDAO.AUDIT_TABLE + " ORDER BY EVENT_DATE DESC");
handler.startElement("", "", "events", null);
AttributesImpl atts = new AttributesImpl();
for (Map<String, Object> row : rows) {
- AuditEntry auditEntry = POJOHelper.deserialize(row.get("MESSAGE").toString(), AuditEntryImpl.class);
+ AuditEntry auditEntry = POJOHelper.deserialize(row.get("MESSAGE").toString(), AuditEntry.class);
atts.clear();
if (StringUtils.isNotBlank(auditEntry.getWho())) {
@@ -94,12 +93,11 @@ public class AuditReportlet extends AbstractReportlet {
handler.endElement("", "", "before");
}
- if (auditEntry.getInput() != null) {
+ if (!auditEntry.getInputs().isEmpty()) {
handler.startElement("", "", "inputs", null);
- for (Object inputObj : auditEntry.getInput()) {
- char[] input = POJOHelper.serialize(inputObj).toCharArray();
+ for (String input : auditEntry.getInputs()) {
handler.startElement("", "", "input", null);
- handler.characters(input, 0, input.length);
+ handler.characters(input.toCharArray(), 0, input.length());
handler.endElement("", "", "input");
}
handler.endElement("", "", "inputs");
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java
index a0d4b09..283e7dd 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java
@@ -155,9 +155,7 @@ public class PriorityPropagationTaskExecutor extends AbstractPropagationTaskExec
} catch (Exception e) {
LOG.error("Unexpected exception", e);
} finally {
- nullPriorityFutures.forEach(future -> {
- future.cancel(true);
- });
+ nullPriorityFutures.forEach(future -> future.cancel(true));
nullPriorityFutures.clear();
nullPriority.clear();
}
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AuditServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AuditServiceImpl.java
deleted file mode 100644
index b646f91..0000000
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AuditServiceImpl.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.rest.cxf.service;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.common.lib.to.AuditEntryTO;
-import org.apache.syncope.common.lib.to.PagedResult;
-import org.apache.syncope.common.rest.api.beans.AuditQuery;
-import org.apache.syncope.common.rest.api.service.AuditService;
-import org.apache.syncope.core.logic.AuditLogic;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-public class AuditServiceImpl extends AbstractServiceImpl implements AuditService {
-
- @Autowired
- private AuditLogic logic;
-
- @Override
- public PagedResult<AuditEntryTO> search(final AuditQuery auditQuery) {
- Pair<Integer, List<AuditEntryTO>> result = logic.search(
- auditQuery.getEntityKey(),
- auditQuery.getPage(),
- auditQuery.getSize(),
- auditQuery.getType(),
- auditQuery.getCategory(),
- auditQuery.getSubcategory(),
- auditQuery.getEvents(),
- auditQuery.getResult(),
- getOrderByClauses(auditQuery.getOrderBy()));
- return buildPagedResult(result.getRight(), auditQuery.getPage(), auditQuery.getSize(), result.getLeft());
- }
-}
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
index a143403..b8ab5b4 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
@@ -21,13 +21,17 @@ package org.apache.syncope.core.rest.cxf.service;
import java.text.ParseException;
import java.util.List;
import javax.ws.rs.BadRequestException;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.common.lib.log.AuditEntry;
import org.apache.syncope.common.lib.log.EventCategory;
import org.apache.syncope.common.lib.log.LogAppender;
import org.apache.syncope.common.lib.log.LogStatement;
import org.apache.syncope.common.lib.log.LoggerTO;
+import org.apache.syncope.common.lib.to.PagedResult;
import org.apache.syncope.common.lib.types.AuditLoggerName;
import org.apache.syncope.common.lib.types.LoggerType;
import org.apache.syncope.common.rest.api.LoggerWrapper;
+import org.apache.syncope.common.rest.api.beans.AuditQuery;
import org.apache.syncope.common.rest.api.service.LoggerService;
import org.apache.syncope.core.logic.LoggerLogic;
import org.springframework.beans.factory.annotation.Autowired;
@@ -58,11 +62,11 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
case AUDIT:
try {
- logic.disableAudit(AuditLoggerName.fromLoggerName(name));
- } catch (IllegalArgumentException | ParseException e) {
- throw new BadRequestException(e);
- }
- break;
+ logic.disableAudit(AuditLoggerName.fromLoggerName(name));
+ } catch (IllegalArgumentException | ParseException e) {
+ throw new BadRequestException(e);
+ }
+ break;
default:
throw new BadRequestException();
@@ -107,11 +111,11 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
case AUDIT:
try {
- logic.enableAudit(AuditLoggerName.fromLoggerName(logger.getKey()));
- } catch (Exception e) {
- throw new BadRequestException(e);
- }
- break;
+ logic.enableAudit(AuditLoggerName.fromLoggerName(logger.getKey()));
+ } catch (Exception e) {
+ throw new BadRequestException(e);
+ }
+ break;
default:
throw new BadRequestException();
@@ -122,4 +126,20 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
public List<EventCategory> events() {
return logic.listAuditEvents();
}
+
+ @Override
+ public PagedResult<AuditEntry> search(final AuditQuery auditQuery) {
+ Pair<Integer, List<AuditEntry>> result = logic.search(
+ auditQuery.getEntityKey(),
+ auditQuery.getPage(),
+ auditQuery.getSize(),
+ auditQuery.getType(),
+ auditQuery.getCategory(),
+ auditQuery.getSubcategory(),
+ auditQuery.getEvents(),
+ auditQuery.getResult(),
+ getOrderByClauses(auditQuery.getOrderBy()));
+
+ return buildPagedResult(result.getRight(), auditQuery.getPage(), auditQuery.getSize(), result.getLeft());
+ }
}
diff --git a/docker/core/src/main/resources/persistence.properties.all b/docker/core/src/main/resources/persistence.properties.all
index 6a5221a..a489b3f 100644
--- a/docker/core/src/main/resources/persistence.properties.all
+++ b/docker/core/src/main/resources/persistence.properties.all
@@ -25,5 +25,5 @@ user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAUserDAO
group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAGroupDAO
anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAAnyObjectDAO
conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAConfDAO
-audit.dao=org.apache.syncope.core.persistence.jpa.dao.JPAAuditDAO
+logger.dao=org.apache.syncope.core.persistence.jpa.dao.JPALoggerDAO
openjpa.RemoteCommitProvider=${OPENJPA_REMOTE_COMMIT}
diff --git a/docker/core/src/main/resources/persistence.properties.myjson b/docker/core/src/main/resources/persistence.properties.myjson
index dc034b6..20b19a8 100644
--- a/docker/core/src/main/resources/persistence.properties.myjson
+++ b/docker/core/src/main/resources/persistence.properties.myjson
@@ -25,5 +25,5 @@ user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONUserDAO
group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONGroupDAO
anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONAnyObjectDAO
conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONConfDAO
-audit.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONAuditDAO
+logger.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONLoggerDAO
openjpa.RemoteCommitProvider=sjvm
diff --git a/docker/core/src/main/resources/persistence.properties.pgjsonb b/docker/core/src/main/resources/persistence.properties.pgjsonb
index 01af076..8807390 100644
--- a/docker/core/src/main/resources/persistence.properties.pgjsonb
+++ b/docker/core/src/main/resources/persistence.properties.pgjsonb
@@ -25,5 +25,5 @@ user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONUserDAO
group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONGroupDAO
anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONAnyObjectDAO
conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONConfDAO
-audit.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONAuditDAO
+logger.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONLoggerDAO
openjpa.RemoteCommitProvider=${OPENJPA_REMOTE_COMMIT}
diff --git a/ext/elasticsearch/persistence-jpa/src/main/resources/persistence.properties b/ext/elasticsearch/persistence-jpa/src/main/resources/persistence.properties
index 0cebeef..a451701 100644
--- a/ext/elasticsearch/persistence-jpa/src/main/resources/persistence.properties
+++ b/ext/elasticsearch/persistence-jpa/src/main/resources/persistence.properties
@@ -25,5 +25,5 @@ user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAUserDAO
group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAGroupDAO
anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAAnyObjectDAO
conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAConfDAO
-audit.dao=org.apache.syncope.core.persistence.jpa.dao.JPAAuditDAO
+logger.dao=org.apache.syncope.core.persistence.jpa.dao.JPALoggerDAO
openjpa.RemoteCommitProvider=sjvm
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SyslogRewriteAuditAppender.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SyslogRewriteAuditAppender.java
index 0f9fa20..6398777 100644
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SyslogRewriteAuditAppender.java
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SyslogRewriteAuditAppender.java
@@ -35,46 +35,41 @@ public class SyslogRewriteAuditAppender extends DefaultRewriteAuditAppender {
@Override
public Set<AuditLoggerName> getEvents() {
Set<AuditLoggerName> events = new HashSet<>();
- events.add(
- new AuditLoggerName(
- AuditElements.EventCategoryType.LOGIC,
- ResourceLogic.class.getSimpleName(),
- null,
- "update",
- AuditElements.Result.SUCCESS));
- events.add(
- new AuditLoggerName(
- AuditElements.EventCategoryType.LOGIC,
- ConnectorLogic.class.getSimpleName(),
- null,
- "update",
- AuditElements.Result.SUCCESS));
- events.add(
- new AuditLoggerName(
- AuditElements.EventCategoryType.LOGIC,
- ResourceLogic.class.getSimpleName(),
- null,
- "delete",
- AuditElements.Result.SUCCESS));
+ events.add(new AuditLoggerName(
+ AuditElements.EventCategoryType.LOGIC,
+ ResourceLogic.class.getSimpleName(),
+ null,
+ "update",
+ AuditElements.Result.SUCCESS));
+ events.add(new AuditLoggerName(
+ AuditElements.EventCategoryType.LOGIC,
+ ConnectorLogic.class.getSimpleName(),
+ null,
+ "update",
+ AuditElements.Result.SUCCESS));
+ events.add(new AuditLoggerName(
+ AuditElements.EventCategoryType.LOGIC,
+ ResourceLogic.class.getSimpleName(),
+ null,
+ "delete",
+ AuditElements.Result.SUCCESS));
return events;
}
@Override
- public void initTargetAppender() {
+ protected void initTargetAppender() {
targetAppender = SyslogAppender.newSyslogAppenderBuilder().
setName(getTargetAppenderName()).
withHost("localhost").
withPort(514).
withProtocol(Protocol.UDP).
- setLayout(PatternLayout.newBuilder().
- withPattern("%d{ISO8601} %-5level %logger - %msg%n").
- build()).
+ setLayout(PatternLayout.newBuilder().withPattern("%d{ISO8601} %-5level %logger - %msg%n").build()).
setFacility(Facility.LOCAL1).
build();
}
@Override
public String getTargetAppenderName() {
- return "audit_for_" + domainName + "_syslog";
+ return "audit_for_" + domain + "_syslog";
}
}
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileAuditAppender.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileAuditAppender.java
index cc9cd3e..ca508f7 100644
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileAuditAppender.java
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileAuditAppender.java
@@ -38,25 +38,23 @@ public class TestFileAuditAppender extends DefaultAuditAppender {
@Override
public Set<AuditLoggerName> getEvents() {
Set<AuditLoggerName> events = new HashSet<>();
- events.add(
- new AuditLoggerName(
- AuditElements.EventCategoryType.LOGIC,
- ResourceLogic.class.getSimpleName(),
- null,
- "create",
- AuditElements.Result.SUCCESS));
- events.add(
- new AuditLoggerName(
- AuditElements.EventCategoryType.LOGIC,
- ConnectorLogic.class.getSimpleName(),
- null,
- "update",
- AuditElements.Result.SUCCESS));
+ events.add(new AuditLoggerName(
+ AuditElements.EventCategoryType.LOGIC,
+ ResourceLogic.class.getSimpleName(),
+ null,
+ "create",
+ AuditElements.Result.SUCCESS));
+ events.add(new AuditLoggerName(
+ AuditElements.EventCategoryType.LOGIC,
+ ConnectorLogic.class.getSimpleName(),
+ null,
+ "update",
+ AuditElements.Result.SUCCESS));
return events;
}
@Override
- public void initTargetAppender() {
+ protected void initTargetAppender() {
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
// get log file path from existing file appender
RollingRandomAccessFileAppender mainFile =
@@ -79,6 +77,6 @@ public class TestFileAuditAppender extends DefaultAuditAppender {
@Override
public String getTargetAppenderName() {
- return "audit_for_" + domainName + "_norewrite_file";
+ return "audit_for_" + domain + "_norewrite_file";
}
}
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileRewriteAuditAppender.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileRewriteAuditAppender.java
index 8ce0d99..9741a29 100644
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileRewriteAuditAppender.java
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileRewriteAuditAppender.java
@@ -18,7 +18,7 @@
*/
package org.apache.syncope.fit.core.reference;
-import java.util.HashSet;
+import java.util.Collections;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
@@ -36,19 +36,16 @@ public class TestFileRewriteAuditAppender extends DefaultRewriteAuditAppender {
@Override
public Set<AuditLoggerName> getEvents() {
- Set<AuditLoggerName> events = new HashSet<>();
- events.add(
- new AuditLoggerName(
- AuditElements.EventCategoryType.LOGIC,
- ResourceLogic.class.getSimpleName(),
- null,
- "update",
- AuditElements.Result.SUCCESS));
- return events;
+ return Collections.singleton(new AuditLoggerName(
+ AuditElements.EventCategoryType.LOGIC,
+ ResourceLogic.class.getSimpleName(),
+ null,
+ "update",
+ AuditElements.Result.SUCCESS));
}
@Override
- public void initTargetAppender() {
+ protected void initTargetAppender() {
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
// get log file path from existing file appender
@@ -68,11 +65,11 @@ public class TestFileRewriteAuditAppender extends DefaultRewriteAuditAppender {
@Override
public String getTargetAppenderName() {
- return "audit_for_" + domainName + "_file";
+ return "audit_for_" + domain + "_file";
}
@Override
- public RewritePolicy getRewritePolicy() {
+ protected RewritePolicy getRewritePolicy() {
return TestRewritePolicy.createPolicy();
}
}
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestRewritePolicy.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestRewritePolicy.java
index 641f203..2cb724b 100644
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestRewritePolicy.java
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestRewritePolicy.java
@@ -25,14 +25,10 @@ import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.message.SimpleMessage;
-import org.apache.logging.log4j.status.StatusLogger;
-@Plugin(name = "TestRewritePolicy", category = Core.CATEGORY_NAME, elementType = "rewritePolicy",
- printObject = true)
+@Plugin(name = "TestRewritePolicy", category = Core.CATEGORY_NAME, elementType = "rewritePolicy", printObject = true)
public class TestRewritePolicy implements RewritePolicy {
- protected static final StatusLogger LOGGER = StatusLogger.getLogger();
-
@Override
public LogEvent rewrite(final LogEvent event) {
return new Log4jLogEvent.Builder(event).setMessage(new SimpleMessage("This is a static test message")).build();
@@ -42,5 +38,4 @@ public class TestRewritePolicy implements RewritePolicy {
public static TestRewritePolicy createPolicy() {
return new TestRewritePolicy();
}
-
}
diff --git a/fit/core-reference/src/main/resources/elasticsearch/persistence.properties b/fit/core-reference/src/main/resources/elasticsearch/persistence.properties
index 0cebeef..a451701 100644
--- a/fit/core-reference/src/main/resources/elasticsearch/persistence.properties
+++ b/fit/core-reference/src/main/resources/elasticsearch/persistence.properties
@@ -25,5 +25,5 @@ user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAUserDAO
group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAGroupDAO
anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAAnyObjectDAO
conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAConfDAO
-audit.dao=org.apache.syncope.core.persistence.jpa.dao.JPAAuditDAO
+logger.dao=org.apache.syncope.core.persistence.jpa.dao.JPALoggerDAO
openjpa.RemoteCommitProvider=sjvm
diff --git a/fit/core-reference/src/main/resources/logic.properties b/fit/core-reference/src/main/resources/logic.properties
index 802e7853..5e8f1ba 100644
--- a/fit/core-reference/src/main/resources/logic.properties
+++ b/fit/core-reference/src/main/resources/logic.properties
@@ -16,3 +16,4 @@
# under the License.
logicInvocationHandler=org.apache.syncope.core.logic.LogicInvocationHandler
classPathScanImplementationLookup=org.apache.syncope.fit.core.reference.ITImplementationLookup
+enable.jdbcAuditAppender=true
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
index 5118a96..35bfb76 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
@@ -77,7 +77,6 @@ import org.apache.syncope.common.rest.api.service.AnyObjectService;
import org.apache.syncope.common.rest.api.service.AnyTypeClassService;
import org.apache.syncope.common.rest.api.service.AnyTypeService;
import org.apache.syncope.common.rest.api.service.ApplicationService;
-import org.apache.syncope.common.rest.api.service.AuditService;
import org.apache.syncope.common.rest.api.service.CamelRouteService;
import org.apache.syncope.common.rest.api.service.ConfigurationService;
import org.apache.syncope.common.rest.api.service.ConnectorService;
@@ -278,8 +277,6 @@ public abstract class AbstractITCase {
protected static SCIMConfService scimConfService;
- protected static AuditService auditService;
-
@BeforeAll
public static void securitySetup() {
try (InputStream propStream = Encryptor.class.getResourceAsStream("/security.properties")) {
@@ -350,7 +347,6 @@ public abstract class AbstractITCase {
oidcClientService = adminClient.getService(OIDCClientService.class);
oidcProviderService = adminClient.getService(OIDCProviderService.class);
scimConfService = adminClient.getService(SCIMConfService.class);
- auditService = adminClient.getService(AuditService.class);
}
protected static String getUUIDString() {
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
index 4c1927a..8f4d881 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
@@ -32,8 +32,8 @@ import java.util.Set;
import org.apache.commons.lang3.SerializationUtils;
import org.apache.syncope.client.lib.SyncopeClient;
import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.log.AuditEntry;
import org.apache.syncope.common.lib.to.AnyObjectTO;
-import org.apache.syncope.common.lib.to.AuditEntryTO;
import org.apache.syncope.common.lib.to.ConnInstanceTO;
import org.apache.syncope.common.lib.to.GroupTO;
import org.apache.syncope.common.lib.to.PagedResult;
@@ -48,8 +48,8 @@ import org.junit.jupiter.api.Test;
public class AuditITCase extends AbstractITCase {
- private static AuditEntryTO query(final AuditQuery query, final int maxWaitSeconds, final boolean failIfEmpty) {
- List<AuditEntryTO> results = query(query, maxWaitSeconds);
+ private static AuditEntry query(final AuditQuery query, final int maxWaitSeconds, final boolean failIfEmpty) {
+ List<AuditEntry> results = query(query, maxWaitSeconds);
if (results.isEmpty()) {
if (failIfEmpty) {
fail("Timeout when executing query for key " + query.getEntityKey());
@@ -59,15 +59,15 @@ public class AuditITCase extends AbstractITCase {
return results.get(0);
}
- private static List<AuditEntryTO> query(final AuditQuery query, final int maxWaitSeconds) {
+ private static List<AuditEntry> query(final AuditQuery query, final int maxWaitSeconds) {
int i = 0;
- List<AuditEntryTO> results = Collections.emptyList();
+ List<AuditEntry> results = Collections.emptyList();
do {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
- results = auditService.search(query).getResult();
+ results = loggerService.search(query).getResult();
i++;
} while (results.isEmpty() && i < maxWaitSeconds);
return results;
@@ -79,7 +79,7 @@ public class AuditITCase extends AbstractITCase {
assertNotNull(userTO.getKey());
AuditQuery query = new AuditQuery.Builder(userTO.getKey()).build();
- List<AuditEntryTO> entries = query(query, MAX_WAIT_SECONDS);
+ List<AuditEntry> entries = query(query, MAX_WAIT_SECONDS);
assertEquals(1, entries.size());
PagedResult<UserTO> usersTOs = userService.search(
@@ -101,8 +101,8 @@ public class AuditITCase extends AbstractITCase {
AuditQuery query = new AuditQuery.Builder(userTO.getKey()).orderBy("event_date desc").
page(1).size(1).build();
- AuditEntryTO entry = query(query, MAX_WAIT_SECONDS, true);
- assertEquals(userTO.getKey(), entry.getKey());
+ AuditEntry entry = query(query, MAX_WAIT_SECONDS, true);
+ assertNotNull(entry);
userService.delete(userTO.getKey());
}
@@ -120,8 +120,8 @@ public class AuditITCase extends AbstractITCase {
event("create").
result(AuditElements.Result.SUCCESS).
build();
- AuditEntryTO entry = query(query, MAX_WAIT_SECONDS, true);
- assertEquals(userTO.getKey(), entry.getKey());
+ AuditEntry entry = query(query, MAX_WAIT_SECONDS, true);
+ assertNotNull(entry);
userService.delete(userTO.getKey());
}
@@ -132,8 +132,8 @@ public class AuditITCase extends AbstractITCase {
AuditQuery query = new AuditQuery.Builder(groupTO.getKey()).orderBy("event_date desc").
page(1).size(1).build();
- AuditEntryTO entry = query(query, MAX_WAIT_SECONDS, true);
- assertEquals(groupTO.getKey(), entry.getKey());
+ AuditEntry entry = query(query, MAX_WAIT_SECONDS, true);
+ assertNotNull(entry);
groupService.delete(groupTO.getKey());
}
@@ -143,7 +143,7 @@ public class AuditITCase extends AbstractITCase {
assertNotNull(groupTO.getKey());
AuditQuery query = new AuditQuery.Builder(groupTO.getKey()).build();
- List<AuditEntryTO> entries = query(query, MAX_WAIT_SECONDS);
+ List<AuditEntry> entries = query(query, MAX_WAIT_SECONDS);
assertEquals(1, entries.size());
PagedResult<GroupTO> groups = groupService.search(
@@ -164,8 +164,8 @@ public class AuditITCase extends AbstractITCase {
assertNotNull(anyObjectTO.getKey());
AuditQuery query = new AuditQuery.Builder(anyObjectTO.getKey()).orderBy("event_date desc").
page(1).size(1).build();
- AuditEntryTO entry = query(query, MAX_WAIT_SECONDS, true);
- assertEquals(anyObjectTO.getKey(), entry.getKey());
+ AuditEntry entry = query(query, MAX_WAIT_SECONDS, true);
+ assertNotNull(entry);
anyObjectService.delete(anyObjectTO.getKey());
}
@@ -176,7 +176,7 @@ public class AuditITCase extends AbstractITCase {
assertNotNull(anyObjectTO);
AuditQuery query = new AuditQuery.Builder(anyObjectTO.getKey()).build();
- List<AuditEntryTO> entries = query(query, MAX_WAIT_SECONDS);
+ List<AuditEntry> entries = query(query, MAX_WAIT_SECONDS);
assertEquals(1, entries.size());
PagedResult<AnyObjectTO> anyObjects = anyObjectService.search(
@@ -201,7 +201,7 @@ public class AuditITCase extends AbstractITCase {
event("update").
result(AuditElements.Result.SUCCESS).
build();
- List<AuditEntryTO> entries = query(query, 0);
+ List<AuditEntry> entries = query(query, 0);
int pre = entries.size();
ConnInstanceTO ldapConn = connectorService.read(connectorKey, null);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
index aa8a21e..80188cb 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
@@ -64,6 +64,7 @@ import org.apache.syncope.core.logic.ResourceLogic;
import org.apache.syncope.core.logic.GroupLogic;
import org.apache.syncope.core.logic.UserLogic;
import org.apache.syncope.fit.AbstractITCase;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class LoggerITCase extends AbstractITCase {
@@ -98,15 +99,12 @@ public class LoggerITCase extends AbstractITCase {
List<LoggerTO> loggers = loggerService.list(LoggerType.LOG);
assertNotNull(loggers);
assertFalse(loggers.isEmpty());
- loggers.forEach(logger -> {
- assertNotNull(logger);
- });
+ loggers.forEach(Assertions::assertNotNull);
}
@Test
public void listAudits() throws ParseException {
List<LoggerTO> audits = loggerService.list(LoggerType.AUDIT);
-
assertNotNull(audits);
assertFalse(audits.isEmpty());
for (LoggerTO audit : audits) {
diff --git a/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/dbms.adoc b/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/dbms.adoc
index 11c8bb5..cfb20eb 100644
--- a/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/dbms.adoc
+++ b/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/dbms.adoc
@@ -92,7 +92,7 @@ user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONUserDAO
group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONGroupDAO
anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONAnyObjectDAO
conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONConfDAO
-audit.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONAuditDAO
+logger.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONLoggerDAO
....
In `provisioning.properties`, replace as follows:
@@ -226,7 +226,7 @@ user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONUserDAO
group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONGroupDAO
anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONAnyObjectDAO
conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONConfDAO
-audit.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONAuditDAO
+logger.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONLoggerDAO
....
In `provisioning.properties`, replace as follows: