/*****************************************************************************
*
* Copyright (C) Zenoss, Inc. 2010-2011, all rights reserved.
*
* This content is made available according to terms specified in
* License.zenoss under the directory where your Zenoss product is installed.
*
****************************************************************************/
package org.zenoss.zep.dao.impl;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcOperations;
import org.zenoss.protobufs.zep.Zep.EventDetailItem;
import org.zenoss.protobufs.zep.Zep.EventDetailItem.EventDetailType;
import org.zenoss.zep.ZepConstants;
import org.zenoss.zep.ZepException;
import org.zenoss.zep.annotations.TransactionalReadOnly;
import org.zenoss.zep.annotations.TransactionalRollbackAllExceptions;
import org.zenoss.zep.dao.EventDetailsConfigDao;
import org.zenoss.zep.dao.impl.compat.NestedTransactionService;
import org.zenoss.zep.dao.impl.SimpleJdbcTemplateProxy;
import java.lang.reflect.Proxy;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class EventDetailsConfigDaoImpl implements EventDetailsConfigDao {
private final SimpleJdbcOperations template;
private NestedTransactionService nestedTransactionService;
private static final String COLUMN_DETAIL_ITEM_NAME = "detail_item_name";
private static final String COLUMN_PROTO_JSON = "proto_json";
public EventDetailsConfigDaoImpl(DataSource ds) {
this.template = (SimpleJdbcOperations) Proxy.newProxyInstance(SimpleJdbcOperations.class.getClassLoader(),
new Class<?>[] {SimpleJdbcOperations.class}, new SimpleJdbcTemplateProxy(ds));
}
public void setNestedTransactionService(NestedTransactionService nestedTransactionService) {
this.nestedTransactionService = nestedTransactionService;
}
private void createDetailItem(String key, EventDetailType type, String name) throws ZepException {
EventDetailItem item = EventDetailItem.newBuilder().setKey(key).setType(type).setName(name).build();
create(item);
}
@Override
@TransactionalRollbackAllExceptions
public void init() throws ZepException {
// Create default EventDetailItem objects in the database.
createDetailItem(ZepConstants.DETAIL_DEVICE_PRIORITY, EventDetailType.INTEGER, "Priority");
createDetailItem(ZepConstants.DETAIL_DEVICE_PRODUCTION_STATE, EventDetailType.INTEGER, "Production State");
createDetailItem(ZepConstants.DETAIL_DEVICE_IP_ADDRESS, EventDetailType.IP_ADDRESS, "IP Address");
createDetailItem(ZepConstants.DETAIL_DEVICE_LOCATION, EventDetailType.PATH, "Location");
createDetailItem(ZepConstants.DETAIL_DEVICE_GROUPS, EventDetailType.PATH, "Groups");
createDetailItem(ZepConstants.DETAIL_DEVICE_SYSTEMS, EventDetailType.PATH, "Systems");
createDetailItem(ZepConstants.DETAIL_DEVICE_CLASS, EventDetailType.PATH, "Device Class");
}
@Override
@TransactionalRollbackAllExceptions
public void create(EventDetailItem item) throws ZepException {
final Map<String,Object> fields = new HashMap<String,Object>(2);
fields.put(COLUMN_DETAIL_ITEM_NAME, item.getKey());
fields.put(COLUMN_PROTO_JSON, DaoUtils.protobufToJson(item));
final String insertSql = "INSERT INTO event_detail_index_config (detail_item_name, proto_json) " +
"VALUES (:detail_item_name, :proto_json)";
final String updateSql = "UPDATE event_detail_index_config SET proto_json=:proto_json" +
" WHERE detail_item_name=:detail_item_name";
DaoUtils.updateOrInsert(nestedTransactionService, template, insertSql, updateSql, fields);
}
@Override
@TransactionalRollbackAllExceptions
public int delete(String eventDetailName) throws ZepException {
final Map<String,String> fields = Collections.singletonMap(COLUMN_DETAIL_ITEM_NAME, eventDetailName);
final String sql = "DELETE FROM event_detail_index_config WHERE detail_item_name = :detail_item_name";
return this.template.update(sql, fields);
}
@Override
@TransactionalReadOnly
public EventDetailItem findByName(String eventDetailName) throws ZepException {
final Map<String,String> fields = Collections.singletonMap(COLUMN_DETAIL_ITEM_NAME, eventDetailName);
final String sql = "SELECT proto_json FROM event_detail_index_config WHERE detail_item_name=:detail_item_name";
final List<EventDetailItem> items = this.template.query(sql, new RowMapper<EventDetailItem>() {
@Override
public EventDetailItem mapRow(ResultSet rs, int rowNum) throws SQLException {
return DaoUtils.protobufFromJson(rs.getString(COLUMN_PROTO_JSON), EventDetailItem.getDefaultInstance());
}
}, fields);
return (items.isEmpty()) ? null : items.get(0);
}
@Override
@TransactionalReadOnly
public Map<String, EventDetailItem> getEventDetailItemsByName() throws ZepException {
final String sql = "SELECT proto_json FROM event_detail_index_config";
final Map<String, EventDetailItem> itemsByName = new HashMap<String, EventDetailItem>();
this.template.query(sql, new RowMapper<Object>() {
@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
EventDetailItem item = DaoUtils.protobufFromJson(rs.getString(COLUMN_PROTO_JSON),
EventDetailItem.getDefaultInstance());
itemsByName.put(item.getKey(), item);
return null;
}
});
return itemsByName;
}
}