From 30608ba99a487169244156cff03cda68626db287 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Thu, 2 Apr 2015 20:25:57 +0200 Subject: [PATCH] [New] Added REST API to query Audits --- .../java/li/strolch/agent/api/AuditTrail.java | 2 + .../agent/impl/AuditingAuditMapFacade.java | 8 ++ .../strolch/agent/impl/CachedAuditTrail.java | 6 ++ .../agent/impl/NoStrategyAuditTrail.java | 5 ++ .../agent/impl/TransactionalAuditTrail.java | 6 ++ .../java/li/strolch/model/audit/Audit.java | 29 +++++++ .../li/strolch/model/audit/AuditQuery.java | 3 +- .../strolch/rest/StrolchRestfulClasses.java | 2 + .../strolch/rest/endpoint/AuditsService.java | 61 +++++++++++++ .../strolch/rest/model/ActionSelection.java | 56 ++++++++++++ .../li/strolch/rest/model/AuditQuery.java | 86 +++++++++++++++++++ .../strolch/rest/model/AuditQueryResult.java | 48 +++++++++++ .../java/li/strolch/rest/model/DateRange.java | 81 +++++++++++++++++ .../strolch/rest/model/IdentitySelection.java | 62 +++++++++++++ .../strolch/rest/model/StringListResult.java | 47 ++++++++++ .../model/visitor/ToAuditQueryVisitor.java | 70 +++++++++++++++ 16 files changed, 570 insertions(+), 2 deletions(-) create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/endpoint/AuditsService.java create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/model/ActionSelection.java create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/model/AuditQuery.java create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/model/AuditQueryResult.java create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/model/DateRange.java create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/model/IdentitySelection.java create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/model/StringListResult.java create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/model/visitor/ToAuditQueryVisitor.java diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/api/AuditTrail.java b/li.strolch.agent/src/main/java/li/strolch/agent/api/AuditTrail.java index 3f2479efc..cdd8acb2b 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/api/AuditTrail.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/api/AuditTrail.java @@ -67,5 +67,7 @@ public interface AuditTrail { public long removeAll(StrolchTransaction tx, String type, DateRange dateRange); + public List doQuery(StrolchTransaction tx, AuditQuery query); + public List doQuery(StrolchTransaction tx, AuditQuery query, AuditVisitor auditVisitor); } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingAuditMapFacade.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingAuditMapFacade.java index e4be8e2e5..62195c79d 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingAuditMapFacade.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingAuditMapFacade.java @@ -31,6 +31,7 @@ import li.strolch.agent.api.AuditTrail; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; import li.strolch.model.audit.AuditVisitor; +import li.strolch.model.audit.NoStrategyAuditVisitor; import li.strolch.persistence.api.StrolchTransaction; import ch.eitchnet.utils.collections.DateRange; import ch.eitchnet.utils.dbc.DBC; @@ -197,6 +198,13 @@ public class AuditingAuditMapFacade implements AuditTrail { return removed; } + @Override + public List doQuery(StrolchTransaction tx, AuditQuery query) { + List elements = this.auditTrail.doQuery(tx, query, new NoStrategyAuditVisitor()); + // TODO decide how to audit these queried elements + return elements; + } + @Override public List doQuery(StrolchTransaction tx, AuditQuery query, AuditVisitor auditVisitor) { List elements = this.auditTrail.doQuery(tx, query, auditVisitor); diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedAuditTrail.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedAuditTrail.java index c2b9aab34..cc2383038 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedAuditTrail.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedAuditTrail.java @@ -23,6 +23,7 @@ import li.strolch.agent.api.AuditTrail; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; import li.strolch.model.audit.AuditVisitor; +import li.strolch.model.audit.NoStrategyAuditVisitor; import li.strolch.persistence.api.AuditDao; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.persistence.inmemory.InMemoryAuditDao; @@ -154,6 +155,11 @@ public class CachedAuditTrail implements AuditTrail { return removed; } + @Override + public List doQuery(StrolchTransaction tx, AuditQuery query) { + return getDbDao(tx).doQuery(query, new NoStrategyAuditVisitor()); + } + @Override public List doQuery(StrolchTransaction tx, AuditQuery query, AuditVisitor auditVisitor) { return getDbDao(tx).doQuery(query, auditVisitor); diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/NoStrategyAuditTrail.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/NoStrategyAuditTrail.java index b88de32e2..476ad7207 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/NoStrategyAuditTrail.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/NoStrategyAuditTrail.java @@ -100,6 +100,11 @@ public class NoStrategyAuditTrail implements AuditTrail { return 0; } + @Override + public List doQuery(StrolchTransaction tx, AuditQuery query) { + return null; + } + @Override public List doQuery(StrolchTransaction tx, AuditQuery query, AuditVisitor auditVisitor) { return null; diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalAuditTrail.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalAuditTrail.java index 9f34b8619..6e0412ed6 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalAuditTrail.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalAuditTrail.java @@ -22,6 +22,7 @@ import li.strolch.agent.api.AuditTrail; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; import li.strolch.model.audit.AuditVisitor; +import li.strolch.model.audit.NoStrategyAuditVisitor; import li.strolch.persistence.api.AuditDao; import li.strolch.persistence.api.StrolchTransaction; import ch.eitchnet.utils.collections.DateRange; @@ -107,6 +108,11 @@ public class TransactionalAuditTrail implements AuditTrail { return getDao(tx).removeAll(type, dateRange); } + @Override + public List doQuery(StrolchTransaction tx, AuditQuery query) { + return getDao(tx).doQuery(query, new NoStrategyAuditVisitor()); + } + @Override public List doQuery(StrolchTransaction tx, AuditQuery query, AuditVisitor auditVisitor) { return getDao(tx).doQuery(query, auditVisitor); diff --git a/li.strolch.model/src/main/java/li/strolch/model/audit/Audit.java b/li.strolch.model/src/main/java/li/strolch/model/audit/Audit.java index d07111fb4..5e7cb08d2 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/audit/Audit.java +++ b/li.strolch.model/src/main/java/li/strolch/model/audit/Audit.java @@ -18,28 +18,57 @@ package li.strolch.model.audit; import java.io.Serializable; import java.util.Date; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + import li.strolch.model.StrolchRootElement; +import li.strolch.model.xml.Iso8601DateAdapter; /** * Used to log/audit access to {@link StrolchRootElement} * * @author Robert von Burg */ +@XmlRootElement(name = "Audit") +@XmlAccessorType(XmlAccessType.NONE) public class Audit implements Comparable, Serializable { private static final long serialVersionUID = 1L; + @XmlAttribute(name = "id") private Long id; + + @XmlAttribute(name = "username") private String username; + + @XmlAttribute(name = "firstname") private String firstname; + + @XmlAttribute(name = "lastname") private String lastname; + + @XmlElement(name = "date") + @XmlJavaTypeAdapter(Iso8601DateAdapter.class) private Date date; + @XmlAttribute(name = "elementType") private String elementType; + + @XmlAttribute(name = "elementAccessed") private String elementAccessed; + + @XmlElement(name = "newVersion") + @XmlJavaTypeAdapter(Iso8601DateAdapter.class) private Date newVersion; + @XmlAttribute(name = "action") private String action; + + @XmlAttribute(name = "accessType") private AccessType accessType; /** diff --git a/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQuery.java b/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQuery.java index 54dcf4914..19c37d52e 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQuery.java +++ b/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQuery.java @@ -32,6 +32,7 @@ public class AuditQuery implements StrolchQuery { private DateRange dateRange; public AuditQuery(String elementTypeSelection, DateRange dateRange) { + DBC.PRE.assertNotEmpty("No elementTypeSelection (navigation) set!", elementTypeSelection); //$NON-NLS-1$ DBC.PRE.assertFalse("dateRange may not be unbounded!", dateRange.isUnbounded()); this.elementTypeSelection = elementTypeSelection; this.dateRange = dateRange; @@ -65,8 +66,6 @@ public class AuditQuery implements StrolchQuery { } public void accept(AuditQueryVisitor visitor) { - DBC.PRE.assertNotNull("No elementTypeSelection (navigation) set!", this.elementTypeSelection); //$NON-NLS-1$ - DBC.PRE.assertNotNull("No dateRange set!", this.dateRange); //$NON-NLS-1$ visitor.visit(this); for (AuditSelection selection : this.selections) { selection.accept(visitor); diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/StrolchRestfulClasses.java b/li.strolch.rest/src/main/java/li/strolch/rest/StrolchRestfulClasses.java index 73400b215..31b2cf24d 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/StrolchRestfulClasses.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/StrolchRestfulClasses.java @@ -19,6 +19,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; +import li.strolch.rest.endpoint.AuditsService; import li.strolch.rest.endpoint.AuthenticationService; import li.strolch.rest.endpoint.EnumQuery; import li.strolch.rest.endpoint.Inspector; @@ -53,6 +54,7 @@ public class StrolchRestfulClasses { restfulClasses.add(PrivilegeRolesService.class); restfulClasses.add(PrivilegePoliciesService.class); restfulClasses.add(UserSessionsService.class); + restfulClasses.add(AuditsService.class); Set> providerClasses = new HashSet<>(); providerClasses.add(StrolchRestfulExceptionMapper.class); diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/AuditsService.java b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/AuditsService.java new file mode 100644 index 000000000..e4883bd75 --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/AuditsService.java @@ -0,0 +1,61 @@ +package li.strolch.rest.endpoint; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import li.strolch.agent.api.StrolchRealm; +import li.strolch.model.audit.Audit; +import li.strolch.persistence.api.StrolchTransaction; +import li.strolch.rest.RestfulStrolchComponent; +import li.strolch.rest.StrolchRestfulConstants; +import li.strolch.rest.model.AuditQuery; +import li.strolch.rest.model.AuditQueryResult; +import li.strolch.rest.model.StringListResult; +import li.strolch.rest.model.visitor.ToAuditQueryVisitor; +import ch.eitchnet.privilege.model.Certificate; + +@Path("strolch/audits") +public class AuditsService { + + @GET + @Path("types") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response queryTypes(@Context HttpServletRequest request) { + Certificate cert = (Certificate) request.getAttribute(StrolchRestfulConstants.STROLCH_CERTIFICATE); + StrolchRealm realm = RestfulStrolchComponent.getInstance().getContainer().getRealm(cert); + + try (StrolchTransaction tx = realm.openTx(cert, AuditsService.class)) { + Set data = tx.getAuditTrail().getTypes(tx); + return Response.ok(new StringListResult(new ArrayList<>(data)), MediaType.APPLICATION_JSON).build(); + } + } + + @POST + @Path("query") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response queryAudits(AuditQuery query, @Context HttpServletRequest request) { + Certificate cert = (Certificate) request.getAttribute(StrolchRestfulConstants.STROLCH_CERTIFICATE); + StrolchRealm realm = RestfulStrolchComponent.getInstance().getContainer().getRealm(cert); + + try (StrolchTransaction tx = realm.openTx(cert, AuditsService.class)) { + + li.strolch.model.audit.AuditQuery auditQuery = new ToAuditQueryVisitor().create(query); + List audits = tx.getAuditTrail().doQuery(tx, auditQuery); + + return Response.ok(new AuditQueryResult(audits), MediaType.APPLICATION_JSON).build(); + } + } +} diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/model/ActionSelection.java b/li.strolch.rest/src/main/java/li/strolch/rest/model/ActionSelection.java new file mode 100644 index 000000000..879965c98 --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/model/ActionSelection.java @@ -0,0 +1,56 @@ +/* + * Copyright 2013 Robert von Burg + * + * Licensed 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 li.strolch.rest.model; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import li.strolch.model.audit.AccessType; + +/** + * @author Robert von Burg + */ +@XmlRootElement(name = "ActionSelection") +@XmlAccessorType(XmlAccessType.NONE) +public class ActionSelection { + + @XmlAttribute(name = "action") + private String action; + + @XmlElement(name = "accessTypes") + private List accessTypes; + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public List getAccessTypes() { + return accessTypes; + } + + public void setAccessTypes(List accessTypes) { + this.accessTypes = accessTypes; + } +} diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/model/AuditQuery.java b/li.strolch.rest/src/main/java/li/strolch/rest/model/AuditQuery.java new file mode 100644 index 000000000..df2e62152 --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/model/AuditQuery.java @@ -0,0 +1,86 @@ +/* + * Copyright 2013 Robert von Burg + * + * Licensed 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 li.strolch.rest.model; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + + +/** + * @author Robert von Burg + */ +@XmlRootElement(name = "AuditQuery") +@XmlAccessorType(XmlAccessType.NONE) +public class AuditQuery { + + @XmlAttribute(name = "elementType") + private String elementType; + + @XmlAttribute(name = "elementId") + private String elementId; + + @XmlElement(name = "identity") + private IdentitySelection identity; + + @XmlElement(name = "action") + private ActionSelection action; + + @XmlElement(name = "dateRange") + private DateRange dateRange; + + public String getElementType() { + return elementType; + } + + public void setElementType(String elementType) { + this.elementType = elementType; + } + + public String getElementId() { + return elementId; + } + + public void setElementId(String elementId) { + this.elementId = elementId; + } + + public IdentitySelection getIdentity() { + return identity; + } + + public void setIdentity(IdentitySelection identity) { + this.identity = identity; + } + + public ActionSelection getAction() { + return action; + } + + public void setAction(ActionSelection action) { + this.action = action; + } + + public DateRange getDateRange() { + return dateRange; + } + + public void setDateRange(DateRange dateRange) { + this.dateRange = dateRange; + } +} diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/model/AuditQueryResult.java b/li.strolch.rest/src/main/java/li/strolch/rest/model/AuditQueryResult.java new file mode 100644 index 000000000..7c8b1994b --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/model/AuditQueryResult.java @@ -0,0 +1,48 @@ +package li.strolch.rest.model; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import li.strolch.model.audit.Audit; +import ch.eitchnet.utils.helper.StringHelper; + +@XmlRootElement(name = "AuditQueryResult") +@XmlAccessorType(XmlAccessType.NONE) +public class AuditQueryResult { + + @XmlAttribute(name = "msg") + private String msg; + + @XmlElement(name = "audits") + private List audits; + + public AuditQueryResult() { + this.msg = StringHelper.DASH; + } + + public AuditQueryResult(List audits) { + this.msg = StringHelper.DASH; + this.audits = audits; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public List getAudits() { + return audits; + } + + public void setAudits(List audits) { + this.audits = audits; + } +} diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/model/DateRange.java b/li.strolch.rest/src/main/java/li/strolch/rest/model/DateRange.java new file mode 100644 index 000000000..e99193f2a --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/model/DateRange.java @@ -0,0 +1,81 @@ +/* + * Copyright 2013 Robert von Burg + * + * Licensed 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 li.strolch.rest.model; + +import java.util.Date; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + +import li.strolch.model.xml.Iso8601DateAdapter; + +/** + * @author Robert von Burg + */ +@XmlRootElement(name = "DateRange") +@XmlAccessorType(XmlAccessType.NONE) +public class DateRange { + + @XmlAttribute(name = "fromInclusive") + private boolean fromInclusive; + + @XmlAttribute(name = "toInclusive") + private boolean toInclusive; + + @XmlElement(name = "fromDate") + @XmlJavaTypeAdapter(Iso8601DateAdapter.class) + private Date fromDate; + + @XmlElement(name = "toDate") + @XmlJavaTypeAdapter(Iso8601DateAdapter.class) + private Date toDate; + + public boolean isFromInclusive() { + return fromInclusive; + } + + public void setFromInclusive(boolean fromInclusive) { + this.fromInclusive = fromInclusive; + } + + public boolean isToInclusive() { + return toInclusive; + } + + public void setToInclusive(boolean toInclusive) { + this.toInclusive = toInclusive; + } + + public Date getFromDate() { + return fromDate; + } + + public void setFromDate(Date fromDate) { + this.fromDate = fromDate; + } + + public Date getToDate() { + return toDate; + } + + public void setToDate(Date toDate) { + this.toDate = toDate; + } +} diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/model/IdentitySelection.java b/li.strolch.rest/src/main/java/li/strolch/rest/model/IdentitySelection.java new file mode 100644 index 000000000..cf2d883ad --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/model/IdentitySelection.java @@ -0,0 +1,62 @@ +/* + * Copyright 2013 Robert von Burg + * + * Licensed 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 li.strolch.rest.model; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * @author Robert von Burg + */ +@XmlRootElement(name = "IdentitySelection") +@XmlAccessorType(XmlAccessType.NONE) +public class IdentitySelection { + + @XmlAttribute(name = "username") + private String username; + + @XmlAttribute(name = "firstname") + private String firstname; + + @XmlAttribute(name = "lastname") + private String lastname; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getFirstname() { + return firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public String getLastname() { + return lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } +} diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/model/StringListResult.java b/li.strolch.rest/src/main/java/li/strolch/rest/model/StringListResult.java new file mode 100644 index 000000000..1bf91705f --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/model/StringListResult.java @@ -0,0 +1,47 @@ +package li.strolch.rest.model; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import ch.eitchnet.utils.helper.StringHelper; + +@XmlRootElement(name = "StringListResult") +@XmlAccessorType(XmlAccessType.NONE) +public class StringListResult { + + @XmlAttribute(name = "msg") + private String msg; + + @XmlElement(name = "data") + private List data; + + public StringListResult() { + this.msg = StringHelper.DASH; + } + + public StringListResult(List data) { + this.msg = StringHelper.DASH; + this.data = data; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } +} diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/model/visitor/ToAuditQueryVisitor.java b/li.strolch.rest/src/main/java/li/strolch/rest/model/visitor/ToAuditQueryVisitor.java new file mode 100644 index 000000000..6ff194110 --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/model/visitor/ToAuditQueryVisitor.java @@ -0,0 +1,70 @@ +package li.strolch.rest.model.visitor; + +import java.util.List; + +import li.strolch.model.audit.AccessType; +import li.strolch.rest.model.ActionSelection; +import li.strolch.rest.model.AuditQuery; +import li.strolch.rest.model.DateRange; +import li.strolch.rest.model.IdentitySelection; +import ch.eitchnet.utils.StringMatchMode; +import ch.eitchnet.utils.helper.StringHelper; + +public class ToAuditQueryVisitor { + + public li.strolch.model.audit.AuditQuery create(AuditQuery query) { + + // validate element type + String elementType = query.getElementType(); + if (StringHelper.isEmpty(elementType)) { + throw new IllegalArgumentException("elementType on AuditQuery is empty!"); + } + + // validate date range + DateRange dateRange = query.getDateRange(); + if (dateRange == null || dateRange.getFromDate() == null || dateRange.getToDate() == null) { + throw new IllegalArgumentException("DateRange on AuditQuery is not valid or is missing!"); + } + ch.eitchnet.utils.collections.DateRange dr = new ch.eitchnet.utils.collections.DateRange().from( + dateRange.getFromDate(), dateRange.isFromInclusive()).to(dateRange.getToDate(), + dateRange.isToInclusive()); + + // create query + li.strolch.model.audit.AuditQuery auditQuery = new li.strolch.model.audit.AuditQuery(elementType, dr); + + // element Id + String elementId = query.getElementId(); + if (StringHelper.isNotEmpty(elementId)) { + auditQuery.element().elementsAccessed(StringMatchMode.ci(), elementId); + } + + // action + ActionSelection action = query.getAction(); + if (action != null) { + String actionS = action.getAction(); + li.strolch.model.audit.ActionSelection actionSelection = auditQuery.action(); + if (StringHelper.isNotEmpty(actionS)) + actionSelection.actions(StringMatchMode.ci(), actionS); + List accessTypes = action.getAccessTypes(); + if (accessTypes != null && !accessTypes.isEmpty()) { + AccessType[] accessTypesArr = new AccessType[accessTypes.size()]; + accessTypes.toArray(accessTypesArr); + actionSelection.accessTypes(accessTypesArr); + } + } + + // identity + IdentitySelection identity = query.getIdentity(); + if (identity != null) { + li.strolch.model.audit.IdentitySelection identitySelection = auditQuery.identity(); + if (StringHelper.isNotEmpty(identity.getFirstname())) + identitySelection.firstnames(StringMatchMode.ci(), identity.getFirstname()); + if (StringHelper.isNotEmpty(identity.getLastname())) + identitySelection.lastnames(StringMatchMode.ci(), identity.getLastname()); + if (StringHelper.isNotEmpty(identity.getUsername())) + identitySelection.usernames(StringMatchMode.ci(), identity.getUsername()); + } + + return auditQuery; + } +}