/*******************************************************************************
* Copyright (c) 2012-2015 INRIA.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Generoso Pagano - initial API and implementation
******************************************************************************/
package fr.inria.soctrace.lib.storage.visitors;
import java.sql.Connection;
import java.sql.SQLException;
import fr.inria.soctrace.lib.model.AnalysisResult;
import fr.inria.soctrace.lib.model.AnalysisResultData.AnalysisResultType;
import fr.inria.soctrace.lib.model.Event;
import fr.inria.soctrace.lib.model.EventParam;
import fr.inria.soctrace.lib.model.EventParamType;
import fr.inria.soctrace.lib.model.EventProducer;
import fr.inria.soctrace.lib.model.EventType;
import fr.inria.soctrace.lib.model.File;
import fr.inria.soctrace.lib.model.utils.SoCTraceException;
import fr.inria.soctrace.lib.storage.TraceDBObject;
import fr.inria.soctrace.lib.storage.utils.SQLConstants;
import fr.inria.soctrace.lib.storage.utils.SQLConstants.FramesocTable;
/**
* Visitor able to delete the entities of the trace DB.
*
* @author "Generoso Pagano <generoso.pagano@inria.fr>"
*
*/
public class TraceDBDeleteVisitor extends ModelVisitor {
/**
* DB object related to this visitor
*/
private TraceDBObject traceDB;
/**
* The constructor.
*
* @param traceDB
* trace database object
* @throws SoCTraceException
*/
public TraceDBDeleteVisitor(TraceDBObject traceDB) throws SoCTraceException {
super();
this.traceDB = traceDB;
try {
Connection conn = traceDB.getConnection();
PreparedStatementDescriptor psd = null;
// Raw trace
// Events
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_EVENT_DELETE),
FramesocTable.EVENT);
addDescriptor(psd);
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_EVENT_TYPE_DELETE),
FramesocTable.EVENT_TYPE);
addDescriptor(psd);
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_EVENT_PARAM_DELETE),
FramesocTable.EVENT_PARAM);
addDescriptor(psd);
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_EVENT_PARAM_TYPE_DELETE),
FramesocTable.EVENT_PARAM_TYPE);
addDescriptor(psd);
// Event Producers
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_EVENT_PRODUCER_DELETE),
FramesocTable.EVENT_PRODUCER);
addDescriptor(psd);
// File
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_FILE_DELETE),
FramesocTable.FILE);
addDescriptor(psd);
// Analysis results
// Analysis Result
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_ANALYSIS_RESULT_DELETE),
FramesocTable.ANALYSIS_RESULT);
addDescriptor(psd);
// Search
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_SEARCH_DELETE),
FramesocTable.SEARCH);
addDescriptor(psd);
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_SEARCH_MAPPING_DELETE),
FramesocTable.SEARCH_MAPPING);
addDescriptor(psd);
// Annotation
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_ANNOTATION_DELETE),
FramesocTable.ANNOTATION);
addDescriptor(psd);
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_ANNOTATION_TYPE_DELETE),
FramesocTable.ANNOTATION_TYPE);
addDescriptor(psd);
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_ANNOTATION_PARAM_DELETE),
FramesocTable.ANNOTATION_PARAM);
addDescriptor(psd);
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_ANNOTATION_PARAM_TYPE_DELETE),
FramesocTable.ANNOTATION_PARAM_TYPE);
addDescriptor(psd);
// Group
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_GROUP_DELETE),
FramesocTable.ENTITY_GROUP);
addDescriptor(psd);
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_GROUP_MAPPING_DELETE),
FramesocTable.GROUP_MAPPING);
addDescriptor(psd);
// Processed Trace
psd = new PreparedStatementDescriptor(
conn.prepareStatement(SQLConstants.PREPARED_STATEMENT_PROCESSED_TRACE_DELETE),
FramesocTable.PROCESSED_TRACE);
addDescriptor(psd);
// TODO: no need to use the whole key: analysis result id is enough
// because we delete results with AR granularity
} catch (SQLException e) {
throw new SoCTraceException(e);
}
}
@Override
public void visit(Event event) throws SoCTraceException {
try {
PreparedStatementDescriptor psd = getDescriptor(FramesocTable.EVENT);
psd.visited = true;
psd.statement.setInt(1, event.getId());
psd.statement.addBatch();
} catch (SQLException e) {
throw new SoCTraceException(e);
}
}
@Override
public void visit(EventParam eventParam) throws SoCTraceException {
try {
PreparedStatementDescriptor psd = getDescriptor(FramesocTable.EVENT_PARAM);
psd.visited = true;
psd.statement.setInt(1, eventParam.getId());
psd.statement.addBatch();
} catch (SQLException e) {
throw new SoCTraceException(e);
}
}
@Override
public void visit(EventType eventType) throws SoCTraceException {
try {
PreparedStatementDescriptor psd = getDescriptor(FramesocTable.EVENT_TYPE);
psd.visited = true;
psd.statement.setInt(1, eventType.getId());
psd.statement.addBatch();
traceDB.getEventTypeCache().remove(eventType);
} catch (SQLException e) {
throw new SoCTraceException(e);
}
}
@Override
public void visit(EventParamType eventParamType) throws SoCTraceException {
try {
PreparedStatementDescriptor psd = getDescriptor(FramesocTable.EVENT_PARAM_TYPE);
psd.visited = true;
psd.statement.setInt(1, eventParamType.getId());
psd.statement.addBatch();
traceDB.getEventTypeCache().remove(eventParamType);
} catch (SQLException e) {
throw new SoCTraceException(e);
}
}
/*
* Event Producers
*/
@Override
public void visit(EventProducer eventProducer) throws SoCTraceException {
try {
PreparedStatementDescriptor psd = getDescriptor(FramesocTable.EVENT_PRODUCER);
psd.visited = true;
psd.statement.setInt(1, eventProducer.getId());
psd.statement.addBatch();
} catch (SQLException e) {
throw new SoCTraceException(e);
}
}
/*
* File
*/
@Override
public void visit(File file) throws SoCTraceException {
try {
PreparedStatementDescriptor psd = getDescriptor(FramesocTable.FILE);
psd.visited = true;
psd.statement.setInt(1, file.getId());
psd.statement.addBatch();
} catch (SQLException e) {
throw new SoCTraceException(e);
}
}
/*
* Results
*/
@Override
public void visit(AnalysisResult analysisResult) throws SoCTraceException {
try {
PreparedStatementDescriptor psd = getDescriptor(FramesocTable.ANALYSIS_RESULT);
psd.visited = true;
psd.statement.setInt(1, analysisResult.getId());
psd.statement.addBatch();
String type = analysisResult.getType();
if (type.equals(AnalysisResultType.TYPE_SEARCH.toString())) {
deleteSearchResult(analysisResult);
} else if (type.equals(AnalysisResultType.TYPE_GROUP.toString())) {
deleteGroupResult(analysisResult);
} else if (type.equals(AnalysisResultType.TYPE_ANNOTATION.toString())) {
deleteAnnotationResult(analysisResult);
} else if (type.equals(AnalysisResultType.TYPE_PROCESSED_TRACE.toString())) {
deleteProcessedTraceResult(analysisResult);
}
} catch (SQLException e) {
throw new SoCTraceException(e);
}
}
/*
* U t i l i t i e s
*/
private void deleteSearchResult(AnalysisResult analysisResult) throws SQLException {
PreparedStatementDescriptor psdSearch = getDescriptor(FramesocTable.SEARCH);
PreparedStatementDescriptor psdMapping = getDescriptor(FramesocTable.SEARCH_MAPPING);
psdSearch.statement.setInt(1, analysisResult.getId());
psdMapping.statement.setInt(1, analysisResult.getId());
psdSearch.statement.addBatch();
psdMapping.statement.addBatch();
psdSearch.visited = true;
psdMapping.visited = true;
}
private void deleteGroupResult(AnalysisResult analysisResult) throws SQLException,
SoCTraceException {
PreparedStatementDescriptor psdGroup = getDescriptor(FramesocTable.ENTITY_GROUP);
PreparedStatementDescriptor psdMapping = getDescriptor(FramesocTable.GROUP_MAPPING);
psdGroup.statement.setInt(1, analysisResult.getId());
psdMapping.statement.setInt(1, analysisResult.getId());
psdGroup.statement.addBatch();
psdMapping.statement.addBatch();
psdGroup.visited = true;
psdMapping.visited = true;
}
private void deleteAnnotationResult(AnalysisResult analysisResult) throws SQLException {
PreparedStatementDescriptor psdAnnotation = getDescriptor(FramesocTable.ANNOTATION);
PreparedStatementDescriptor psdAnnotationType = getDescriptor(FramesocTable.ANNOTATION_TYPE);
PreparedStatementDescriptor psdAnnotationParam = getDescriptor(FramesocTable.ANNOTATION_PARAM);
PreparedStatementDescriptor psdAnnotationParamType = getDescriptor(FramesocTable.ANNOTATION_PARAM_TYPE);
psdAnnotation.statement.setInt(1, analysisResult.getId());
psdAnnotationType.statement.setInt(1, analysisResult.getId());
psdAnnotationParam.statement.setInt(1, analysisResult.getId());
psdAnnotationParamType.statement.setInt(1, analysisResult.getId());
psdAnnotation.statement.addBatch();
psdAnnotationType.statement.addBatch();
psdAnnotationParam.statement.addBatch();
psdAnnotationParamType.statement.addBatch();
psdAnnotation.visited = true;
psdAnnotationType.visited = true;
psdAnnotationParam.visited = true;
psdAnnotationParamType.visited = true;
}
private void deleteProcessedTraceResult(AnalysisResult analysisResult) throws SQLException {
PreparedStatementDescriptor psd = getDescriptor(FramesocTable.PROCESSED_TRACE);
psd.statement.setInt(1, analysisResult.getId());
psd.statement.addBatch();
psd.visited = true;
}
}