package com.nvarghese.beowulf.common.scan.dao; import java.util.ArrayList; import java.util.List; import org.bson.types.ObjectId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.code.morphia.Datastore; import com.google.code.morphia.Key; import com.google.code.morphia.query.Query; import com.google.code.morphia.query.QueryResults; import com.google.code.morphia.query.UpdateOperations; import com.nvarghese.beowulf.common.dao.AbstractMongoDAO; import com.nvarghese.beowulf.common.scan.model.ReportIssueDocument; import com.nvarghese.beowulf.common.scan.model.ReportIssueVariantDocument; import com.nvarghese.beowulf.common.webtest.JobStatus; import com.nvarghese.beowulf.common.webtest.ReportThreatType; import com.nvarghese.beowulf.common.webtest.ThreatSeverityType; import com.nvarghese.beowulf.common.webtest.scs.jobs.CategorizationJobDocument; public class ReportIssueDAO extends AbstractMongoDAO<ReportIssueDocument, ObjectId> { static Logger logger = LoggerFactory.getLogger(ReportIssueDAO.class); public ReportIssueDAO(Datastore ds) { super(ReportIssueDocument.class, ds); } /** * * @param objectId * @return */ public ReportIssueDocument getReportIssueDocument(ObjectId objectId, boolean includeReportIssueVariants) { Query<ReportIssueDocument> q = null; if (includeReportIssueVariants) { return get(objectId); } else { q = ds.createQuery(ReportIssueDocument.class).retrievedFields(false, "issue_variants"); q.filter("id", objectId); } QueryResults<ReportIssueDocument> qr = find(q); if (qr.countAll() > 0) { return qr.get(); } else { return null; } } /** * * @param objectId * @return */ public ReportIssueDocument getReportIssueDocument(ObjectId objectId) { return getReportIssueDocument(objectId, false); } /** * * @param objectId * @return */ public ReportIssueDocument getReportIssueDocument(String objectId, boolean includeReportIssueVariants) { ObjectId id = new ObjectId(objectId); return getReportIssueDocument(id, includeReportIssueVariants); } /** * * @param objectId * @return */ public ReportIssueDocument getReportIssueDocument(String objectId) { ObjectId id = new ObjectId(objectId); return getReportIssueDocument(id); } /** * * @param reportIssueDocument */ public void updateReportIssueDocument(ReportIssueDocument reportIssueDocument) { logger.debug("Updating reportIssueDocument with id: {}", reportIssueDocument.getId()); save(reportIssueDocument); } /** * * Create a new reportIssueDocument * * @param reportIssueDocument */ public ObjectId createReportIssueDocument(ReportIssueDocument reportIssueDocument) { logger.debug("Creating new reportIssueDocument."); Key<ReportIssueDocument> key = save(reportIssueDocument); return (ObjectId) key.getId(); } /** * * @param url * @param threatType * @param moduleNumber * @return */ public ReportIssueDocument findByUrlAndThreatTypeAndModuleNumber(String issueUrl, ReportThreatType threatType, long moduleNumber, boolean includeReportIssueVariants) { logger.debug("Querying to find ReportIssueDocument based on url, threat type and module number"); Query<ReportIssueDocument> q = ds.createQuery(ReportIssueDocument.class); q.and(q.criteria("threatType").equal(threatType), q.criteria("issueUrl").equal(issueUrl), q.criteria("moduleNumber").equal(moduleNumber)); if (includeReportIssueVariants) { return findOne(q); } else { q = q.retrievedFields(false, "issue_variants"); return findOne(q); } } /** * * @param threatType * @param includeReportIssueVariants * @return */ public List<ReportIssueDocument> findByThreatType(ReportThreatType threatType, boolean includeReportIssueVariants) { logger.debug("Querying to find ReportIssueDocument based on threat type"); Query<ReportIssueDocument> q = ds.createQuery(ReportIssueDocument.class); q.and(q.criteria("threatType").equal(threatType)); if (includeReportIssueVariants) { return find(q).asList(); } else { q = q.retrievedFields(false, "issue_variants"); return find(q).asList(); } } /** * * @param threatType * @param includeReportIssueVariants * @return */ public ReportIssueDocument findOneByThreatType(ReportThreatType threatType, boolean includeReportIssueVariants) { logger.debug("Querying to find ReportIssueDocument based on threat type"); Query<ReportIssueDocument> q = ds.createQuery(ReportIssueDocument.class); q.and(q.criteria("threatType").equal(threatType)); if (includeReportIssueVariants) { return findOne(q); } else { q = q.retrievedFields(false, "issue_variants"); return findOne(q); } } /** * * @param reportIssueObjId * @param issueVariantDocument */ public void addReportIssueVariants(ObjectId reportIssueObjId, ReportIssueVariantDocument issueVariantDocument) { UpdateOperations<ReportIssueDocument> ops = ds.createUpdateOperations(ReportIssueDocument.class).add("issue_variants", issueVariantDocument, false); ds.update(ds.createQuery(ReportIssueDocument.class).filter("id", reportIssueObjId), ops); } /** * * @param offset * @param limit * @return */ public List<ReportIssueDocument> getReportIssueDocuments(int offset, int limit) { Query<ReportIssueDocument> q = ds.createQuery(ReportIssueDocument.class).offset(offset).limit(limit); QueryResults<ReportIssueDocument> qr = find(q); return qr.asList(); } /** * * @param severityType * @return */ public long getCountOfIssuesByThreatSeverityType(ThreatSeverityType severityType) { Query<ReportIssueDocument> q = ds.createQuery(ReportIssueDocument.class).field("threatSeverityType").equal(severityType); long count = count(q); return count; } }