diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/LinkedReferencePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/LinkedReferencePanel.java index 664ff478685..f2f5d596505 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/LinkedReferencePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/LinkedReferencePanel.java @@ -14,6 +14,7 @@ import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.Referencable; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.web.component.data.column.ImagePanel; import com.evolveum.midpoint.web.component.util.EnableBehaviour; @@ -31,7 +32,7 @@ /** * Created by honchar */ -public class LinkedReferencePanel extends BasePanel { +public class LinkedReferencePanel extends BasePanel { private static final long serialVersionUID = 1L; private static final String ID_ICON = "icon"; @@ -43,7 +44,7 @@ public class LinkedReferencePanel extends BasePanel referencedObjectModel = null; - public LinkedReferencePanel(String id, IModel objectReferenceModel){ + public LinkedReferencePanel(String id, IModel objectReferenceModel){ super(id, objectReferenceModel); } @@ -65,10 +66,11 @@ protected ObjectType load() { && getModelObject().asReferenceValue().getObject().asObjectable() instanceof ObjectType ){ return (ObjectType)getModelObject().asReferenceValue().getObject().asObjectable(); } - if (StringUtils.isNotEmpty(getModelObject().getOid()) && getModelObject().getType() != null) { + if (StringUtils.isNotEmpty(getModelObject().getOid()) && getModelObject().getType() != null && + getModelObject() instanceof ObjectReferenceType) { PageBase pageBase = LinkedReferencePanel.this.getPageBase(); OperationResult result = new OperationResult(OPERATION_LOAD_REFERENCED_OBJECT); - PrismObject referencedObject = WebModelServiceUtils.loadObject(getModelObject(), pageBase, + PrismObject referencedObject = WebModelServiceUtils.loadObject((ObjectReferenceType) getModelObject(), pageBase, pageBase.createSimpleTask(OPERATION_LOAD_REFERENCED_OBJECT), result); return referencedObject != null ? referencedObject.asObjectable() : null; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItem.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItem.java index b13cd3ad962..54ad9e9c37b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItem.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItem.java @@ -32,6 +32,7 @@ import org.apache.wicket.Component; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.feedback.FeedbackMessage; import org.apache.wicket.request.mapper.parameter.PageParameters; import java.util.ArrayList; @@ -98,6 +99,10 @@ public class PageCaseWorkItem extends PageAdminCaseWorkItems { private WorkItemId workItemId; private PageParameters pageParameters; + public PageCaseWorkItem() { + this(null); + } + public PageCaseWorkItem(CaseWorkItemType workItem) { this(workItem, null); } @@ -108,7 +113,12 @@ public PageCaseWorkItem(CaseWorkItemType workItem, PageParameters parameters) { caseWorkItemModel = new LoadableModel(false) { @Override protected CaseWorkItemType load() { - return workItem; + if (workItem != null) { + return workItem; + } else { + getSession().error("Workitem model cannot be null"); + throw redirectBackViaRestartResponseException(); + } } }; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java index 85e8aff8d71..1cbe91c0989 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java @@ -8,11 +8,7 @@ import static com.evolveum.midpoint.model.api.util.DashboardUtils.*; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; @@ -41,27 +37,10 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskManager; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AuditSearchType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.DashboardWidgetDataFieldTypeType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.DashboardWidgetPresentationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.DashboardWidgetSourceTypeType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.DashboardWidgetType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.DashboardWidgetVariationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.DisplayType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.IconType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.IntegerStatType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectCollectionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; /** @@ -99,77 +78,77 @@ public DashboardWidget createWidgetData(DashboardWidgetType widget, Task task, O return data; } - private DisplayType combinateDisplay(DisplayType display, DisplayType variationDisplay) { - DisplayType combinatedDisplay = new DisplayType(); + private DisplayType combineDisplay(DisplayType display, DisplayType variationDisplay) { + DisplayType combinedDisplay = new DisplayType(); if (variationDisplay == null) { return display; } - if(display == null) { + if (display == null) { return variationDisplay; } - if(StringUtils.isBlank(variationDisplay.getColor())) { - combinatedDisplay.setColor(display.getColor()); + if (StringUtils.isBlank(variationDisplay.getColor())) { + combinedDisplay.setColor(display.getColor()); } else { - combinatedDisplay.setColor(variationDisplay.getColor()); + combinedDisplay.setColor(variationDisplay.getColor()); } - if(StringUtils.isBlank(variationDisplay.getCssClass())) { - combinatedDisplay.setCssClass(display.getCssClass()); + if (StringUtils.isBlank(variationDisplay.getCssClass())) { + combinedDisplay.setCssClass(display.getCssClass()); } else { - combinatedDisplay.setCssClass(variationDisplay.getCssClass()); + combinedDisplay.setCssClass(variationDisplay.getCssClass()); } - if(StringUtils.isBlank(variationDisplay.getCssStyle())) { - combinatedDisplay.setCssStyle(display.getCssStyle()); + if (StringUtils.isBlank(variationDisplay.getCssStyle())) { + combinedDisplay.setCssStyle(display.getCssStyle()); } else { - combinatedDisplay.setCssStyle(variationDisplay.getCssStyle()); + combinedDisplay.setCssStyle(variationDisplay.getCssStyle()); } - if(variationDisplay.getHelp() == null) { - combinatedDisplay.setHelp(display.getHelp()); + if (variationDisplay.getHelp() == null) { + combinedDisplay.setHelp(display.getHelp()); } else { - combinatedDisplay.setHelp(variationDisplay.getHelp()); + combinedDisplay.setHelp(variationDisplay.getHelp()); } - if(variationDisplay.getLabel() == null) { - combinatedDisplay.setLabel(display.getLabel()); + if (variationDisplay.getLabel() == null) { + combinedDisplay.setLabel(display.getLabel()); } else { - combinatedDisplay.setLabel(variationDisplay.getLabel()); + combinedDisplay.setLabel(variationDisplay.getLabel()); } - if(variationDisplay.getSingularLabel() == null) { - combinatedDisplay.setSingularLabel(display.getSingularLabel()); + if (variationDisplay.getSingularLabel() == null) { + combinedDisplay.setSingularLabel(display.getSingularLabel()); } else { - combinatedDisplay.setSingularLabel(variationDisplay.getSingularLabel()); + combinedDisplay.setSingularLabel(variationDisplay.getSingularLabel()); } - if(variationDisplay.getPluralLabel() == null) { - combinatedDisplay.setPluralLabel(display.getPluralLabel()); + if (variationDisplay.getPluralLabel() == null) { + combinedDisplay.setPluralLabel(display.getPluralLabel()); } else { - combinatedDisplay.setPluralLabel(variationDisplay.getPluralLabel()); + combinedDisplay.setPluralLabel(variationDisplay.getPluralLabel()); } - if(variationDisplay.getTooltip() == null) { - combinatedDisplay.setTooltip(display.getTooltip()); + if (variationDisplay.getTooltip() == null) { + combinedDisplay.setTooltip(display.getTooltip()); } else { - combinatedDisplay.setTooltip(variationDisplay.getTooltip()); + combinedDisplay.setTooltip(variationDisplay.getTooltip()); } - if(variationDisplay.getIcon() == null) { - combinatedDisplay.setIcon(display.getIcon()); - } else if(display.getIcon() != null){ + if (variationDisplay.getIcon() == null) { + combinedDisplay.setIcon(display.getIcon()); + } else if (display.getIcon() != null) { IconType icon = new IconType(); - if(StringUtils.isBlank(variationDisplay.getIcon().getCssClass())) { + if (StringUtils.isBlank(variationDisplay.getIcon().getCssClass())) { icon.setCssClass(display.getIcon().getCssClass()); } else { icon.setCssClass(variationDisplay.getIcon().getCssClass()); } - if(StringUtils.isBlank(variationDisplay.getIcon().getColor())) { + if (StringUtils.isBlank(variationDisplay.getIcon().getColor())) { icon.setColor(display.getIcon().getColor()); } else { icon.setColor(variationDisplay.getIcon().getColor()); } - if(StringUtils.isBlank(variationDisplay.getIcon().getImageUrl())) { + if (StringUtils.isBlank(variationDisplay.getIcon().getImageUrl())) { icon.setImageUrl(display.getIcon().getImageUrl()); } else { icon.setImageUrl(variationDisplay.getIcon().getImageUrl()); } - combinatedDisplay.setIcon(icon); + combinedDisplay.setIcon(icon); } - return combinatedDisplay; + return combinedDisplay; } public DashboardWidgetSourceTypeType getSourceType(DashboardWidgetType widget) { @@ -227,7 +206,7 @@ private String generateNumberMessageForAuditSearch(DashboardWidgetType widget, D return null; } - Map parameters = new HashMap(); + Map parameters = new HashMap<>(); String query = getQueryForCount(createQuery(collection, parameters, false, clock)); LOGGER.debug("Parameters for select: " + parameters); @@ -237,7 +216,7 @@ private String generateNumberMessageForAuditSearch(DashboardWidgetType widget, D if(auditSearch.getDomainQuery() == null) { LOGGER.error("DomainQuery of auditSearch is not defined"); } else { - parameters = new HashMap(); + parameters = new HashMap<>(); query = getQueryForCount(createQuery(collection, parameters, true, clock)); LOGGER.debug("Parameters for select: " + parameters); @@ -251,7 +230,7 @@ private String generateNumberMessageForAuditSearch(DashboardWidgetType widget, D private String getQueryForCount(String query) { int index = query.toLowerCase().indexOf("from"); - query = "select count (*) " + query.substring(index); + query = "select count(*) " + query.substring(index); query = query.split("order")[0]; LOGGER.debug("Query for select: " + query); return query; @@ -273,7 +252,7 @@ private String generateNumberMessageForCollection(DashboardWidgetType widget, Da Collection evalPolicyRules = modelInteractionService.evaluateCollectionPolicyRules( valueCollection.asPrismObject(), compiledCollection, null, task, task.getResult()); - Collection policySituations = new ArrayList(); + Collection policySituations = new ArrayList<>(); for(EvaluatedPolicyRule evalPolicyRule : evalPolicyRules) { if(!evalPolicyRule.getAllTriggers().isEmpty()) { policySituations.add(evalPolicyRule.getPolicySituation()); @@ -317,7 +296,7 @@ private static IntegerStatType generateIntegerStat(Integer value, Integer domain } private String generateNumberMessage(DashboardWidgetType widget, ExpressionVariables variables, DashboardWidget data) { - Map numberMessagesParts = new HashMap(); + Map numberMessagesParts = new HashMap<>(); widget.getPresentation().getDataField().forEach(dataField -> { switch(dataField.getFieldType()) { @@ -375,7 +354,7 @@ private void evaluateVariation(DashboardWidgetType widget, ExpressionVariables v if(usingVariation != null && usingVariation.getRealValue() != null && usingVariation.getRealValue().equals(Boolean.TRUE)) { - data.setDisplay(combinateDisplay(widget.getDisplay(), variation.getDisplay())); + data.setDisplay(combineDisplay(widget.getDisplay(), variation.getDisplay())); } else { data.setDisplay(widget.getDisplay()); } @@ -416,8 +395,7 @@ public ObjectCollectionType getObjectCollectionType(DashboardWidgetType widget, return null; } ObjectReferenceType ref = widget.getData().getCollection().getCollectionRef(); - ObjectCollectionType collection = objectResolver.resolve(ref, ObjectCollectionType.class, null, "resolving collection from "+widget, task, result); - return collection; + return objectResolver.resolve(ref, ObjectCollectionType.class, null, "resolving collection from "+widget, task, result); } private ObjectType getObjectFromObjectRef(DashboardWidgetType widget, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java index 088e774f166..ce8736a8a57 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java @@ -6,8 +6,32 @@ */ package com.evolveum.midpoint.repo.sql; -import com.evolveum.midpoint.audit.api.*; -import com.evolveum.midpoint.prism.PrismContext; +import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; + +import java.sql.*; +import java.util.Date; +import java.util.*; +import java.util.Map.Entry; +import java.util.function.BiFunction; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.xml.datatype.Duration; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.Validate; +import org.hibernate.FlushMode; +import org.hibernate.Session; +import org.hibernate.dialect.Dialect; +import org.hibernate.dialect.pagination.LimitHandler; +import org.hibernate.engine.spi.RowSelection; +import org.hibernate.query.NativeQuery; +import org.hibernate.query.Query; +import org.springframework.beans.factory.annotation.Autowired; + +import com.evolveum.midpoint.audit.api.AuditEventRecord; +import com.evolveum.midpoint.audit.api.AuditReferenceValue; +import com.evolveum.midpoint.audit.api.AuditResultHandler; +import com.evolveum.midpoint.audit.api.AuditService; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -18,7 +42,6 @@ import com.evolveum.midpoint.repo.sql.data.SelectQueryBuilder; import com.evolveum.midpoint.repo.sql.data.SingleSqlQuery; import com.evolveum.midpoint.repo.sql.data.audit.*; -import com.evolveum.midpoint.repo.sql.data.common.enums.ROperationResultStatus; import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; import com.evolveum.midpoint.repo.sql.helpers.BaseHelper; import com.evolveum.midpoint.repo.sql.perf.SqlPerformanceMonitorImpl; @@ -28,48 +51,16 @@ import com.evolveum.midpoint.repo.sql.util.TemporaryTableDialect; import com.evolveum.midpoint.schema.ObjectDeltaOperation; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.Holder; -import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.CleanupPolicyType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.EventStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.Validate; -import org.hibernate.FlushMode; -import org.hibernate.ScrollableResults; -import org.hibernate.Session; -import org.hibernate.dialect.Dialect; -import org.hibernate.dialect.pagination.LimitHandler; -import org.hibernate.engine.spi.RowSelection; -import org.hibernate.jdbc.Work; -import org.hibernate.query.NativeQuery; -import org.hibernate.query.Query; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.propertyeditors.CustomCollectionEditor; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.xml.datatype.Duration; -import javax.xml.datatype.XMLGregorianCalendar; - -import java.lang.reflect.InvocationTargetException; -import java.math.BigDecimal; -import java.sql.*; -import java.util.*; -import java.util.Date; -import java.util.Map.Entry; -import java.util.function.BiFunction; - -import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; /** * @author lazyman @@ -91,7 +82,7 @@ public class SqlAuditServiceImpl extends SqlBaseService implements AuditService private static final String QUERY_MAX_RESULT = "setMaxResults"; private static final String QUERY_FIRST_RESULT = "setFirstResult"; - private Map customColumn = new HashMap(); + private Map customColumn = new HashMap<>(); public SqlAuditServiceImpl(SqlRepositoryFactory repositoryFactory) { super(repositoryFactory); @@ -184,7 +175,6 @@ public void listRecordsIterative(String query, Map params, Audit } } - } @Override @@ -208,23 +198,17 @@ public void reindexEntry(AuditEventRecord record) { } private void reindexEntryAttempt(AuditEventRecord record) { - Session session = null; + Session session = baseHelper.beginTransaction(); try { - session = baseHelper.beginTransaction(); RAuditEventRecord reindexed = RAuditEventRecord.toRepo(record, getPrismContext(), null); //TODO FIXME temporary hack, merge will eventyually load the object to the session if there isn't one, // but in this case we force loading object because of "objectDeltaOperation". There is some problem probably // during serializing/deserializing which causes constraint violation on priamry key.. - Object o = session.load(RAuditEventRecord.class, record.getRepoId()); - - if (o instanceof RAuditEventRecord) { - RAuditEventRecord rRecord = (RAuditEventRecord) o; - rRecord.getChangedItems().clear(); - rRecord.getChangedItems().addAll(reindexed.getChangedItems()); - - session.merge(rRecord); - } + RAuditEventRecord rRecord = session.load(RAuditEventRecord.class, record.getRepoId()); + rRecord.getChangedItems().clear(); + rRecord.getChangedItems().addAll(reindexed.getChangedItems()); + session.merge(rRecord); session.getTransaction().commit(); @@ -239,164 +223,150 @@ private void reindexEntryAttempt(AuditEventRecord record) { } private void listRecordsIterativeAttempt(String query, Map params, - AuditResultHandler handler, OperationResult result) { - Session session = null; + AuditResultHandler handler, OperationResult result) { if (LOGGER.isTraceEnabled()) { LOGGER.trace("List records attempt\n query: {}\n params:\n{}", query, DebugUtil.debugDump(params, 2)); } - session = baseHelper.beginReadOnlyTransaction(); - + Session session = baseHelper.beginReadOnlyTransaction(); try { - Session localSession = session; - session.doWork(new Work() { - - @Override - public void execute(Connection con) throws SQLException { - - Database database = baseHelper.getConfiguration().getDatabase(); - int count = 0; - String basicQuery = query; - if (StringUtils.isBlank(query)) { - basicQuery = "select * from m_audit_event " - + (database.equals(Database.ORACLE) ? "" : "as ") - + "aer where 1=1 order by aer.timestampValue desc"; - } - String deltaQuery = "select * from m_audit_delta " - + (database.equals(Database.ORACLE) ? "" : "as ") - + "delta where delta.record_id=?"; - String propertyQuery = "select * from m_audit_prop_value " - + (database.equals(Database.ORACLE) ? "" : "as ") - + "prop where prop.record_id=?"; - String refQuery = "select * from m_audit_ref_value " - + (database.equals(Database.ORACLE) ? "" : "as ") - + "ref where ref.record_id=?"; - String resourceQuery = "select * from m_audit_resource " - + (database.equals(Database.ORACLE) ? "" : "as ") - + "res where res.record_id=?"; - SelectQueryBuilder queryBuilder = new SelectQueryBuilder(database, basicQuery); - setParametersToQuery(queryBuilder, params); - - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("List records attempt\n processed query: {}", queryBuilder); - } - - PreparedStatement stmt = queryBuilder.build().createPreparedStatement(con); + session.doWork(con -> { + Database database = baseHelper.getConfiguration().getDatabase(); + int count = 0; + String basicQuery = query; + if (StringUtils.isBlank(query)) { + basicQuery = "select * from m_audit_event " + + (database.equals(Database.ORACLE) ? "" : "as ") + + "aer where 1=1 order by aer.timestampValue desc"; + } + String deltaQuery = "select * from m_audit_delta " + + (database.equals(Database.ORACLE) ? "" : "as ") + + "delta where delta.record_id=?"; + String propertyQuery = "select * from m_audit_prop_value " + + (database.equals(Database.ORACLE) ? "" : "as ") + + "prop where prop.record_id=?"; + String refQuery = "select * from m_audit_ref_value " + + (database.equals(Database.ORACLE) ? "" : "as ") + + "ref where ref.record_id=?"; + String resourceQuery = "select * from m_audit_resource " + + (database.equals(Database.ORACLE) ? "" : "as ") + + "res where res.record_id=?"; + SelectQueryBuilder queryBuilder = new SelectQueryBuilder(database, basicQuery); + setParametersToQuery(queryBuilder, params); + + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("List records attempt\n processed query: {}", queryBuilder); + } - ResultSet resultList = stmt.executeQuery(); - try { - while (resultList.next()) { + try (PreparedStatement stmt = queryBuilder.build().createPreparedStatement(con)) { + ResultSet resultList = stmt.executeQuery(); + while (resultList.next()) { - AuditEventRecord audit = RAuditEventRecord.fromRepo(resultList); - if(!customColumn.isEmpty()) { - for(Entry property : customColumn.entrySet()) { - audit.getCustomColumnProperty().put(property.getKey(), resultList.getString(property.getValue())); - } - } + AuditEventRecord audit = RAuditEventRecord.fromRepo(resultList); + if (!customColumn.isEmpty()) { + for (Entry property : customColumn.entrySet()) { + audit.getCustomColumnProperty().put(property.getKey(), resultList.getString(property.getValue())); + } + } - //query for deltas - PreparedStatement subStmt = con.prepareStatement(deltaQuery); - subStmt.setLong(1, resultList.getLong(RAuditEventRecord.ID_COLUMN_NAME)); - ResultSet subResultList = subStmt.executeQuery(); + //query for deltas + PreparedStatement subStmt = con.prepareStatement(deltaQuery); + subStmt.setLong(1, resultList.getLong(RAuditEventRecord.ID_COLUMN_NAME)); + ResultSet subResultList = subStmt.executeQuery(); - OperationResult deltaResult = result.createMinorSubresult(OP_LOAD_AUDIT_DELTA); + OperationResult deltaResult = result.createMinorSubresult(OP_LOAD_AUDIT_DELTA); + try { + while (subResultList.next()) { try { - while (subResultList.next()) { - try { - ObjectDeltaOperation odo = RObjectDeltaOperation.fromRepo(subResultList, getPrismContext(), getConfiguration().isUsingSQLServer()); - if (odo != null) { - audit.addDelta(odo); - } - } catch (DtoTranslationException ex) { - LOGGER.error("Cannot convert stored audit delta. Reason: {}", ex.getMessage(), ex); - deltaResult.recordPartialError("Cannot convert stored audit delta. Reason: " + ex.getMessage(), ex); - //do not throw an error. rather audit record without delta than fatal error. - continue; - } - - } - } finally { - subResultList.close(); - subStmt.close(); - deltaResult.computeStatus(); + ObjectDeltaOperation odo = RObjectDeltaOperation.fromRepo( + subResultList, getPrismContext(), getConfiguration().isUsingSQLServer()); + audit.addDelta(odo); + } catch (DtoTranslationException ex) { + LOGGER.error("Cannot convert stored audit delta. Reason: {}", ex.getMessage(), ex); + deltaResult.recordPartialError("Cannot convert stored audit delta. Reason: " + ex.getMessage(), ex); + //do not throw an error. rather audit record without delta than fatal error. } + } + } finally { + subResultList.close(); + subStmt.close(); + deltaResult.computeStatus(); + } - //query for properties - subStmt = con.prepareStatement(propertyQuery); - subStmt.setLong(1, resultList.getLong(RAuditEventRecord.ID_COLUMN_NAME)); - subResultList = subStmt.executeQuery(); - - try { - while (subResultList.next()) { - audit.addPropertyValue(subResultList.getString(RAuditPropertyValue.NAME_COLUMN_NAME), - subResultList.getString(RAuditPropertyValue.VALUE_COLUMN_NAME)); - } - } finally { - subResultList.close(); - subStmt.close(); - } + //query for properties + subStmt = con.prepareStatement(propertyQuery); + subStmt.setLong(1, resultList.getLong(RAuditEventRecord.ID_COLUMN_NAME)); + subResultList = subStmt.executeQuery(); - //query for references - subStmt = con.prepareStatement(refQuery); - subStmt.setLong(1, resultList.getLong(RAuditEventRecord.ID_COLUMN_NAME)); - subResultList = subStmt.executeQuery(); + try { + while (subResultList.next()) { + audit.addPropertyValue(subResultList.getString(RAuditPropertyValue.NAME_COLUMN_NAME), + subResultList.getString(RAuditPropertyValue.VALUE_COLUMN_NAME)); + } + } finally { + subResultList.close(); + subStmt.close(); + } - try { - while (subResultList.next()) { - audit.addReferenceValue(subResultList.getString(RAuditReferenceValue.NAME_COLUMN_NAME), - RAuditReferenceValue.fromRepo(subResultList)); - } - } finally { - subResultList.close(); - subStmt.close(); - } + //query for references + subStmt = con.prepareStatement(refQuery); + subStmt.setLong(1, resultList.getLong(RAuditEventRecord.ID_COLUMN_NAME)); + subResultList = subStmt.executeQuery(); - //query for target resource oids - subStmt = con.prepareStatement(resourceQuery); - subStmt.setLong(1, resultList.getLong(RAuditEventRecord.ID_COLUMN_NAME)); - subResultList = subStmt.executeQuery(); + try { + while (subResultList.next()) { + audit.addReferenceValue(subResultList.getString(RAuditReferenceValue.NAME_COLUMN_NAME), + RAuditReferenceValue.fromRepo(subResultList)); + } + } finally { + subResultList.close(); + subStmt.close(); + } - try { - while (subResultList.next()) { - audit.addResourceOid(subResultList.getString(RTargetResourceOid.RESOURCE_OID_COLUMN_NAME)); - } - } finally { - subResultList.close(); - subStmt.close(); - } + //query for target resource oids + subStmt = con.prepareStatement(resourceQuery); + subStmt.setLong(1, resultList.getLong(RAuditEventRecord.ID_COLUMN_NAME)); + subResultList = subStmt.executeQuery(); - try { - // TODO what if original name (in audit log) differs from the current one (in repo) ? - audit.setInitiator(resolve(localSession, resultList.getString(RAuditEventRecord.INITIATOR_OID_COLUMN_NAME), - resultList.getString(RAuditEventRecord.INITIATOR_NAME_COLUMN_NAME), - defaultIfNull(RObjectType.values()[resultList.getInt(RAuditEventRecord.INITIATOR_TYPE_COLUMN_NAME)], RObjectType.FOCUS))); - audit.setAttorney(resolve(localSession, resultList.getString(RAuditEventRecord.ATTORNEY_OID_COLUMN_NAME), - resultList.getString(RAuditEventRecord.ATTORNEY_NAME_COLUMN_NAME), RObjectType.FOCUS)); - audit.setTarget(resolve(localSession, resultList.getString(RAuditEventRecord.TARGET_OID_COLUMN_NAME), - resultList.getString(RAuditEventRecord.TARGET_NAME_COLUMN_NAME), - RObjectType.values()[resultList.getInt(RAuditEventRecord.TARGET_TYPE_COLUMN_NAME)]), getPrismContext()); - audit.setTargetOwner(resolve(localSession, resultList.getString(RAuditEventRecord.TARGET_OWNER_OID_COLUMN_NAME), - resultList.getString(RAuditEventRecord.TARGET_OWNER_NAME_COLUMN_NAME), - RObjectType.values()[resultList.getInt(RAuditEventRecord.TARGET_OWNER_TYPE_COLUMN_NAME)])); - } catch (SchemaException ex) { - baseHelper.handleGeneralCheckedException(ex, localSession, null); - } - count++; - if (!handler.handle(audit)) { - LOGGER.trace("Skipping handling of objects after {} was handled. ", audit); - break; - } + try { + while (subResultList.next()) { + audit.addResourceOid(subResultList.getString(RTargetResourceOid.RESOURCE_OID_COLUMN_NAME)); } - }finally { - stmt.close(); - result.computeStatus(); + } finally { + subResultList.close(); + subStmt.close(); } -// - LOGGER.trace("List records iterative attempt processed {} records", count); + try { + // TODO what if original name (in audit log) differs from the current one (in repo) ? + audit.setInitiator(resolve(session, resultList.getString(RAuditEventRecord.INITIATOR_OID_COLUMN_NAME), + resultList.getString(RAuditEventRecord.INITIATOR_NAME_COLUMN_NAME), + defaultIfNull(RObjectType.values()[resultList.getInt(RAuditEventRecord.INITIATOR_TYPE_COLUMN_NAME)], RObjectType.FOCUS))); + audit.setAttorney(resolve(session, resultList.getString(RAuditEventRecord.ATTORNEY_OID_COLUMN_NAME), + resultList.getString(RAuditEventRecord.ATTORNEY_NAME_COLUMN_NAME), RObjectType.FOCUS)); + audit.setTarget(resolve(session, resultList.getString(RAuditEventRecord.TARGET_OID_COLUMN_NAME), + resultList.getString(RAuditEventRecord.TARGET_NAME_COLUMN_NAME), + RObjectType.values()[resultList.getInt(RAuditEventRecord.TARGET_TYPE_COLUMN_NAME)]), getPrismContext()); + audit.setTargetOwner(resolve(session, resultList.getString(RAuditEventRecord.TARGET_OWNER_OID_COLUMN_NAME), + resultList.getString(RAuditEventRecord.TARGET_OWNER_NAME_COLUMN_NAME), + RObjectType.values()[resultList.getInt(RAuditEventRecord.TARGET_OWNER_TYPE_COLUMN_NAME)])); + } catch (SchemaException ex) { + baseHelper.handleGeneralCheckedException(ex, session, null); + } + count++; + if (!handler.handle(audit)) { + LOGGER.trace("Skipping handling of objects after {} was handled. ", audit); + break; + } + } + } finally { + result.computeStatus(); } + +// + LOGGER.trace("List records iterative attempt processed {} records", count); }); session.getTransaction().commit(); @@ -408,87 +378,28 @@ public void execute(Connection con) throws SQLException { } - private void setParametersToQuery(Query q, Map params) { - if (params == null) { - return; - } - - if (params.containsKey("setFirstResult")) { - q.setFirstResult((int) params.get("setFirstResult")); - params.remove("setFirstResult"); - } - if (params.containsKey("setMaxResults")) { - q.setMaxResults((int) params.get("setMaxResults")); - params.remove("setMaxResults"); - } - Set> paramSet = params.entrySet(); - for (Entry p : paramSet) { - if (p.getValue() == null) { - q.setParameter(p.getKey(), null); - continue; - } - - if (List.class.isAssignableFrom(p.getValue().getClass())) { - q.setParameterList(p.getKey(), convertValues((List) p.getValue())); - } else { - q.setParameter(p.getKey(), toRepoType(p.getValue())); - } -// if (XMLGregorianCalendar.class.isAssignableFrom(p.getValue().getClass())) { -// q.setParameter(p.getKey(), MiscUtil.asDate((XMLGregorianCalendar) p.getValue())); -// } else if (p.getValue() instanceof AuditEventType) { -// q.setParameter(p.getKey(), RAuditEventType.toRepo((AuditEventType) p.getValue())); -// } else if (p.getValue() instanceof AuditEventStage) { -// q.setParameter(p.getKey(), RAuditEventStage.toRepo((AuditEventStage) p.getValue())); -// } else { -// q.setParameter(p.getKey(), p.getValue()); -// } - } - } - private void setParametersToQuery(SelectQueryBuilder queryBuilder, Map params) { if (params == null) { return; } if (params.containsKey(QUERY_FIRST_RESULT)) { - queryBuilder.setFirstResult((int)params.get(QUERY_FIRST_RESULT)); + queryBuilder.setFirstResult((int) params.get(QUERY_FIRST_RESULT)); params.remove(QUERY_FIRST_RESULT); } if (params.containsKey(QUERY_MAX_RESULT)) { - queryBuilder.setMaxResult((int)params.get(QUERY_MAX_RESULT)); + queryBuilder.setMaxResult((int) params.get(QUERY_MAX_RESULT)); params.remove(QUERY_MAX_RESULT); } queryBuilder.addParameters(params); } - private List convertValues(List originValues) { - List repoValues = new ArrayList<>(); - for (Object value : originValues) { - repoValues.add(toRepoType(value)); - } - return repoValues; - } - - private Object toRepoType(Object value) { - if (XMLGregorianCalendar.class.isAssignableFrom(value.getClass())) { - return MiscUtil.asDate((XMLGregorianCalendar) value); - } else if (value instanceof AuditEventType) { - return RAuditEventType.toRepo((AuditEventType) value); - } else if (value instanceof AuditEventStage) { - return RAuditEventStage.toRepo((AuditEventStage) value); - } else if (value instanceof OperationResultStatusType) { - return ROperationResultStatus.toRepo((OperationResultStatusType) value); - } - - return value; - } - // using generic parameter to avoid typing warnings private PrismObject resolve(Session session, String oid, String defaultName, RObjectType defaultType) throws SchemaException { if (oid == null) { return null; } - Query query = session.getNamedQuery("get.object"); + Query query = session.getNamedQuery("get.object"); query.setParameter("oid", oid); query.setResultTransformer(GetObjectResult.RESULT_STYLE.getResultTransformer()); GetObjectResult object = (GetObjectResult) query.uniqueResult(); @@ -509,108 +420,95 @@ private PrismObject resolve(Session session, String oi } private void auditAttempt(AuditEventRecord record) { - Session session = null; + Session session = baseHelper.beginTransaction(); try { - session = baseHelper.beginTransaction(); -// RAuditEventRecord newRecord = RAuditEventRecord.toRepo(record, getPrismContext(), true); -// session.save(newRecord); SingleSqlQuery query = RAuditEventRecord.toRepo(record, customColumn); - Session localSession = session; - session.doWork(new Work() { - - @Override - public void execute(Connection connection) throws SQLException { - Database database = getConfiguration().getDatabase(); - String[] keyColumn = {RAuditEventRecord.ID_COLUMN_NAME}; - PreparedStatement smtp = query.createPreparedStatement(connection, keyColumn); - Long id = null; - try { - smtp.executeUpdate(); - ResultSet resultSet = smtp.getGeneratedKeys(); + session.doWork(connection -> { + Database database = getConfiguration().getDatabase(); + String[] keyColumn = { RAuditEventRecord.ID_COLUMN_NAME }; + PreparedStatement smtp = query.createPreparedStatement(connection, keyColumn); + Long id = null; + try { + smtp.executeUpdate(); + ResultSet resultSet = smtp.getGeneratedKeys(); - if (resultSet.next()) { - id = resultSet.getLong(1); + if (resultSet.next()) { + id = resultSet.getLong(1); - } - } finally { - smtp.close(); } - if(id == null) { - throw new IllegalArgumentException("Returned id of new record is null"); - } - - - BatchSqlQuery deltaBatchQuery = new BatchSqlQuery(database); - BatchSqlQuery itemBatchQuery = new BatchSqlQuery(database); + } finally { + smtp.close(); + } + if (id == null) { + throw new IllegalArgumentException("Returned id of new record is null"); + } - for (ObjectDeltaOperation delta : record.getDeltas()) { - if (delta == null) { - continue; - } + BatchSqlQuery deltaBatchQuery = new BatchSqlQuery(database); + BatchSqlQuery itemBatchQuery = new BatchSqlQuery(database); - ObjectDelta objectDelta = delta.getObjectDelta(); - for (ItemDelta itemDelta : objectDelta.getModifications()) { - ItemPath path = itemDelta.getPath(); - if (path != null) { // TODO what if empty? - CanonicalItemPath canonical = getPrismContext().createCanonicalItemPath(path, objectDelta.getObjectTypeClass()); - for (int i = 0; i < canonical.size(); i++) { + for (ObjectDeltaOperation delta : record.getDeltas()) { + if (delta == null) { + continue; + } - SingleSqlQuery itemQuery = RAuditItem.toRepo(id, canonical.allUpToIncluding(i).asString()); -// changedItem.setTransient(true); - itemBatchQuery.addQueryForBatch(itemQuery); - } - } - } + ObjectDelta objectDelta = delta.getObjectDelta(); + for (ItemDelta itemDelta : objectDelta.getModifications()) { + ItemPath path = itemDelta.getPath(); + CanonicalItemPath canonical = getPrismContext().createCanonicalItemPath(path, objectDelta.getObjectTypeClass()); + for (int i = 0; i < canonical.size(); i++) { - SingleSqlQuery deltaQuery; - try { - deltaQuery = RObjectDeltaOperation.toRepo(id, delta, getPrismContext()); - deltaBatchQuery.addQueryForBatch(deltaQuery); - } catch (DtoTranslationException e) { - baseHelper.handleGeneralCheckedException(e, localSession, null); + SingleSqlQuery itemQuery = RAuditItem.toRepo(id, canonical.allUpToIncluding(i).asString()); + itemBatchQuery.addQueryForBatch(itemQuery); } -// rDelta.setTransient(true); - } - if(!deltaBatchQuery.isEmpty()) { - deltaBatchQuery.execute(connection); } - if(!itemBatchQuery.isEmpty()) { - itemBatchQuery.execute(connection); + + SingleSqlQuery deltaQuery; + try { + deltaQuery = RObjectDeltaOperation.toRepo(id, delta, getPrismContext()); + deltaBatchQuery.addQueryForBatch(deltaQuery); + } catch (DtoTranslationException e) { + baseHelper.handleGeneralCheckedException(e, session, null); } + } + if (!deltaBatchQuery.isEmpty()) { + deltaBatchQuery.execute(connection); + } + if (!itemBatchQuery.isEmpty()) { + itemBatchQuery.execute(connection); + } - BatchSqlQuery propertyBatchQuery = new BatchSqlQuery(database); - for (Map.Entry> propertyEntry : record.getProperties().entrySet()) { - for (String propertyValue : propertyEntry.getValue()) { - SingleSqlQuery propertyQuery = RAuditPropertyValue.toRepo( - id, propertyEntry.getKey(), RUtil.trimString(propertyValue, AuditService.MAX_PROPERTY_SIZE)); + BatchSqlQuery propertyBatchQuery = new BatchSqlQuery(database); + for (Entry> propertyEntry : record.getProperties().entrySet()) { + for (String propertyValue : propertyEntry.getValue()) { + SingleSqlQuery propertyQuery = RAuditPropertyValue.toRepo( + id, propertyEntry.getKey(), RUtil.trimString(propertyValue, AuditService.MAX_PROPERTY_SIZE)); // val.setTransient(isTransient); - propertyBatchQuery.addQueryForBatch(propertyQuery); - } - } - if(!propertyBatchQuery.isEmpty()) { - propertyBatchQuery.execute(connection); + propertyBatchQuery.addQueryForBatch(propertyQuery); } + } + if (!propertyBatchQuery.isEmpty()) { + propertyBatchQuery.execute(connection); + } - BatchSqlQuery referenceBatchQuery = new BatchSqlQuery(database); - for (Map.Entry> referenceEntry : record.getReferences().entrySet()) { - for (AuditReferenceValue referenceValue : referenceEntry.getValue()) { - SingleSqlQuery referenceQuery = RAuditReferenceValue.toRepo(id, referenceEntry.getKey(), referenceValue); + BatchSqlQuery referenceBatchQuery = new BatchSqlQuery(database); + for (Entry> referenceEntry : record.getReferences().entrySet()) { + for (AuditReferenceValue referenceValue : referenceEntry.getValue()) { + SingleSqlQuery referenceQuery = RAuditReferenceValue.toRepo(id, referenceEntry.getKey(), referenceValue); // val.setTransient(isTransient); - referenceBatchQuery.addQueryForBatch(referenceQuery); - } - } - if(!referenceBatchQuery.isEmpty()) { - referenceBatchQuery.execute(connection); + referenceBatchQuery.addQueryForBatch(referenceQuery); } + } + if (!referenceBatchQuery.isEmpty()) { + referenceBatchQuery.execute(connection); + } - BatchSqlQuery resourceOidBatchQuery = new BatchSqlQuery(database); - for (String resourceOid : record.getResourceOids()) { - SingleSqlQuery resourceOidQuery = RTargetResourceOid.toRepo(id, resourceOid); - resourceOidBatchQuery.addQueryForBatch(resourceOidQuery); - } - if(!resourceOidBatchQuery.isEmpty()) { - resourceOidBatchQuery.execute(connection); - } + BatchSqlQuery resourceOidBatchQuery = new BatchSqlQuery(database); + for (String resourceOid : record.getResourceOids()) { + SingleSqlQuery resourceOidQuery = RTargetResourceOid.toRepo(id, resourceOid); + resourceOidBatchQuery.addQueryForBatch(resourceOidQuery); + } + if (!resourceOidBatchQuery.isEmpty()) { + resourceOidBatchQuery.execute(connection); } }); @@ -757,12 +655,10 @@ private void checkTemporaryTablesSupport(Dialect dialect) { // deletes one batch of records (using recordsSelector to select records according to particular cleanup policy) private int batchDeletionAttempt(BiFunction recordsSelector, Holder totalCountHolder, - long batchStart, Dialect dialect, OperationResult subResult) { + long batchStart, Dialect dialect, OperationResult subResult) { - Session session = null; + Session session = baseHelper.beginTransaction(); try { - session = baseHelper.beginTransaction(); - TemporaryTableDialect ttDialect = TemporaryTableDialect.getTempTableDialect(dialect); // create temporary table @@ -790,11 +686,10 @@ private int batchDeletionAttempt(BiFunction recordsSel // drop temporary table if (ttDialect.dropTemporaryTableAfterUse()) { LOGGER.debug("Dropping temporary table."); - StringBuilder sb = new StringBuilder(); - sb.append(ttDialect.getDropTemporaryTableString()); - sb.append(' ').append(tempTable); - session.createNativeQuery(sb.toString()).executeUpdate(); + String sb = ttDialect.getDropTemporaryTableString() + + ' ' + tempTable; + session.createNativeQuery(sb).executeUpdate(); } session.getTransaction().commit(); @@ -817,10 +712,8 @@ private int selectRecordsByMaxAge(Session session, String tempTable, Date minVal // fill temporary table, we don't need to join task on object on // container, oid and id is already in task table - StringBuilder selectSB = new StringBuilder(); - selectSB.append("select a.id as id from ").append(RAuditEventRecord.TABLE_NAME).append(" a"); - selectSB.append(" where a.").append(RAuditEventRecord.COLUMN_TIMESTAMP).append(" < ###TIME###"); - String selectString = selectSB.toString(); + String selectString = "select a.id as id from " + RAuditEventRecord.TABLE_NAME + " a" + + " where a." + RAuditEventRecord.COLUMN_TIMESTAMP + " < ###TIME###"; // batch size RowSelection rowSelection = new RowSelection(); @@ -861,10 +754,8 @@ private int selectRecordsByNumberToKeep(Session session, String tempTable, Integ return 0; } - StringBuilder selectSB = new StringBuilder(); - selectSB.append("select a.id as id from ").append(RAuditEventRecord.TABLE_NAME).append(" a"); - selectSB.append(" order by a.").append(RAuditEventRecord.COLUMN_TIMESTAMP).append(" asc"); - String selectString = selectSB.toString(); + String selectString = "select a.id as id from " + RAuditEventRecord.TABLE_NAME + " a" + + " order by a." + RAuditEventRecord.COLUMN_TIMESTAMP + " asc"; // batch size RowSelection rowSelection = new RowSelection(); @@ -881,10 +772,6 @@ private int selectRecordsByNumberToKeep(Session session, String tempTable, Integ /** * This method creates temporary table for cleanup audit method. - * - * @param session - * @param dialect - * @param tempTable */ private void createTemporaryTable(Session session, final Dialect dialect, final String tempTable) { session.doWork(connection -> { @@ -904,15 +791,12 @@ private void createTemporaryTable(Session session, final Dialect dialect, final TemporaryTableDialect ttDialect = TemporaryTableDialect.getTempTableDialect(dialect); - StringBuilder sb = new StringBuilder(); - sb.append(ttDialect.getCreateTemporaryTableString()); - sb.append(' ').append(tempTable).append(" (id "); - sb.append(dialect.getTypeName(Types.BIGINT)); - sb.append(" not null)"); - sb.append(ttDialect.getCreateTemporaryTablePostfix()); - Statement s = connection.createStatement(); - s.execute(sb.toString()); + s.execute(ttDialect.getCreateTemporaryTableString() + + ' ' + tempTable + " (id " + + dialect.getTypeName(Types.BIGINT) + + " not null)" + + ttDialect.getCreateTemporaryTablePostfix()); s.close(); }); } @@ -938,60 +822,43 @@ private String createDeleteQueryAsJoinPostgreSQL(String objectTable, String temp } private String createDeleteQueryAsSubquery(String objectTable, String tempTable, String idColumnName) { - StringBuilder sb = new StringBuilder(); - sb.append("delete from ").append(objectTable); - sb.append(" where ").append(idColumnName).append(" in (select id from ").append(tempTable) - .append(')'); - - return sb.toString(); + return "delete from " + objectTable + + " where " + idColumnName + " in (select id from " + tempTable + + ')'; } public long countObjects(String query, Map params) { - Session session = null; - long[] count = {0}; + long[] count = { 0 }; + Session session = baseHelper.beginTransaction(); try { - session = baseHelper.beginTransaction(); session.setFlushMode(FlushMode.MANUAL); -// Query q = session.createQuery(query); - session.doWork(new Work() { - - @Override - public void execute(Connection connection) throws SQLException { - Database database = getConfiguration().getDatabase(); - - String basicQuery = query; - if (StringUtils.isBlank(query)) { - basicQuery = "select count (*) from m_audit_event " - + (database.equals(Database.ORACLE) ? "" : "as ") - + "aer where 1 = 1"; - } - SelectQueryBuilder queryBuilder = new SelectQueryBuilder(database, basicQuery); - setParametersToQuery(queryBuilder, params); + session.doWork(connection -> { + Database database = getConfiguration().getDatabase(); + + String basicQuery = query; + if (StringUtils.isBlank(query)) { + basicQuery = "select count(*) from m_audit_event " + + (database.equals(Database.ORACLE) ? "" : "as ") + + "aer where 1 = 1"; + } + SelectQueryBuilder queryBuilder = new SelectQueryBuilder(database, basicQuery); + setParametersToQuery(queryBuilder, params); - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("List records attempt\n processed query: {}", queryBuilder); - } + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("List records attempt\n processed query: {}", queryBuilder); + } - PreparedStatement stmt = queryBuilder.build().createPreparedStatement(connection); - try { - ResultSet resultList = stmt.executeQuery(); - if(!resultList.next()) { - throw new IllegalArgumentException("Result set don't have value for select: " + query); - } - if(resultList.getMetaData().getColumnCount() > 1) { - throw new IllegalArgumentException("Result have more as one value for select: " + query); - } - count[0] = resultList.getLong(1); - } finally { - stmt.close(); + try (PreparedStatement stmt = queryBuilder.build().createPreparedStatement(connection)) { + ResultSet resultList = stmt.executeQuery(); + if (!resultList.next()) { + throw new IllegalArgumentException("Result set don't have value for select: " + query); } - + if (resultList.getMetaData().getColumnCount() > 1) { + throw new IllegalArgumentException("Result have more as one value for select: " + query); + } + count[0] = resultList.getLong(1); } }); - -// setParametersToQuery(q, params); -// Number numberCount = (Number) q.uniqueResult(); -// count = numberCount != null ? numberCount.intValue() : 0; } catch (RuntimeException ex) { baseHelper.handleGeneralRuntimeException(ex, session, null); } finally { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java index 12aec8e13b7..17192aa3255 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java @@ -7,6 +7,14 @@ package com.evolveum.midpoint.repo.sql.data.audit; +import static com.evolveum.midpoint.repo.sql.data.audit.RObjectDeltaOperation.COLUMN_RECORD_ID; + +import java.sql.ResultSet; +import javax.persistence.*; + +import org.hibernate.annotations.ForeignKey; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.polystring.PolyString; @@ -28,17 +36,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType; import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; -import org.hibernate.annotations.ForeignKey; - -import javax.persistence.*; - -import static com.evolveum.midpoint.repo.sql.data.audit.RObjectDeltaOperation.COLUMN_RECORD_ID; - -import java.sql.ResultSet; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - /** * @author lazyman */ @@ -46,7 +43,7 @@ @Entity @IdClass(RObjectDeltaOperationId.class) @Table(name = RObjectDeltaOperation.TABLE_NAME, indexes = { - @Index(name = "iAuditDeltaRecordId", columnList = COLUMN_RECORD_ID)}) + @Index(name = "iAuditDeltaRecordId", columnList = COLUMN_RECORD_ID) }) public class RObjectDeltaOperation implements OperationResultFull, EntityState { private static final long serialVersionUID = -1065600513263271161L; @@ -86,7 +83,6 @@ public class RObjectDeltaOperation implements OperationResultFull, EntityState { private String resourceOid; private RPolyString resourceName; - @ForeignKey(name = "none") @MapsId("record") @ManyToOne(fetch = FetchType.LAZY) @@ -265,7 +261,7 @@ public int hashCode() { } public static RObjectDeltaOperation toRepo(RAuditEventRecord record, ObjectDeltaOperation operation, - PrismContext prismContext) throws DtoTranslationException { + PrismContext prismContext) throws DtoTranslationException { RObjectDeltaOperation auditDelta = new RObjectDeltaOperation(); auditDelta.setRecord(record); @@ -294,7 +290,6 @@ public static RObjectDeltaOperation toRepo(RAuditEventRecord record, ObjectDelta throw new DtoTranslationException(ex.getMessage(), ex); } - return auditDelta; } @@ -339,7 +334,7 @@ public static SingleSqlQuery toRepo(Long recordId, ObjectDeltaOperation operatio queryBuilder.addNullParameter(STATUS_COLUMN_NAME); queryBuilder.addNullParameter(FULL_RESULT_COLUMN_NAME); } - if(operation.getObjectName() != null) { + if (operation.getObjectName() != null) { queryBuilder.addParameter(OBJECT_NAME_ORIG_COLUMN_NAME, operation.getObjectName().getOrig()); queryBuilder.addParameter(OBJECT_NAME_NORM_COLUMN_NAME, operation.getObjectName().getNorm()); } else { @@ -347,7 +342,7 @@ public static SingleSqlQuery toRepo(Long recordId, ObjectDeltaOperation operatio queryBuilder.addNullParameter(OBJECT_NAME_NORM_COLUMN_NAME); } queryBuilder.addParameter(RESOURCE_OID_COLUMN_NAME, operation.getResourceOid()); - if(operation.getResourceName() != null) { + if (operation.getResourceName() != null) { queryBuilder.addParameter(RESOURCE_NAME_ORIG_COLUMN_NAME, operation.getResourceName().getOrig()); queryBuilder.addParameter(RESOURCE_NAME_NORM_COLUMN_NAME, operation.getResourceName().getNorm()); } else { @@ -359,10 +354,10 @@ public static SingleSqlQuery toRepo(Long recordId, ObjectDeltaOperation operatio throw new DtoTranslationException(ex.getMessage(), ex); } - return queryBuilder.build(); } + @NotNull public static ObjectDeltaOperation fromRepo(RObjectDeltaOperation operation, PrismContext prismContext, boolean useUtf16) throws DtoTranslationException { @@ -392,6 +387,7 @@ public static ObjectDeltaOperation fromRepo(RObjectDeltaOperation operation, Pri return odo; } + @NotNull public static ObjectDeltaOperation fromRepo(ResultSet resultSet, PrismContext prismContext, boolean useUtf16) throws DtoTranslationException { @@ -411,11 +407,11 @@ public static ObjectDeltaOperation fromRepo(ResultSet resultSet, PrismContext pr OperationResultType resultType = prismContext.parserFor(xmlResult).parseRealValue(OperationResultType.class); odo.setExecutionResult(OperationResult.createOperationResult(resultType)); } - if(resultSet.getString(OBJECT_NAME_ORIG_COLUMN_NAME) != null || resultSet.getString(OBJECT_NAME_NORM_COLUMN_NAME) != null) { + if (resultSet.getString(OBJECT_NAME_ORIG_COLUMN_NAME) != null || resultSet.getString(OBJECT_NAME_NORM_COLUMN_NAME) != null) { odo.setObjectName(new PolyString(resultSet.getString(OBJECT_NAME_ORIG_COLUMN_NAME), resultSet.getString(OBJECT_NAME_NORM_COLUMN_NAME))); } odo.setResourceOid(resultSet.getString(RESOURCE_OID_COLUMN_NAME)); - if(resultSet.getString(RESOURCE_NAME_ORIG_COLUMN_NAME) != null || resultSet.getString(RESOURCE_NAME_NORM_COLUMN_NAME) != null) { + if (resultSet.getString(RESOURCE_NAME_ORIG_COLUMN_NAME) != null || resultSet.getString(RESOURCE_NAME_NORM_COLUMN_NAME) != null) { odo.setResourceName(new PolyString(resultSet.getString(RESOURCE_NAME_ORIG_COLUMN_NAME), resultSet.getString(RESOURCE_NAME_NORM_COLUMN_NAME))); } } catch (Exception ex) { @@ -424,5 +420,4 @@ public static ObjectDeltaOperation fromRepo(ResultSet resultSet, PrismContext pr return odo; } - }