ImportDataProcessor.java

package com.ostrichemulators.semtool.rdf.engine.util;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.ostrichemulators.semtool.rdf.engine.api.IEngine;
import com.ostrichemulators.semtool.rdf.query.util.UpdateExecutorAdapter;
import java.io.IOException;
import org.openrdf.query.MalformedQueryException;
import org.openrdf.query.UpdateExecutionException;
import org.openrdf.repository.RepositoryException;

public class ImportDataProcessor {

	private static final Logger logger = Logger.getLogger( ImportDataProcessor.class );

	public static void clearEngine( IEngine engine, Collection<File> filesToCheck ) {
		for ( File file : filesToCheck ) {
			try {
				XSSFWorkbook book = new XSSFWorkbook( new FileInputStream( file ) );
				XSSFSheet lSheet = book.getSheet( "Loader" );
				int lastRow = lSheet.getLastRowNum();

				List<String> nodes = new ArrayList<>();
				List<String[]> relationships = new ArrayList<>();
				for ( int rIndex = 1; rIndex <= lastRow; rIndex++ ) {
					XSSFRow sheetNameRow = lSheet.getRow( rIndex );
					XSSFCell cell = sheetNameRow.getCell( 0 );
					XSSFSheet sheet = book.getSheet( cell.getStringCellValue() );

					XSSFRow row = sheet.getRow( 0 );
					String sheetType = "";
					if ( row.getCell( 0 ) != null ) {
						sheetType = row.getCell( 0 ).getStringCellValue();
					}
					if ( "Node".equalsIgnoreCase( sheetType ) ) {
						if ( row.getCell( 1 ) != null ) {
							nodes.add( row.getCell( 1 ).getStringCellValue() );
						}
					}
					if ( "Relation".equalsIgnoreCase( sheetType ) ) {
						String subject;
						String object;
						String relationship = "";
						if ( row.getCell( 1 ) != null && row.getCell( 2 ) != null ) {
							subject = row.getCell( 1 ).getStringCellValue();
							object = row.getCell( 2 ).getStringCellValue();

							row = sheet.getRow( 1 );
							if ( row.getCell( 0 ) != null ) {
								relationship = row.getCell( 0 ).getStringCellValue();
							}

							relationships.add( new String[]{ subject, relationship, object } );
						}
					}
				}
				String deleteQuery;

				int numberNodes = nodes.size();
				if ( numberNodes > 0 ) {
					for ( String node : nodes ) {
						deleteQuery = "DELETE {?s ?p ?prop. ?s ?x ?y} WHERE { {";
						deleteQuery += "SELECT ?s ?p ?prop ?x ?y WHERE { {?s a <http://semoss.org/ontologies/Concept/";
						deleteQuery += node;
						deleteQuery += "> ;} {?s ?x ?y} MINUS {?x <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> <http://semoss.org/ontologies/Relation> ;} ";
						deleteQuery += "OPTIONAL{ {?p a <http://semoss.org/ontologies/Relation/Contains> ;} {?s ?p ?prop ;} } } } ";
						deleteQuery += "}";

						engine.update( new UpdateExecutorAdapter( deleteQuery ) );						
						logger.debug( deleteQuery );
					}
				}

				int numberRelationships = relationships.size();
				if ( numberRelationships > 0 ) {
					for ( String[] rel : relationships ) {
						deleteQuery = "DELETE {?in ?relationship ?out. ?relationship ?contains ?prop} WHERE { {";
						deleteQuery += "SELECT ?in ?relationship ?out ?contains ?prop WHERE { "
								+ "{?in a <http://semoss.org/ontologies/Concept/";
						deleteQuery += rel[0];
						deleteQuery += "> ;} ";

						deleteQuery += "{?out a <http://semoss.org/ontologies/Concept/";
						deleteQuery += rel[2];
						deleteQuery += "> ;} ";

						deleteQuery += "{?relationship <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> <http://semoss.org/ontologies/Relation/";
						deleteQuery += rel[1];
						deleteQuery += "> ;} {?in ?relationship ?out ;} ";
						deleteQuery += "OPTIONAL { {?relationship ?contains ?prop ;} } } } ";
						deleteQuery += "}";

						
						engine.update( new UpdateExecutorAdapter( deleteQuery ) );						
						logger.debug( deleteQuery );
					}
				}
			}
			catch ( IOException | RepositoryException | MalformedQueryException | UpdateExecutionException ex ) {
				logger.error( ex, ex );
			}
		}
	}
}