/**
* Copyright (c) 2008--2015 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package com.redhat.satellite.search.scheduler.tasks;
import com.redhat.satellite.search.db.DatabaseManager;
import com.redhat.satellite.search.db.Query;
import com.redhat.satellite.search.db.WriteQuery;
import com.redhat.satellite.search.db.models.Errata;
import com.redhat.satellite.search.index.IndexManager;
import com.redhat.satellite.search.index.IndexingException;
import com.redhat.satellite.search.index.builder.BuilderFactory;
import com.redhat.satellite.search.index.builder.DocumentBuilder;
import org.apache.log4j.Logger;
import org.apache.lucene.document.Document;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* IndexErrataTask
* @version $Rev$
*/
public class IndexErrataTask implements Job {
private static Logger log = Logger.getLogger(IndexErrataTask.class);
private String lang = "en";
/**
* {@inheritDoc}
*/
public void execute(JobExecutionContext ctx)
throws JobExecutionException {
JobDataMap jobData = ctx.getJobDetail().getJobDataMap();
DatabaseManager databaseManager =
(DatabaseManager)jobData.get("databaseManager");
IndexManager indexManager =
(IndexManager)jobData.get("indexManager");
try {
List<Errata> errata = getErrata(databaseManager);
int count = 0;
log.info("found [" + errata.size() + "] errata to index");
for (Iterator<Errata> iter = errata.iterator(); iter.hasNext();) {
Errata current = iter.next();
indexErrata(indexManager, current);
count++;
if (count == 10 || !iter.hasNext()) {
if (System.getProperties().get("isTesting") == null) {
updateLastErrataId(databaseManager, current.getId());
}
count = 0;
}
}
}
catch (SQLException e) {
throw new JobExecutionException(e);
}
catch (IndexingException e) {
throw new JobExecutionException(e);
}
}
/**
* @param databaseManager
* @param sid
*/
private void updateLastErrataId(DatabaseManager databaseManager, long eid)
throws SQLException {
WriteQuery updateQuery = databaseManager.getWriterQuery("updateLastErrata");
WriteQuery insertQuery = databaseManager.getWriterQuery("createLastErrata");
try {
Map<String, Object> params = new HashMap<String, Object>();
params.put("id", eid);
params.put("last_modified", Calendar.getInstance().getTime());
if (updateQuery.update(params) == 0) {
insertQuery.insert(params);
}
}
finally {
try {
if (updateQuery != null) {
updateQuery.close();
}
}
finally {
if (insertQuery != null) {
insertQuery.close();
}
}
}
}
/**
* @param indexManager
* @param current
*/
private void indexErrata(IndexManager indexManager, Errata errata)
throws IndexingException {
Map<String, String> attrs = new HashMap<String, String>();
attrs.put("id", new Long(errata.getId()).toString());
attrs.put("advisory", errata.getAdvisory());
attrs.put("advisoryType", errata.getAdvisoryType());
attrs.put("advisoryName", errata.getAdvisoryName());
attrs.put("advisoryRel", new Long(errata.getAdvisoryRel()).toString());
attrs.put("product", errata.getProduct());
attrs.put("description", errata.getDescription());
attrs.put("synopsis", errata.getSynopsis());
attrs.put("topic", errata.getTopic());
attrs.put("solution", errata.getSolution());
attrs.put("issueDate", errata.getIssueDate());
attrs.put("updateDate", errata.getUpdateDate());
attrs.put("notes", errata.getNotes());
attrs.put("orgId", errata.getOrgId());
attrs.put("created", errata.getCreated());
attrs.put("modified", errata.getModified());
attrs.put("lastModified", errata.getLastModified());
attrs.put("name", errata.getAdvisory());
log.info("Indexing errata: " + errata.getId() + ": " + attrs.toString());
DocumentBuilder edb = BuilderFactory.getBuilder(BuilderFactory.ERRATA_TYPE);
Document doc = edb.buildDocument(new Long(errata.getId()), attrs);
indexManager.addToIndex("errata", doc, lang);
}
/**
* @param databaseManager
* @return
*/
private List<Errata> getErrata(DatabaseManager databaseManager)
throws SQLException {
List<Errata> retval = null;
Query<Long> query = databaseManager.getQuery("getLastErrataId");
Long eid = null;
try {
eid = query.load();
}
finally {
query.close();
}
if (eid == null) {
eid = new Long(0);
}
Query<Errata> errataQuery = databaseManager.getQuery("listErrataFromId");
try {
retval = errataQuery.loadList(eid);
}
finally {
errataQuery.close();
}
return retval;
}
}