Index: modules/ejbca-entity/src-cli/org/ejbca/database/audit/IntegrityProtectedAuditReader.java =================================================================== --- modules/ejbca-entity/src-cli/org/ejbca/database/audit/IntegrityProtectedAuditReader.java (revision 12892) +++ modules/ejbca-entity/src-cli/org/ejbca/database/audit/IntegrityProtectedAuditReader.java (working copy) @@ -27,7 +27,9 @@ import org.cesecore.audit.impl.integrityprotected.AuditRecordData; import org.cesecore.config.ConfigurationHolder; import org.cesecore.dbprotection.DatabaseProtectionError; -import org.cesecore.util.QueryCriteria; +import org.cesecore.util.query.Criteria; +import org.cesecore.util.query.QueryCriteria; +import org.cesecore.util.query.QueryGenerator; /** * Verification of audit logs with direct database access. @@ -94,10 +96,13 @@ final List ret = new ArrayList(); int errorCount = 0; if (nodes.size()>currentNodeIndex) { - final QueryCriteria queryCriteria = QueryCriteria.where().eq(AuditLogEntry.FIELD_NODEID, nodes.get(currentNodeIndex)) - .and().geq(AuditLogEntry.FIELD_TIMESTAMP, timestampFrom) - .and().leq(AuditLogEntry.FIELD_TIMESTAMP, timestampTo) - .order(AuditLogEntry.FIELD_SEQENCENUMBER, QueryCriteria.ORDER_ASC); + final QueryCriteria queryCriteria = QueryCriteria + .create() + .add(Criteria.and( + Criteria.eq(AuditLogEntry.FIELD_NODEID, nodes.get(currentNodeIndex)), + Criteria.and(Criteria.geq(AuditLogEntry.FIELD_TIMESTAMP, timestampFrom), + Criteria.leq(AuditLogEntry.FIELD_TIMESTAMP, timestampTo)))) + .add(Criteria.orderAsc(AuditLogEntry.FIELD_SEQENCENUMBER)); try { final List tList = internalSelectAuditLogs(startIndex, maxFetchSize, queryCriteria); for (final AuditRecordData auditRecordData : tList) { @@ -208,9 +213,12 @@ if (criteria == null) { query = entityManager.createQuery(queryStr); } else { - query = entityManager.createQuery(queryStr + criteria.conditions(AuditRecordData.class)); - for (final String key : criteria.getParameterKeys()) { - query.setParameter(key, criteria.getParameterValue(key)); + QueryGenerator generator = QueryGenerator.generator(AuditRecordData.class, criteria, "a"); + final String conditions = generator.generate(); + query = entityManager.createQuery(queryStr + conditions); + for (final String key : generator.getParameterKeys()) { + final Object param = generator.getParameterValue(key); + query.setParameter(key, param); } } if (resultLimit > 0) { Index: modules/ejbca-ejb/src-test/org/cesecore/util/QueryCriteriaTest.java =================================================================== --- modules/ejbca-ejb/src-test/org/cesecore/util/QueryCriteriaTest.java (revision 12892) +++ modules/ejbca-ejb/src-test/org/cesecore/util/QueryCriteriaTest.java (working copy) @@ -12,10 +12,15 @@ *************************************************************************/ package org.cesecore.util; +import java.util.Date; import java.util.Iterator; import junit.framework.Assert; +import org.cesecore.audit.impl.integrityprotected.AuditRecordData; +import org.cesecore.util.query.Criteria; +import org.cesecore.util.query.QueryCriteria; +import org.cesecore.util.query.QueryGenerator; import org.junit.Test; /** @@ -39,155 +44,212 @@ int field2; } - /** Test the ability to detect if valid parameters are used. */ - @Test - public void testBadParameterQuery() { - try { - QueryCriteria.where().eq(FakeEntity.FIELDNAME1, "value").conditions(FakeEntity.class); - } catch (QueryParameterException e) { - Assert.fail("QueryCriteria unable to detect existing field."); - } - try { - QueryCriteria.where().eq("invalidParameterName", "value").conditions(FakeEntity.class); - Assert.fail("QueryCriteria unable to detect non-existing field."); - } catch (QueryParameterException e) { - // Expected - } - } + /** Test the ability to detect if valid parameters are used. */ + @Test + public void testBadParameterQuery() { + try { + QueryCriteria criteria = QueryCriteria.create().add(Criteria.eq(FakeEntity.FIELDNAME1, "value")); + QueryGenerator.generator(FakeEntity.class, criteria, "a").generate(); + } catch (QueryParameterException e) { + System.out.println(e.getMessage()); + Assert.fail("QueryCriteria unable to detect existing field."); + } + try { + QueryCriteria criteria = QueryCriteria.create().add(Criteria.eq("invalidParameterName", "value")); + QueryGenerator.generator(FakeEntity.class, criteria, "a").generate(); + Assert.fail("QueryCriteria unable to detect non-existing field."); + } catch (QueryParameterException e) { + // Expected + } + } - @Test - public void testBasicQuery() { - // This is the behavior.. perhaps it would be better to not return the "WHERE" clause when no parameters are present.. - final QueryCriteria qc = QueryCriteria.where(); - Assert.assertEquals(BAD_QUERY_GENERATED, "", qc.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, qc.getParameterKeys().size()); - } + @Test + public void testBasicQuery() { + // This is the behavior.. perhaps it would be better to not return the "WHERE" clause when no parameters are present.. + final QueryCriteria qc = QueryCriteria.create(); + QueryGenerator generator = QueryGenerator.generator(FakeEntity.class, qc, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, "", generator.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, generator.getParameterKeys().size()); + } - @Test - public void testBasicQueryEqual() { - final QueryCriteria qc1 = QueryCriteria.where().eq(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 = :field10", qc1.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, qc1.getParameterKeys().size()); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, qc1.getParameterValue(qc1.getParameterKeys().iterator().next())); - final QueryCriteria qc2 = QueryCriteria.where().eq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 = :field20", qc2.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, qc2.getParameterKeys().size()); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, qc2.getParameterValue(qc2.getParameterKeys().iterator().next())); - } + @Test + public void testBasicQueryEqual() { + final QueryCriteria qc1 = QueryCriteria.create().add(Criteria.eq(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1)); + QueryGenerator generator1 = QueryGenerator.generator(FakeEntity.class, qc1, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 = :field10", generator1.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, generator1.getParameterKeys().size()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, generator1.getParameterValue(generator1.getParameterKeys().iterator().next())); + final QueryCriteria qc2 = QueryCriteria.create().add(Criteria.eq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1)); + QueryGenerator generator2 = QueryGenerator.generator(FakeEntity.class, qc2, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 = :field20", generator2.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, generator2.getParameterKeys().size()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, generator2.getParameterValue(generator2.getParameterKeys().iterator().next())); + } - @Test - public void testBasicQueryGreaterOrEqual() { - final QueryCriteria qc = QueryCriteria.where().geq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 >= :field20", qc.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, qc.getParameterKeys().size()); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, qc.getParameterValue(qc.getParameterKeys().iterator().next())); - } + @Test + public void testBasicQueryGreaterOrEqual() { + final QueryCriteria qc = QueryCriteria.create().add(Criteria.geq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1)); + QueryGenerator generator = QueryGenerator.generator(FakeEntity.class, qc, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 >= :field20", generator.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, generator.getParameterKeys().size()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, generator.getParameterValue(generator.getParameterKeys().iterator().next())); + } - @Test - public void testBasicQueryLessOrEqual() { - final QueryCriteria qc = QueryCriteria.where().leq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 <= :field20", qc.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, qc.getParameterKeys().size()); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, qc.getParameterValue(qc.getParameterKeys().iterator().next())); - } + @Test + public void testBasicQueryLessOrEqual() { + final QueryCriteria qc = QueryCriteria.create().add(Criteria.leq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1)); + QueryGenerator generator = QueryGenerator.generator(FakeEntity.class, qc, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 <= :field20", generator.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, generator.getParameterKeys().size()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, generator.getParameterValue(generator.getParameterKeys().iterator().next())); + } - @Test - public void testBasicQueryBetween() { - final QueryCriteria qc1 = QueryCriteria.where().between(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1, DUMMY_VALUE_STR2); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 BETWEEN :field10 AND :field11", qc1.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 2, qc1.getParameterKeys().size()); - final Iterator i1 = qc1.getParameterKeys().iterator(); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, qc1.getParameterValue(i1.next())); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR2, qc1.getParameterValue(i1.next())); - final QueryCriteria qc2 = QueryCriteria.where().between(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1, DUMMY_VALUE_INT2); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 BETWEEN :field20 AND :field21", qc2.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 2, qc2.getParameterKeys().size()); - final Iterator i2 = qc2.getParameterKeys().iterator(); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, qc2.getParameterValue(i2.next())); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT2, qc2.getParameterValue(i2.next())); - } + @Test + public void testBasicQueryBetween() { + final QueryCriteria qc1 = QueryCriteria.create().add(Criteria.between(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1, DUMMY_VALUE_STR2)); + QueryGenerator generator1 = QueryGenerator.generator(FakeEntity.class, qc1, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 BETWEEN :field10 AND :field11", generator1.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 2, generator1.getParameterKeys().size()); + final Iterator i1 = generator1.getParameterKeys().iterator(); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, generator1.getParameterValue(i1.next())); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR2, generator1.getParameterValue(i1.next())); + final QueryCriteria qc2 = QueryCriteria.create().add(Criteria.between(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1, DUMMY_VALUE_INT2)); + QueryGenerator generator2 = QueryGenerator.generator(FakeEntity.class, qc2, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 BETWEEN :field20 AND :field21", generator2.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 2, generator2.getParameterKeys().size()); + final Iterator i2 = generator2.getParameterKeys().iterator(); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, generator2.getParameterValue(i2.next())); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT2, generator2.getParameterValue(i2.next())); + } - @Test - public void testBasicQueryLike() { - final QueryCriteria qc = QueryCriteria.where().like(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 LIKE :field10", qc.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, qc.getParameterKeys().size()); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, qc.getParameterValue(qc.getParameterKeys().iterator().next())); - } + @Test + public void testBasicQueryLike() { + final QueryCriteria qc = QueryCriteria.create().add(Criteria.like(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1)); + QueryGenerator generator = QueryGenerator.generator(FakeEntity.class, qc, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 LIKE :field10", generator.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, generator.getParameterKeys().size()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, generator.getParameterValue(generator.getParameterKeys().iterator().next())); + } - @Test - public void testBasicQueryLess() { - final QueryCriteria qc = QueryCriteria.where().lsr(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 < :field20", qc.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, qc.getParameterKeys().size()); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, qc.getParameterValue(qc.getParameterKeys().iterator().next())); - } + @Test + public void testBasicQueryLess() { + final QueryCriteria qc = QueryCriteria.create().add(Criteria.lsr(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1)); + QueryGenerator generator = QueryGenerator.generator(FakeEntity.class, qc, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 < :field20", generator.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, generator.getParameterKeys().size()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, generator.getParameterValue(generator.getParameterKeys().iterator().next())); + } - @Test - public void testBasicQueryGreater() { - final QueryCriteria qc = QueryCriteria.where().grt(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 > :field20", qc.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, qc.getParameterKeys().size()); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, qc.getParameterValue(qc.getParameterKeys().iterator().next())); - } + @Test + public void testBasicQueryGreater() { + final QueryCriteria qc = QueryCriteria.create().add(Criteria.grt(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1)); + QueryGenerator generator = QueryGenerator.generator(FakeEntity.class, qc, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 > :field20", generator.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, generator.getParameterKeys().size()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, generator.getParameterValue(generator.getParameterKeys().iterator().next())); + } - @Test - public void testBasicQueryNotEqual() { - final QueryCriteria qc1 = QueryCriteria.where(); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 != :field10", qc1.neq(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1).conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, qc1.getParameterKeys().size()); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, qc1.getParameterValue(qc1.getParameterKeys().iterator().next())); - final QueryCriteria qc2 = QueryCriteria.where(); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 != :field20", qc2.neq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1).conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, qc2.getParameterKeys().size()); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, qc2.getParameterValue(qc2.getParameterKeys().iterator().next())); - } + @Test + public void testBasicQueryNotEqual() { + final QueryCriteria qc1 = QueryCriteria.create().add(Criteria.neq(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1)); + QueryGenerator generator1 = QueryGenerator.generator(FakeEntity.class, qc1, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 != :field10", generator1.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, generator1.getParameterKeys().size()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, generator1.getParameterValue(generator1.getParameterKeys().iterator().next())); + final QueryCriteria qc2 = QueryCriteria.create().add(Criteria.neq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1)); + QueryGenerator generator2 = QueryGenerator.generator(FakeEntity.class, qc2, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 != :field20", generator2.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 1, generator2.getParameterKeys().size()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, generator2.getParameterValue(generator2.getParameterKeys().iterator().next())); + } - @Test - public void testBasicQueryNotNull() { - final QueryCriteria qc1 = QueryCriteria.where().isNotNull(FakeEntity.FIELDNAME1); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 IS NOT NULL", qc1.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, qc1.getParameterKeys().size()); - final QueryCriteria qc2 = QueryCriteria.where().isNotNull(FakeEntity.FIELDNAME2); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 IS NOT NULL", qc2.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, qc2.getParameterKeys().size()); - } + @Test + public void testBasicQueryNotNull() { + final QueryCriteria qc1 = QueryCriteria.create().add(Criteria.isNotNull(FakeEntity.FIELDNAME1)); + QueryGenerator generator1 = QueryGenerator.generator(FakeEntity.class, qc1, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 IS NOT NULL", generator1.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, generator1.getParameterKeys().size()); + final QueryCriteria qc2 = QueryCriteria.create().add(Criteria.isNotNull(FakeEntity.FIELDNAME2)); + QueryGenerator generator2 = QueryGenerator.generator(FakeEntity.class, qc2, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 IS NOT NULL", generator2.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, generator2.getParameterKeys().size()); + } - @Test - public void testBasicQueryNull() { - final QueryCriteria qc1 = QueryCriteria.where().isNull(FakeEntity.FIELDNAME1); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 IS NULL", qc1.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, qc1.getParameterKeys().size()); - final QueryCriteria qc2 = QueryCriteria.where().isNull(FakeEntity.FIELDNAME2); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 IS NULL", qc2.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, qc2.getParameterKeys().size()); - } + @Test + public void testBasicQueryNull() { + final QueryCriteria qc1 = QueryCriteria.create().add(Criteria.isNull(FakeEntity.FIELDNAME1)); + QueryGenerator generator1 = QueryGenerator.generator(FakeEntity.class, qc1, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 IS NULL", generator1.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, generator1.getParameterKeys().size()); + final QueryCriteria qc2 = QueryCriteria.create().add(Criteria.isNull(FakeEntity.FIELDNAME2)); + QueryGenerator generator2 = QueryGenerator.generator(FakeEntity.class, qc2, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field2 IS NULL", generator2.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, generator2.getParameterKeys().size()); + } - @Test - public void testCombinedQueryEqual() { - // Or - final QueryCriteria qc1 = QueryCriteria.where().eq(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1).or().eq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 = :field10 OR a.field2 = :field20", qc1.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 2, qc1.getParameterKeys().size()); - final Iterator i1 = qc1.getParameterKeys().iterator(); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, qc1.getParameterValue(i1.next())); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, qc1.getParameterValue(i1.next())); - // And - final QueryCriteria qc2 = QueryCriteria.where().eq(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1).and().eq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 = :field10 AND a.field2 = :field20", qc2.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 2, qc2.getParameterKeys().size()); - final Iterator i2 = qc2.getParameterKeys().iterator(); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, qc2.getParameterValue(i2.next())); - Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, qc2.getParameterValue(i2.next())); - } + @Test + public void testCombinedQueryEqual() { + // Or + final QueryCriteria qc1 = QueryCriteria.create().add(Criteria.or(Criteria.eq(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1),Criteria.eq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1))); + QueryGenerator generator1 = QueryGenerator.generator(FakeEntity.class, qc1, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 = :field10 OR a.field2 = :field20", generator1.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 2, generator1.getParameterKeys().size()); + final Iterator i1 = generator1.getParameterKeys().iterator(); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, generator1.getParameterValue(i1.next())); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, generator1.getParameterValue(i1.next())); + // And + final QueryCriteria qc2 = QueryCriteria.create().add(Criteria.and(Criteria.eq(FakeEntity.FIELDNAME1, DUMMY_VALUE_STR1), Criteria.eq(FakeEntity.FIELDNAME2, DUMMY_VALUE_INT1))); + QueryGenerator generator2 = QueryGenerator.generator(FakeEntity.class, qc2, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 = :field10 AND a.field2 = :field20", generator2.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 2, generator2.getParameterKeys().size()); + final Iterator i2 = generator2.getParameterKeys().iterator(); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_STR1, generator2.getParameterValue(i2.next())); + Assert.assertEquals(BAD_QUERY_PARAMTERS, DUMMY_VALUE_INT1, generator2.getParameterValue(i2.next())); + } - @Test - public void testBasicQueryOrder() { - final QueryCriteria qc1 = QueryCriteria.where().isNull(FakeEntity.FIELDNAME1).order(FakeEntity.FIELDNAME2, QueryCriteria.ORDER_ASC); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 IS NULL ORDER BY a.field2 ASC", qc1.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, qc1.getParameterKeys().size()); - final QueryCriteria qc2 = QueryCriteria.where().isNull(FakeEntity.FIELDNAME1).order(FakeEntity.FIELDNAME2, QueryCriteria.ORDER_DESC); - Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 IS NULL ORDER BY a.field2 DESC", qc2.conditions(FakeEntity.class)); - Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, qc2.getParameterKeys().size()); - } + @Test + public void testBasicQueryOrder() { + final QueryCriteria qc1 = QueryCriteria.create().add(Criteria.isNull(FakeEntity.FIELDNAME1)).add(Criteria.orderAsc(FakeEntity.FIELDNAME2)); + QueryGenerator generator1 = QueryGenerator.generator(FakeEntity.class, qc1, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 IS NULL ORDER BY a.field2 ASC", generator1.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, generator1.getParameterKeys().size()); + final QueryCriteria qc2 = QueryCriteria.create().add(Criteria.isNull(FakeEntity.FIELDNAME1)).add(Criteria.orderDesc(FakeEntity.FIELDNAME2)); + QueryGenerator generator2 = QueryGenerator.generator(FakeEntity.class, qc2, "a"); + Assert.assertEquals(BAD_QUERY_GENERATED, " WHERE a.field1 IS NULL ORDER BY a.field2 DESC", generator2.generate()); + Assert.assertEquals(BAD_QUERY_PARAMTERS, 0, generator2.getParameterKeys().size()); + } + + @Test + public void testAuditorQuery() { + final Date timestamp = new Date(); + final String nodeId = "localhost"; + final QueryCriteria queryCriteria = QueryCriteria.create().add(Criteria.eq("nodeId", nodeId)).add(Criteria.leq("timeStamp", timestamp.getTime())).add(Criteria.orderAsc("sequenceNumber")); + final QueryGenerator generator = QueryGenerator.generator(AuditRecordData.class, queryCriteria, "a"); + final String query = generator.generate(); + Assert.assertEquals("Wrong query generated", " WHERE a.nodeId = :nodeId0 AND a.timeStamp <= :timeStamp0 ORDER BY a.sequenceNumber ASC", query); + // Make sure we get the same query if we generate again using the same criteria + final QueryGenerator generator1 = QueryGenerator.generator(AuditRecordData.class, queryCriteria, "a"); + final String query1 = generator1.generate(); + Assert.assertEquals("Wrong query generated", " WHERE a.nodeId = :nodeId0 AND a.timeStamp <= :timeStamp0 ORDER BY a.sequenceNumber ASC", query1); + + final QueryCriteria queryCriteria2 = QueryCriteria.create().add(Criteria.leq("timeStamp", timestamp.getTime())).add(Criteria.orderAsc("sequenceNumber")); + final QueryGenerator generator2 = QueryGenerator.generator(AuditRecordData.class, queryCriteria2, "a"); + final String query2 = generator2.generate(); + Assert.assertEquals("Wrong query generated", " WHERE a.timeStamp <= :timeStamp0 ORDER BY a.sequenceNumber ASC", query2); + // Make sure we get the same query if we generate again using the same criteria + final QueryGenerator generator3 = QueryGenerator.generator(AuditRecordData.class, queryCriteria2, "a"); + final String query3 = generator3.generate(); + Assert.assertEquals("Wrong query generated", " WHERE a.timeStamp <= :timeStamp0 ORDER BY a.sequenceNumber ASC", query3); + } + + @Test + public void testAttributeValidation() { + try { + ; + QueryGenerator.generator(FakeEntity.class, QueryCriteria.create().add(Criteria.isNull("eventType IS NOT NULL or 1=1")), "a").generate(); + Assert.fail("attribute validation should throw exception"); + } catch (QueryParameterException e) { + //Expected + } + } } Index: modules/ejbca-ejb-interface/src/org/cesecore/audit/audit/SecurityEventsAuditorSession.java =================================================================== --- modules/ejbca-ejb-interface/src/org/cesecore/audit/audit/SecurityEventsAuditorSession.java (revision 12892) +++ modules/ejbca-ejb-interface/src/org/cesecore/audit/audit/SecurityEventsAuditorSession.java (working copy) @@ -22,7 +22,7 @@ import org.cesecore.authentication.tokens.AuthenticationToken; import org.cesecore.authorization.AuthorizationDeniedException; import org.cesecore.keys.token.CryptoToken; -import org.cesecore.util.QueryCriteria; +import org.cesecore.util.query.QueryCriteria; /** * Allows auditing of securely logged events. Index: modules/systemtests/src-test/org/cesecore/audit/SecurityEventsAuditorSessionBeanTest.java =================================================================== --- modules/systemtests/src-test/org/cesecore/audit/SecurityEventsAuditorSessionBeanTest.java (revision 12892) +++ modules/systemtests/src-test/org/cesecore/audit/SecurityEventsAuditorSessionBeanTest.java (working copy) @@ -13,7 +13,6 @@ package org.cesecore.audit; import static junit.framework.Assert.assertTrue; -import static org.cesecore.util.QueryCriteria.where; import static org.junit.Assert.assertNotNull; import java.io.File; @@ -40,7 +39,8 @@ import org.cesecore.keys.util.KeyTools; import org.cesecore.util.CertTools; import org.cesecore.util.CryptoProviderTools; -import org.cesecore.util.QueryCriteria; +import org.cesecore.util.query.Criteria; +import org.cesecore.util.query.QueryCriteria; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -71,7 +71,7 @@ public void test02SelectLogsWithCriteria() throws AuthorizationDeniedException { for (final String logDeviceId : securityEventsAuditor.getQuerySupportingLogDevices()) { final List list = securityEventsAuditor.selectAuditLogs(roleMgmgToken, 1, 10, - where().eq(AuditLogEntry.FIELD_AUTHENTICATION_TOKEN, "userid"), logDeviceId); + QueryCriteria.create().add(Criteria.eq(AuditLogEntry.FIELD_AUTHENTICATION_TOKEN, "userid")), logDeviceId); assertTrue(list.size() >= 0); } } @@ -154,7 +154,7 @@ // SelectLogsWithNoCriteria try { securityEventsAuditor.selectAuditLogs(adminTokenNoAuth, 1, 10, - QueryCriteria.where().order(AuditLogEntry.FIELD_TIMESTAMP, QueryCriteria.ORDER_DESC), logDeviceId); + QueryCriteria.create().add(Criteria.orderDesc(AuditLogEntry.FIELD_TIMESTAMP)), logDeviceId); assertTrue("should throw", false); } catch (final AuthorizationDeniedException e) { // NOPMD Index: modules/systemtests/src-test/org/cesecore/audit/log/SecurityEventsLoggerSessionBeanTest.java =================================================================== --- modules/systemtests/src-test/org/cesecore/audit/log/SecurityEventsLoggerSessionBeanTest.java (revision 12892) +++ modules/systemtests/src-test/org/cesecore/audit/log/SecurityEventsLoggerSessionBeanTest.java (working copy) @@ -16,7 +16,6 @@ import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; -import static org.cesecore.util.QueryCriteria.where; import java.io.File; import java.security.KeyPair; @@ -56,6 +55,8 @@ import org.cesecore.keys.util.KeyTools; import org.cesecore.util.CertTools; import org.cesecore.util.CryptoProviderTools; +import org.cesecore.util.query.Criteria; +import org.cesecore.util.query.QueryCriteria; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -95,8 +96,9 @@ roleMgmgToken, 1, 10, - where().eq(AuditLogEntry.FIELD_EVENTTYPE, ExampleEnumEventTypes.NEW_EVENT_TYPE.toString()).or() - .eq(AuditLogEntry.FIELD_EVENTTYPE, ExampleClassEventTypes.NEW_EVENT_TYPE_CLASS.toString()), logDeviceId); + QueryCriteria.create().add(Criteria.or(Criteria.eq(AuditLogEntry.FIELD_EVENTTYPE, ExampleEnumEventTypes.NEW_EVENT_TYPE.toString()), + Criteria.eq(AuditLogEntry.FIELD_EVENTTYPE, ExampleClassEventTypes.NEW_EVENT_TYPE_CLASS.toString()))), + logDeviceId); assertEquals(2, lastSignedLogs.size()); for(AuditLogEntry ae: lastSignedLogs) { assertTrue(ae.getEventTypeValue().equals(ExampleEnumEventTypes.NEW_EVENT_TYPE) || @@ -189,7 +191,7 @@ } for (final String logDeviceId : securityEventsAuditor.getQuerySupportingLogDevices()) { final List list = securityEventsAuditor.selectAuditLogs(roleMgmgToken, 1, 10, - where().like(AuditLogEntry.FIELD_AUTHENTICATION_TOKEN, "TxFailureUser"), logDeviceId); + QueryCriteria.create().add(Criteria.like(AuditLogEntry.FIELD_AUTHENTICATION_TOKEN, "TxFailureUser")), logDeviceId); assertEquals("List size is:" + list.size(), 1, list.size()); } log.trace(" sortColumns = new ArrayList(); @@ -255,11 +257,11 @@ } public void setSortOrder(boolean sortOrder) { - this.sortOrder = sortOrder; + this.sortOrderDescending = sortOrder; } public boolean isSortOrder() { - return sortOrder; + return sortOrderDescending; } public void setConditionColumn(String conditionColumn) { @@ -346,15 +348,20 @@ if (log.isDebugEnabled()) { log.debug("Reloading audit load. selectedDevice=" + device); } - QueryCriteria criteria = QueryCriteria.where(); + QueryCriteria criteria = QueryCriteria.create(); boolean first = true; for (final AuditSearchCondition condition : getConditions()) { - if (!first) { + Method booleanOperator = null; + if (!first) { switch (condition.getOperation()) { case AND: - criteria = criteria.and(); break; + criteria = criteria.and(); + break; case OR: - criteria = criteria.or(); break; + criteria = criteria.or(); + break; + default: + break; } } first = false; @@ -387,7 +394,8 @@ AuthenticationToken token = new AlwaysAllowLocalAuthenticationToken(new UsernamePrincipal("Reload action from AuditorManagedBean")); try { - results = securityEventsAuditorSession.selectAuditLogs(token, startIndex, maxResults, criteria.order(sortColumn, sortOrder), device); + results = securityEventsAuditorSession.selectAuditLogs(token, startIndex, maxResults, + criteria.add((sortOrderDescending ? Criteria.orderDesc(sortColumn) : Criteria.orderAsc(sortColumn))), device); } catch (Exception e) { results.clear(); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Invalid search conditions.")); @@ -441,7 +449,7 @@ conditions.clear(); conditions.add(new AuditSearchCondition(AuditLogEntry.FIELD_SEARCHABLE_DETAIL2, Condition.EQUALS, searchDetail2String)); sortColumn = AuditLogEntry.FIELD_TIMESTAMP; - sortOrder = QueryCriteria.ORDER_DESC; + sortOrderDescending = QueryCriteria.ORDER_DESC; } return conditions; } @@ -496,10 +504,10 @@ reloadResultsNextView = true; } sortColumn = column; - if (sortOrder != orderAsc) { + if (sortOrderDescending != orderAsc) { reloadResultsNextView = true; } - sortOrder = orderAsc ? QueryCriteria.ORDER_ASC : QueryCriteria.ORDER_DESC; + sortOrderDescending = orderAsc ? QueryCriteria.ORDER_ASC : QueryCriteria.ORDER_DESC; } /** Index: src/java/org/ejbca/cesecoreintegration/QueuedAuditorMockSessionBean.java =================================================================== --- src/java/org/ejbca/cesecoreintegration/QueuedAuditorMockSessionBean.java (revision 12892) +++ src/java/org/ejbca/cesecoreintegration/QueuedAuditorMockSessionBean.java (working copy) @@ -29,7 +29,7 @@ import org.cesecore.audit.log.AuditLogResetException; import org.cesecore.authentication.tokens.AuthenticationToken; import org.cesecore.keys.token.CryptoToken; -import org.cesecore.util.QueryCriteria; +import org.cesecore.util.query.QueryCriteria; /** * Mock implementation of QueuedDevice interface to allow the secure audit code imported from Index: src/java/org/cesecore/util/QueryCriteria.java =================================================================== --- src/java/org/cesecore/util/QueryCriteria.java (revision 12892) +++ src/java/org/cesecore/util/QueryCriteria.java (working copy) @@ -1,204 +0,0 @@ -/************************************************************************* - * * - * CESeCore: CE Security Core * - * * - * This software is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public * - * License as published by the Free Software Foundation; either * - * version 2.1 of the License, or any later version. * - * * - * See terms of license at gnu.org. * - * * - *************************************************************************/ -package org.cesecore.util; - -import java.io.Serializable; -import java.lang.reflect.Field; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; - -/** - * Query Criteria DSL. - * - * There is no guarantee that this will contain a query that is nice to the database - * when sent from a third party. - * - * There is no support for prioritizing certain conditions using parenthesis. - * - * Example usage: - * String conditions = QueryCriteria.where().eq("columnName", value).order("anotherColumn", QueryCriteria.ORDER_ASC).conditions(ExampleData.class); - * List examples = entityManager.createQuery("SELECT a FROM ExampleData a" + conditions).getResultList(); - * - * Based on CESeCore version: - * QueryCriteria.java 930 2011-07-05 14:03:08Z johane - * - * @version $Id$ - */ -public class QueryCriteria implements Serializable { - - public static final boolean ORDER_ASC = true; - public static final boolean ORDER_DESC = false; - - private static final long serialVersionUID = -730792160188560822L; - - private final Map parameters = new LinkedHashMap(); - private final StringBuilder query = new StringBuilder(); - private final Set names = new HashSet(); - private boolean hasCondition = false; - - private QueryCriteria() { - } - - /** @return a new QueryCriteria */ - public static QueryCriteria where() { - return new QueryCriteria(); - } - - /** @return the query with an appended "equal to" condition */ - public QueryCriteria eq(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" = :").append(parameter); - return this; - } - - /** @return the query with an appended "not equal to" condition */ - public QueryCriteria neq(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" != :").append(parameter); - return this; - } - - /** @return the query with an appended "greater than or equal to" condition */ - public QueryCriteria geq(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" >= :").append(parameter); - return this; - } - - /** @return the query with an appended "greater than" condition */ - public QueryCriteria grt(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" > :").append(parameter); - return this; - } - - /** @return the query with an appended "less than or equal to" condition */ - public QueryCriteria leq(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" <= :").append(parameter); - return this; - } - - /** @return the query with an appended "less than to" condition */ - public QueryCriteria lsr(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" < :").append(parameter); - return this; - } - - /** @return the query with an appended "between" condition */ - public QueryCriteria between(final String name, final Object after, final Object before) { - hasCondition = true; - final String parameterAfter = genAndStoreParameter(name, after); - final String parameterBefore = genAndStoreParameter(name, before); - query.append(" a.").append(name).append(" BETWEEN :").append(parameterAfter).append(" AND :").append(parameterBefore); - return this; - } - - /** @return the query with an appended "like" condition */ - public QueryCriteria like(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" LIKE :").append(parameter); - return this; - } - - /** @return the query with an appended "is null" condition */ - public QueryCriteria isNull(final String name) { - hasCondition = true; - query.append(" a.").append(name).append(" IS NULL"); - return this; - } - - /** @return the query with an appended "is not null" condition */ - public QueryCriteria isNotNull(final String name) { - hasCondition = true; - query.append(" a.").append(name).append(" IS NOT NULL"); - return this; - } - - /** @return the query with an appended "and" condition */ - public QueryCriteria and() { - query.append(" AND"); - return this; - } - - /** @return the query with an appended "or" condition */ - public QueryCriteria or() { - query.append(" OR"); - return this; - } - - /** @return the query with an appended "ordering" condition. Use QueryCriteria.ORDER_ASC or QueryCriteria.ORDER_DESC. */ - public QueryCriteria order(final String name, final boolean ascending) { - query.append(" ORDER BY a.").append(name); - if (ascending) { - query.append(" ASC"); - } else { - query.append(" DESC"); - } - return this; - } - - /** @return the query as a String after validation of the fields of the supplied class. */ - public String conditions(final Class entity) { - for (final Field f : entity.getDeclaredFields()) { - names.remove(f.getName()); - } - if (!names.isEmpty()) { - final StringBuilder sb = new StringBuilder(); - for (final String name : names) { - if (sb.length()!=0) { - sb.append(","); - } - sb.append(name); - } - throw new QueryParameterException("parameters do not match any entity fields: " + sb.toString()); - } - if (hasCondition) { - hasCondition = false; // Reset so we can call this method multiple times - query.insert(0, " WHERE"); - } - return query.toString(); - } - - /** @return all stored parameter names. */ - public Set getParameterKeys() { - return parameters.keySet(); - } - - /** @return the value of a stored parameter */ - public Object getParameterValue(final String key) { - return parameters.get(key); - } - - private String genAndStoreParameter(final String name, final Object value) { - names.add(name); - int i = 0; - while (true) { - final String parameter = name + Integer.valueOf(i++).toString(); - if (!parameters.containsKey(parameter)) { - parameters.put(parameter, value); - return parameter; - } - } - } -} Index: src/java/org/cesecore/util/query/QueryCriteria.java =================================================================== --- src/java/org/cesecore/util/query/QueryCriteria.java (revision 0) +++ src/java/org/cesecore/util/query/QueryCriteria.java (working copy) @@ -10,195 +10,56 @@ * See terms of license at gnu.org. * * * *************************************************************************/ -package org.cesecore.util; +package org.cesecore.util.query; import java.io.Serializable; -import java.lang.reflect.Field; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; /** * Query Criteria DSL. * - * There is no guarantee that this will contain a query that is nice to the database - * when sent from a third party. + * This object will not contain the generated query itself. Generation and validation will be done server-side. + * + * This will not guarantee that the conjunction of all restrictions will result in a good query. + * Restrictions order should be guaranteed by the third-party lib. If not it will result in a malformed query. * - * There is no support for prioritizing certain conditions using parenthesis. + * TODO: For now there is no support for prioritizing certain conditions using parenthesis but with the current queyr generator + * this could be easily supported. * - * Example usage: - * String conditions = QueryCriteria.where().eq("columnName", value).order("anotherColumn", QueryCriteria.ORDER_ASC).conditions(ExampleData.class); - * List examples = entityManager.createQuery("SELECT a FROM ExampleData a" + conditions).getResultList(); + * For usage example @see QueryCriteriaTest * * Based on CESeCore version: - * QueryCriteria.java 930 2011-07-05 14:03:08Z johane + * QueryCriteria.java 1225 2011-10-17 15:44:50Z filiper * * @version $Id$ */ -public class QueryCriteria implements Serializable { +public final class QueryCriteria implements Serializable { - public static final boolean ORDER_ASC = true; - public static final boolean ORDER_DESC = false; - private static final long serialVersionUID = -730792160188560822L; - private final Map parameters = new LinkedHashMap(); - private final StringBuilder query = new StringBuilder(); - private final Set names = new HashSet(); - private boolean hasCondition = false; + private List elements = new ArrayList(); private QueryCriteria() { } /** @return a new QueryCriteria */ - public static QueryCriteria where() { + public static QueryCriteria create() { return new QueryCriteria(); } - - /** @return the query with an appended "equal to" condition */ - public QueryCriteria eq(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" = :").append(parameter); - return this; - } - - /** @return the query with an appended "not equal to" condition */ - public QueryCriteria neq(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" != :").append(parameter); - return this; - } - - /** @return the query with an appended "greater than or equal to" condition */ - public QueryCriteria geq(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" >= :").append(parameter); - return this; - } - - /** @return the query with an appended "greater than" condition */ - public QueryCriteria grt(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" > :").append(parameter); - return this; - } - - /** @return the query with an appended "less than or equal to" condition */ - public QueryCriteria leq(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" <= :").append(parameter); - return this; - } - - /** @return the query with an appended "less than to" condition */ - public QueryCriteria lsr(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" < :").append(parameter); - return this; - } - - /** @return the query with an appended "between" condition */ - public QueryCriteria between(final String name, final Object after, final Object before) { - hasCondition = true; - final String parameterAfter = genAndStoreParameter(name, after); - final String parameterBefore = genAndStoreParameter(name, before); - query.append(" a.").append(name).append(" BETWEEN :").append(parameterAfter).append(" AND :").append(parameterBefore); - return this; - } - - /** @return the query with an appended "like" condition */ - public QueryCriteria like(final String name, final Object value) { - hasCondition = true; - final String parameter = genAndStoreParameter(name, value); - query.append(" a.").append(name).append(" LIKE :").append(parameter); - return this; - } - - /** @return the query with an appended "is null" condition */ - public QueryCriteria isNull(final String name) { - hasCondition = true; - query.append(" a.").append(name).append(" IS NULL"); - return this; - } - /** @return the query with an appended "is not null" condition */ - public QueryCriteria isNotNull(final String name) { - hasCondition = true; - query.append(" a.").append(name).append(" IS NOT NULL"); - return this; - } - - /** @return the query with an appended "and" condition */ - public QueryCriteria and() { - query.append(" AND"); - return this; - } - - /** @return the query with an appended "or" condition */ - public QueryCriteria or() { - query.append(" OR"); - return this; - } - - /** @return the query with an appended "ordering" condition. Use QueryCriteria.ORDER_ASC or QueryCriteria.ORDER_DESC. */ - public QueryCriteria order(final String name, final boolean ascending) { - query.append(" ORDER BY a.").append(name); - if (ascending) { - query.append(" ASC"); - } else { - query.append(" DESC"); - } + /** + * Adds a new Criteria (Restriction) + * @param restriction element to be added + * + * @return QueryCriteria instance for chained calls. + */ + public QueryCriteria add(Elem elem) { + elements.add(elem); return this; } - /** @return the query as a String after validation of the fields of the supplied class. */ - public String conditions(final Class entity) { - for (final Field f : entity.getDeclaredFields()) { - names.remove(f.getName()); - } - if (!names.isEmpty()) { - final StringBuilder sb = new StringBuilder(); - for (final String name : names) { - if (sb.length()!=0) { - sb.append(","); - } - sb.append(name); - } - throw new QueryParameterException("parameters do not match any entity fields: " + sb.toString()); - } - if (hasCondition) { - hasCondition = false; // Reset so we can call this method multiple times - query.insert(0, " WHERE"); - } - return query.toString(); - } - - /** @return all stored parameter names. */ - public Set getParameterKeys() { - return parameters.keySet(); - } - - /** @return the value of a stored parameter */ - public Object getParameterValue(final String key) { - return parameters.get(key); - } - - private String genAndStoreParameter(final String name, final Object value) { - names.add(name); - int i = 0; - while (true) { - final String parameter = name + Integer.valueOf(i++).toString(); - if (!parameters.containsKey(parameter)) { - parameters.put(parameter, value); - return parameter; - } - } + public List getElements() { + return elements; } } Property changes on: src/java/org/cesecore/util/query/QueryCriteria.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: svn:keywords + Id Index: src/java/org/cesecore/util/query/Elem.java =================================================================== --- src/java/org/cesecore/util/query/Elem.java (revision 0) +++ src/java/org/cesecore/util/query/Elem.java (revision 0) @@ -0,0 +1,27 @@ +/************************************************************************* + * * + * CESeCore: CE Security Core * + * * + * This software is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or any later version. * + * * + * See terms of license at gnu.org. * + * * + *************************************************************************/ +package org.cesecore.util.query; + +import java.io.Serializable; + + +/** + * Represents one Query Element. It might be a @see Term, @see Operation or clause ( @see Order ) + * + * Based on CESeCore version: Elem.java 1225 2011-10-17 15:44:50Z filiper + * + * @version $Id$ + */ +public interface Elem extends Serializable { + +} Property changes on: src/java/org/cesecore/util/query/Elem.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: svn:keywords + Id Index: src/java/org/cesecore/util/query/Criteria.java =================================================================== --- src/java/org/cesecore/util/query/Criteria.java (revision 0) +++ src/java/org/cesecore/util/query/Criteria.java (revision 0) @@ -0,0 +1,105 @@ +/************************************************************************* + * * + * CESeCore: CE Security Core * + * * + * This software is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or any later version. * + * * + * See terms of license at gnu.org. * + * * + *************************************************************************/ +package org.cesecore.util.query; + +import java.io.Serializable; + +import org.cesecore.util.Tuplet; +import org.cesecore.util.query.clauses.Order; +import org.cesecore.util.query.elems.LogicOperator; +import org.cesecore.util.query.elems.Operation; +import org.cesecore.util.query.elems.RelationalOperator; +import org.cesecore.util.query.elems.Term; + +/** + * This class is a DSL sugar to all possible Criterias. + * + * Based on CESeCore version: Criteria.java 1224 2011-10-17 14:06:55Z filiper + * + * @version $Id$ + */ +public class Criteria implements Serializable { + + private static final long serialVersionUID = 3186042047323993627L; + + public static Elem eq(final String name, final Object value) { + return new Term(RelationalOperator.EQ, name, value); + } + + /** @return the query with an appended "not equal to" condition */ + public static Elem neq(final String name, final Object value) { + return new Term(RelationalOperator.NEQ, name, value); + } + + /** @return the query with an appended "greater than or equal to" condition */ + public static Elem geq(final String name, final Object value) { + return new Term(RelationalOperator.GE, name, value); + + } + + /** @return the query with an appended "greater than" condition */ + public static Elem grt(final String name, final Object value) { + return new Term(RelationalOperator.GT, name, value); + + } + + /** @return the query with an appended "less than or equal to" condition */ + public static Elem leq(final String name, final Object value) { + return new Term(RelationalOperator.LE, name, value); + + } + + /** @return the query with an appended "less than to" condition */ + public static Elem lsr(final String name, final Object value) { + return new Term(RelationalOperator.LT, name, value); + + } + + /** @return the query with an appended "between" condition */ + public static Elem between(final String name, final Object after, + final Object before) { + return new Term(RelationalOperator.BETWEEN, name, + new Tuplet(after, before)); + + } + + public static Elem like(final String name, final Object value) { + return new Term(RelationalOperator.LIKE, name, value); + } + + public static Elem isNull(final String name) { + return new Term(RelationalOperator.NULL, name, null); + } + + public static Elem isNotNull(final String name) { + return new Term(RelationalOperator.NOTNULL, name, null); + } + + public static Elem and(final Elem first, final Elem second) { + return new Operation(LogicOperator.AND, (Term)first, second); + } + + public static Elem or(final Elem first, final Elem second) { + return new Operation(LogicOperator.OR, (Term)first, second); + } + + public static Elem orderAsc(final String name) { + return new Order(name, Order.Value.ASC); + } + + public static Elem orderDesc(final String name) { + return new Order(name, Order.Value.DESC); + } + + +} Property changes on: src/java/org/cesecore/util/query/Criteria.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: svn:keywords + Id Index: src/java/org/cesecore/util/query/QueryGenerator.java =================================================================== --- src/java/org/cesecore/util/query/QueryGenerator.java (revision 0) +++ src/java/org/cesecore/util/query/QueryGenerator.java (revision 0) @@ -0,0 +1,295 @@ +/************************************************************************* + * * + * CESeCore: CE Security Core * + * * + * This software is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or any later version. * + * * + * See terms of license at gnu.org. * + * * + *************************************************************************/ +package org.cesecore.util.query; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.PredicateUtils; +import org.apache.commons.lang.StringUtils; +import org.cesecore.util.QueryParameterException; +import org.cesecore.util.Tuplet; +import org.cesecore.util.query.clauses.Order; +import org.cesecore.util.query.elems.LogicOperator; +import org.cesecore.util.query.elems.Operation; +import org.cesecore.util.query.elems.RelationalOperator; +import org.cesecore.util.query.elems.Term; + +/** + * Class responsible for Query Generation. + * + * Queries will be generated according to provided Criteria. + * Each criteria (composing Terms) will be subdued to validation. + * + * For usage examples @see QueryCriteriaTest + * + * Based on CESeCore version: QueryGenerator.java 1224 2011-10-17 14:06:55Z filiper + * + * @version $Id$ + */ +public final class QueryGenerator implements Serializable { + + private static final long serialVersionUID = 1567027442267416376L; + private final Map parameters = new LinkedHashMap(); + private final Query query; + private final List availableFields = new ArrayList(); + private final QueryCriteria criteria; + + /** + * Class holding query construction logic. + * + */ + private final class Query { + public final StringBuilder query = new StringBuilder(); + private final String attrAlias; + private final static String WHERE = "WHERE"; + private final static String SEPARATOR = " "; + + public Query(final String attrAlias) { + this.attrAlias = attrAlias; + } + + public Query where() { + query.append(SEPARATOR).append(WHERE); + return this; + } + + public Query attribute(final String name) { + query.append(SEPARATOR).append(attrAlias).append(".").append(name); + return this; + } + + public Query parameter(final String name) { + query.append(SEPARATOR).append(":" + name); + return this; + } + + private Query operator(final RelationalOperator op) { + final String operator = op == RelationalOperator.EQ ? "=" + : op == RelationalOperator.GE ? ">=" + : op == RelationalOperator.GT ? ">" + : op == RelationalOperator.LE ? "<=" + : op == RelationalOperator.LT ? "<" + : op == RelationalOperator.NEQ ? "!=" + : op == RelationalOperator.BETWEEN ? "BETWEEN" + : op == RelationalOperator.LIKE ? "LIKE" + : op == RelationalOperator.NULL ? "IS NULL" + : op == RelationalOperator.NOTNULL ? "IS NOT NULL" : ""; + if (operator.isEmpty()) { + throw new QueryParameterException("operator not recognized"); + } + query.append(SEPARATOR).append(operator); + return this; + } + + private Query operator(final LogicOperator op) { + query.append(SEPARATOR).append(op.toString()); + return this; + } + + public Query order(final String name, final Order.Value order) { + query.append(SEPARATOR).append("ORDER BY").append(SEPARATOR) + .append(attrAlias).append(".").append(name) + .append(SEPARATOR).append(order.toString()); + return this; + } + + public boolean isEmpty() { + return query.length() == 0; + } + + public String toString() { + return query.toString(); + } + } + + private QueryGenerator(final Class clazz, final QueryCriteria criteria, + final String alias) { + query = new Query(alias); + this.criteria = criteria; + for (final Field f : clazz.getDeclaredFields()) { + availableFields.add(f.getName()); + } + } + + /** + * Returns a new QueryGenerator or null if criteria is null + * @param clazz + * @param criteria QueryCriteria + * @param attrAlias + * @return QueryGenerator or null if criteria is null + */ + public static QueryGenerator generator(final Class clazz, + final QueryCriteria criteria, final String attrAlias) { + if (criteria == null) { + return null; + } + return new QueryGenerator(clazz, criteria, attrAlias); + } + + /** + * Generates the SQL query according to the criteria passed in generator. + * + * @return generated Query. + */ + public String generate() { + if (query.isEmpty()) { + final List elements = criteria.getElements(); + final List terms = new ArrayList(); + final List clauses = new ArrayList(); + + CollectionUtils.selectRejected(elements, PredicateUtils.instanceofPredicate(Order.class), terms); + CollectionUtils.select(elements, PredicateUtils.instanceofPredicate(Order.class), clauses); + + if (terms.size() > 0) { + query.where(); + } + termTraversal(terms); + clauseTraversal(clauses); + } + return query.toString(); + } + + /** + * Traverses the terms list that is constructed according to the elements list in the QueryCriteria. + * + * @param terms + */ + private void termTraversal(List elements) { + boolean first = true; + for (final Elem element : elements) { + if (!first) { + query.operator(LogicOperator.AND); + } else { + first = false; + } + generate(element); + } + } + + /** + * Traverses the clauses list that is constructed according to the elements list in the QueryCriteria. + * + * @param clauses + */ + private void clauseTraversal(List clauses) { + for (final Elem clause : clauses) { + generate(clause); + } + } + + /** + * Partial query generation according to the provided element. + * + * @param element. Term or Operation or Order object + */ + private void generate(final Elem elem) { + if (elem instanceof Operation) { + generateRestriction((Operation) elem); + } else if (elem instanceof Term) { + generateRestriction((Term) elem); + } else if (elem instanceof Order) { + generateRestriction((Order) elem); + } else { + throw new QueryParameterException("No matched restriction"); + } + } + + + private void generateRestriction(final Operation op) { + generateRestriction(op.getTerm()); + query.operator(op.getOperator()); + final Elem elem = op.getElement(); + if (elem != null) { + generate(elem); + } + } + + private void generateRestriction(final Term term) { + validate(term.getName()); + query.attribute(term.getName()).operator(term.getOperator()); + if (term.getOperator() == RelationalOperator.BETWEEN) { + @SuppressWarnings("unchecked") + final Tuplet values = (Tuplet) term + .getValue(); + query.parameter( + genAndStoreParameter(term.getName(), + values.getFirstElement())) + .operator(LogicOperator.AND) + .parameter( + genAndStoreParameter(term.getName(), + values.getSecondElement())); + } else if (term.getOperator() != RelationalOperator.NULL + && term.getOperator() != RelationalOperator.NOTNULL) { + query.parameter(genAndStoreParameter(term.getName(), + term.getValue())); + } + } + + private void generateRestriction(final Order order) { + validate(order.getName()); + query.order(order.getName(), order.getOrder()); + } + + /** @return all stored parameter names. */ + public Set getParameterKeys() { + return parameters.keySet(); + } + + /** @return the value of a stored parameter */ + public Object getParameterValue(final String key) { + return parameters.get(key); + } + + /** + * Validates the provided name against our namnig strategy ... columns with alphanumeric chars only. + * + * @param name to be validated + */ + private void validate(final String name) { + if (!StringUtils.isAlphanumeric(name)) { + throw new QueryParameterException("parameter is not alphanumeric " + + name); + } + if (!availableFields.contains(name)) { + throw new QueryParameterException("parameter is not valid field" + + name); + } + } + + /** + * Generated a valid parameter name. Uses an internal store to associate the generated name (parameter) to a value. + * + * @param name that will be used as a seed to the parameter name + * @param value to be associated with the parameter name + * @return parameter name + */ + private String genAndStoreParameter(final String name, final Object value) { + int i = 0; + while (true) { + final String parameter = name + Integer.valueOf(i++).toString(); + if (!parameters.containsKey(parameter)) { + parameters.put(parameter, value); + return parameter; + } + + } + } + +} Property changes on: src/java/org/cesecore/util/query/QueryGenerator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: svn:keywords + Id Index: src/java/org/cesecore/util/query/elems/LogicOperator.java =================================================================== --- src/java/org/cesecore/util/query/elems/LogicOperator.java (revision 0) +++ src/java/org/cesecore/util/query/elems/LogicOperator.java (revision 0) @@ -0,0 +1,21 @@ +/************************************************************************* + * * + * CESeCore: CE Security Core * + * * + * This software is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or any later version. * + * * + * See terms of license at gnu.org. * + * * + *************************************************************************/ +package org.cesecore.util.query.elems; +/** + * Based on CESeCore version: LogicOperator.java 1212 2011-10-13 20:58:34Z filiper + * + * @version $Id$ + */ +public enum LogicOperator { + AND, OR +} Property changes on: src/java/org/cesecore/util/query/elems/LogicOperator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: svn:keywords + Id Index: src/java/org/cesecore/util/query/elems/Term.java =================================================================== --- src/java/org/cesecore/util/query/elems/Term.java (revision 0) +++ src/java/org/cesecore/util/query/elems/Term.java (revision 0) @@ -0,0 +1,48 @@ +/************************************************************************* + * * + * CESeCore: CE Security Core * + * * + * This software is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or any later version. * + * * + * See terms of license at gnu.org. * + * * + *************************************************************************/ +package org.cesecore.util.query.elems; + +import org.cesecore.util.query.Elem; + +/** + * Query term. Each term is composed as followed: [name] [operator] [value] + * + * Based on CESeCore version: Term.java 1224 2011-10-17 14:06:55Z filiper + * + * @version $Id$ + */ +public final class Term implements Elem { + + private static final long serialVersionUID = 3569353821030638847L; + private final String name; + private final Object value; + private final RelationalOperator operator; + + public Term(final RelationalOperator operator, final String name, final Object value) { + this.name = name; + this.value = value; + this.operator = operator; + } + + public String getName() { + return name; + } + + public Object getValue() { + return value; + } + + public RelationalOperator getOperator() { + return operator; + } +} Property changes on: src/java/org/cesecore/util/query/elems/Term.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: svn:keywords + Id Index: src/java/org/cesecore/util/query/elems/Operation.java =================================================================== --- src/java/org/cesecore/util/query/elems/Operation.java (revision 0) +++ src/java/org/cesecore/util/query/elems/Operation.java (revision 0) @@ -0,0 +1,50 @@ +/************************************************************************* + * * + * CESeCore: CE Security Core * + * * + * This software is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or any later version. * + * * + * See terms of license at gnu.org. * + * * + *************************************************************************/ +package org.cesecore.util.query.elems; + +import org.cesecore.util.query.Elem; + +/** + * Operation is a combination of Terms. Terms are logiclly related by logical operators @see LogicOperator + * + * Based on CESeCore version: Operation.java 1225 2011-10-17 15:44:50Z filiper + * + * @version $Id$ + */ +public final class Operation implements Elem { + + private static final long serialVersionUID = -4989405964837453338L; + private final Term term; + private final LogicOperator operator; + private final Elem element; + + public Operation(final LogicOperator operator, final Term term1, final Elem element) { + super(); + this.operator = operator; + this.term = term1; + this.element = element; + } + + public Term getTerm() { + return term; + } + + public LogicOperator getOperator() { + return operator; + } + + public Elem getElement() { + return element; + } + +} Property changes on: src/java/org/cesecore/util/query/elems/Operation.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: svn:keywords + Id Index: src/java/org/cesecore/util/query/elems/RelationalOperator.java =================================================================== --- src/java/org/cesecore/util/query/elems/RelationalOperator.java (revision 0) +++ src/java/org/cesecore/util/query/elems/RelationalOperator.java (revision 0) @@ -0,0 +1,22 @@ +/************************************************************************* + * * + * CESeCore: CE Security Core * + * * + * This software is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or any later version. * + * * + * See terms of license at gnu.org. * + * * + *************************************************************************/ +package org.cesecore.util.query.elems; + +/** + * Based on CESeCore version: RelationalOperator.java 1212 2011-10-13 20:58:34Z filiper + * + * @version $Id$ + */ +public enum RelationalOperator { + GT, GE, LT, LE, EQ, NEQ, BETWEEN, LIKE, NULL, NOTNULL +} Property changes on: src/java/org/cesecore/util/query/elems/RelationalOperator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: svn:keywords + Id Index: src/java/org/cesecore/util/query/clauses/Order.java =================================================================== --- src/java/org/cesecore/util/query/clauses/Order.java (revision 0) +++ src/java/org/cesecore/util/query/clauses/Order.java (revision 0) @@ -0,0 +1,46 @@ +/************************************************************************* + * * + * CESeCore: CE Security Core * + * * + * This software is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or any later version. * + * * + * See terms of license at gnu.org. * + * * + *************************************************************************/ +package org.cesecore.util.query.clauses; + +import org.cesecore.util.query.Elem; +/** + * Query ORDER BY element. + * + * Based on CESeCore version: Order.java 1224 2011-10-17 14:06:55Z filiper + * + * @version $Id$ + */ +public class Order implements Elem { + private static final long serialVersionUID = 4277517808022497240L; + + public enum Value { + ASC, DESC + } + + private final String name; + private final Value order; + + public Order(final String name, final Value order) { + this.name = name; + this.order = order; + } + + public String getName() { + return name; + } + + public Value getOrder() { + return order; + } + +} Property changes on: src/java/org/cesecore/util/query/clauses/Order.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: svn:keywords + Id Index: src/java/org/cesecore/audit/Auditable.java =================================================================== --- src/java/org/cesecore/audit/Auditable.java (revision 12892) +++ src/java/org/cesecore/audit/Auditable.java (working copy) @@ -24,7 +24,7 @@ import org.cesecore.audit.audit.AuditLogValidatorException; import org.cesecore.authentication.tokens.AuthenticationToken; import org.cesecore.keys.token.CryptoToken; -import org.cesecore.util.QueryCriteria; +import org.cesecore.util.query.QueryCriteria; /** * Interface for querying, validating and exporting log. Index: src/java/org/cesecore/audit/audit/SecurityEventsAuditorSessionBean.java =================================================================== --- src/java/org/cesecore/audit/audit/SecurityEventsAuditorSessionBean.java (revision 12892) +++ src/java/org/cesecore/audit/audit/SecurityEventsAuditorSessionBean.java (working copy) @@ -38,7 +38,7 @@ import org.cesecore.authorization.control.StandardRules; import org.cesecore.jndi.JndiConstants; import org.cesecore.keys.token.CryptoToken; -import org.cesecore.util.QueryCriteria; +import org.cesecore.util.query.QueryCriteria; /** * This class handles secure logs auditing. This class is responsible for checking Index: src/java/org/cesecore/audit/impl/log4j/Log4jDevice.java =================================================================== --- src/java/org/cesecore/audit/impl/log4j/Log4jDevice.java (revision 12892) +++ src/java/org/cesecore/audit/impl/log4j/Log4jDevice.java (working copy) @@ -38,8 +38,8 @@ import org.cesecore.authentication.tokens.AuthenticationToken; import org.cesecore.keys.token.CryptoToken; import org.cesecore.time.TrustedTime; -import org.cesecore.util.QueryCriteria; import org.cesecore.util.ValidityDate; +import org.cesecore.util.query.QueryCriteria; /** * Simple implementation of (secure) audit that writes all log to Log4J. Index: src/java/org/cesecore/audit/impl/integrityprotected/IntegrityProtectedAuditorSessionBean.java =================================================================== --- src/java/org/cesecore/audit/impl/integrityprotected/IntegrityProtectedAuditorSessionBean.java (revision 12892) +++ src/java/org/cesecore/audit/impl/integrityprotected/IntegrityProtectedAuditorSessionBean.java (working copy) @@ -52,8 +52,10 @@ import org.cesecore.config.CesecoreConfiguration; import org.cesecore.dbprotection.DatabaseProtectionError; import org.cesecore.keys.token.CryptoToken; -import org.cesecore.util.QueryCriteria; import org.cesecore.util.ValidityDate; +import org.cesecore.util.query.Criteria; +import org.cesecore.util.query.QueryCriteria; +import org.cesecore.util.query.QueryGenerator; /** * This class handles secure logs auditing. @@ -136,7 +138,7 @@ detailsDelete.put("timestamp", FastDateFormat.getInstance(ValidityDate.ISO8601_DATE_FORMAT, TimeZone.getTimeZone("GMT")).format(timestamp)); securityEventsLogger.log(EventTypes.LOG_DELETE, EventStatus.VOID, ModuleTypes.SECURITY_AUDIT, ServiceTypes.CORE, token.toString(), null, null, null, detailsDelete); // Delete all the exported logs (from all nodes) - final QueryCriteria queryCriteria = QueryCriteria.where().leq("timeStamp", timestamp.getTime()).order("sequenceNumber", QueryCriteria.ORDER_ASC); + final QueryCriteria queryCriteria = QueryCriteria.create().add(Criteria.leq(AuditLogEntry.FIELD_TIMESTAMP, timestamp.getTime())).add(Criteria.orderAsc(AuditLogEntry.FIELD_SEQENCENUMBER)); return buildConditionalQuery(entityManager, "DELETE FROM AuditRecordData a", queryCriteria, 0, 0).executeUpdate(); } @@ -174,7 +176,7 @@ log.debug("exportAuditLogs for nodeId " + nodeId); } // Assuming timeStamp is in UTC - final QueryCriteria queryCriteria = QueryCriteria.where().eq("nodeId", nodeId).and().leq("timeStamp", timestamp.getTime()).order("sequenceNumber", QueryCriteria.ORDER_ASC); + final QueryCriteria queryCriteria = QueryCriteria.create().add((Criteria.and(Criteria.eq(AuditLogEntry.FIELD_NODEID, nodeId), Criteria.leq(AuditLogEntry.FIELD_TIMESTAMP, timestamp.getTime())))).add(Criteria.orderAsc(AuditLogEntry.FIELD_SEQENCENUMBER)); int startIndex = 1; final Holder lastSeqNumber = new Holder(Long.valueOf(-1L)); while (true) { @@ -308,9 +310,12 @@ if (criteria == null) { query = entityManager.createQuery(queryStr); } else { - query = entityManager.createQuery(queryStr + criteria.conditions(AuditRecordData.class)); - for (final String key : criteria.getParameterKeys()) { - query.setParameter(key, criteria.getParameterValue(key)); + QueryGenerator generator = QueryGenerator.generator(AuditRecordData.class, criteria, "a"); + final String conditions = generator.generate(); + query = entityManager.createQuery(queryStr + conditions); + for (final String key : generator.getParameterKeys()) { + final Object param = generator.getParameterValue(key); + query.setParameter(key, param); } } if (resultLimit > 0) { Index: src/java/org/cesecore/audit/impl/integrityprotected/IntegrityProtectedDevice.java =================================================================== --- src/java/org/cesecore/audit/impl/integrityprotected/IntegrityProtectedDevice.java (revision 12892) +++ src/java/org/cesecore/audit/impl/integrityprotected/IntegrityProtectedDevice.java (working copy) @@ -33,7 +33,7 @@ import org.cesecore.authentication.tokens.AuthenticationToken; import org.cesecore.keys.token.CryptoToken; import org.cesecore.time.TrustedTime; -import org.cesecore.util.QueryCriteria; +import org.cesecore.util.query.QueryCriteria; /** * Log device using database configured integrity protection.