package com.med.sql;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Calendar;
import org.apache.xmlbeans.XmlOptions;
import com.medecision.eda.cdcEventBody100.CDCEventBody;
import com.medecision.eda.cdcEventBody100.FieldType;
import com.medecision.eda.event100.ChrononType;
import com.medecision.eda.event100.EventDocument;
import com.medecision.eda.event100.EventPayloadType;
import com.medecision.eda.event100.EventType;
import schemacrawler.schema.Column;
import schemacrawler.schema.ColumnDataType;
import schemacrawler.schema.Table;
/**
* Prototypical support for CDC event generater newly installed/updated Alineo databases.
*
* @author Jane Eisenstein
*/
public class CDCUtils {
// shared types
public final static String DATE = "DATE";
public final static String INTEGER = "INTEGER";
public final static String NUMBER = "NUMBER";
public final static String NUMERIC = "NUMERIC";
public final static String TIMESTAMP = "TIMESTAMP";
public final static String VARCHAR = "VARCHAR";
static final String[] NONAUDITED_ENTITIES = {
"ADMIN.AAEQSTNR_SEQ",
"ADMIN.AUTOCODER_TRANS_CNT",
"ADMIN.AUTOCODER_VERSION_CACHE",
"ADMIN.QSTNR_SEQ",
"ADMIN.RQST_REF_ID_SEQ",
"CODES.POSTAL_CODE",
"CONFIG.DB_VERSION",
"CONFIG.MEMBER_SEARCH_TYPE",
"CONFIG.PROV_SEARCH_TYPE",
"CONFIG.SBSCR_SEARCH_TYPE",
"DXPROC.AUTOCODER_DX_CACHE",
"DXPROC.AUTOCODER_PROC_CACHE",
"ENROLL.ENROLLMENT_SRCH_FLDS",
"IMM.LOCK_TABLE",
"IMM.PHYSICAL_LOCK_TABLE",
"MEMBER.MEMBER_EDIT_STATUS",
"PERFMON.METHODMETRIC",
"PERFMON.TRANSACTIONMETRIC",
"PGMENROLL.PGM_EDIT_STATUS",
"PGMENROLL.PGM_REF_ID_SEQ",
"REQUEST.RQST_KEY_INFO",
"REQUEST.RQST_TX_SRCH"
};
static boolean isNonauditedEntity(String entityType) {
if (entityType != null) {
for (String word : NONAUDITED_ENTITIES) {
if (word.equalsIgnoreCase(entityType))
return true;
}
}
return false;
}
static EventDocument createEventDoc(final String tableName,
Column[] dataColumns, int colCount, String[] values, String pkValue) {
EventDocument eventDoc = EventDocument.Factory.newInstance();
EventType event = eventDoc.addNewEvent();
populateCreateEntityEvent(event, tableName, dataColumns, colCount, values, pkValue);
return eventDoc;
}
static void populateCreateEntityEvent(EventType event, final String tableName,
Column[] dataColumns, int colCount, String[] values, String pkValue) {
Calendar now = Calendar.getInstance();
event.setEventType(EventPayloadType.CREATE_ENTITY);
event.setChronon(ChrononType.MS);
event.setIsComposite(false);
event.setId(""+System.nanoTime()); // TODO use real GUID
event.setDetectionTime(now);
event.setSource("AlineoInstaller");
CDCEventBody body = event.addNewBody();
body.setUserId("mgr");
body.setEntityType(tableName);
body.setInternalId(pkValue);
FieldType field = null;
for (int j = 0; j < colCount; j++) {
String value = values[j];
// TODO: verify this logic is right
if (value != null) {
String columnId = dataColumns[j].getName(); ;
field = body.addNewField();
field.setEntityFldType(columnId);
field.setValue(value);
}
}
}
static String getEventXML(EventDocument event) throws IOException {
StringWriter writer = new StringWriter();
XmlOptions options = new XmlOptions();
options.setSavePrettyPrint();
options.setUseDefaultNamespace();
event.save(writer, options);
String marshalledXML = writer.toString();
return marshalledXML;
}
public static String getEntityType(Table table) {
final String catalogName = table.getSchema().getCatalogName();
String schemaName = table.getSchema().getName();
if (catalogName != null) { // strip catalogName from schemaName
schemaName = schemaName.substring(catalogName.length()+1);
}
schemaName = stripDoubleQuotes(schemaName);
final String entityType = schemaName + "." + stripDoubleQuotes(table.getName());
return entityType;
}
public static String stripDoubleQuotes(String name) {
if (name.startsWith("\"")) {
name = name.substring(1, name.length()-2);
}
return name;
}
static String getColumnValueString(Column column, String value) {
ColumnDataType colType = column.getType();
String type = colType.getName();
// TODO: verify this logic is right
// if (DATE.equalsIgnoreCase(type)) {
// value = ???
// } else if (TIMESTAMP.equalsIgnoreCase(type)) {
// value = ???
// } else
{
String prefix = colType.getLiteralPrefix();
String suffix = colType.getLiteralSuffix();
if (prefix != null && suffix != null) {
value = SqlUtils.escapeStringLiteralDelimiter(value, type);
// if (value.length() == 0 && !column.isNullable())
// value = "_null_";
value = prefix + value + suffix;
}
}
return value;
}
}