/** * ClarescoExperienceAPI * Copyright * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * Please contact Claresco, www.claresco.com, if you have any questions. **/ package com.claresco.tinman.sql; import java.io.BufferedReader; import java.io.FileReader; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.sql.Types; import java.util.Calendar; import java.util.TimeZone; import java.util.UUID; import org.joda.time.DateTime; import com.claresco.tinman.json.JsonUtility; import com.claresco.tinman.lrs.XapiObject; import com.claresco.tinman.lrs.XapiStatement; import com.claresco.tinman.lrs.XapiStatementRef; import com.google.gson.Gson; /** * XapiStatementSqlWriter.java * * Write Statement to Database, the only class that should be visible * to other classes outside the package * * Status: * YELLOW * * @author rheza * on Feb 24, 2014 * */ class XapiStatementSQLWriter extends SQLWriter { private PreparedStatement myInsertStatement; private PreparedStatement myVoidingStatement; private XapiActorSQLWriter myActorWriter; private XapiVerbSQLWriter myVerbWriter; private XapiObjectSQLWriter myObjectWriter; private XapiStatementSQLReader myStatementReader; private XapiContextSQLWriter myContextWriter; private XapiResultSQLWriter myResultWriter; private String myTableName = "statement"; private String[] myFieldNames = {"statementid", "actorid", "verbid", "objectid", "resultid", "contextid", "sttime", "ststored" , "authorityid", "stversion", "statementuuid"}; /** * * Constructor * * Params: * * */ public XapiStatementSQLWriter(Connection conn, XapiActorSQLWriter theActorWriter, XapiVerbSQLWriter theVerbWriter, XapiObjectSQLWriter theObjectWriter, XapiStatementSQLReader theStatementReader, XapiContextSQLWriter theContextSQLWriter, XapiResultSQLWriter theResultWriter) throws SQLException{ this.myConn = conn; this.myInsertStatement = SQLUtility.createInsertStatement(super.myConn, myTableName, myFieldNames); this.myActorWriter = theActorWriter; this.myVerbWriter = theVerbWriter; this.myObjectWriter = theObjectWriter; this.myStatementReader = theStatementReader; this.myContextWriter = theContextSQLWriter; this.myResultWriter = theResultWriter; this.myVoidingStatement = SQLUtility.createUpdateStatement(myConn, myTableName, new String[]{"isvoided"}, new String[]{"statementid"}); } /** * * Description: * Insert a new statement to the database * * Params: * theStatement : the Statement object */ protected int insertNewStatement(XapiStatement theStatement, boolean newActivityAllowed, boolean generateRandomID) throws SQLException, XapiDataIntegrityException{ int theId = super.fetchId(); this.myInsertStatement.setInt(1, theId); this.myInsertStatement.setInt(2, this.myActorWriter.insertNewActor(theStatement.getActor())); this.myInsertStatement.setInt(3, this.myVerbWriter.insertNewVerb(theStatement.getVerb())); this.myInsertStatement.setInt(4, this.myObjectWriter.insertNewObject(theStatement.getObject(), newActivityAllowed)); this.myInsertStatement.setNull(5, Types.NUMERIC); this.myInsertStatement.setNull(6, Types.NUMERIC); this.myInsertStatement.setNull(7, Types.TIMESTAMP); this.myInsertStatement.setNull(8, Types.TIMESTAMP); this.myInsertStatement.setNull(9, Types.NUMERIC); this.myInsertStatement.setNull(10, Types.CHAR); this.myInsertStatement.setString(11, theStatement.getId()); if(theStatement.hasResult()){ this.myInsertStatement.setInt(5, this.myResultWriter.insertNewResult(theStatement.getResult())); } if(theStatement.hasContext()){ this.myInsertStatement.setInt(6, this.myContextWriter.insertNewContext (theStatement.getContext(), newActivityAllowed)); } // Set timestamp if(theStatement.hasTimeStamp()){ Timestamp theTimestamp = SQLUtility.getTimestamp(theStatement.getTimeStamp()); Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); this.myInsertStatement.setTimestamp(7, theTimestamp, cal); } DateTime theStoredTime = DateTime.now(); Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); this.myInsertStatement.setTimestamp(8, SQLUtility.getTimestamp(theStoredTime), cal); // Check if a statement with that UUID already exists in the database if(!generateRandomID){ if (myStatementReader.doesStatementExists(theStatement.getId())) { // If so, throw an error throw new XapiDuplicateStatementIDException("Statement with that UUID already exists"); } }else{ this.myInsertStatement.setString(11, UUID.randomUUID().toString()); } // If the statement voids another statement if(theStatement.isVoiding()){ voidStatement(theStatement); } this.myInsertStatement.executeUpdate(); return theId; } private void voidStatement(XapiStatement theStatement) throws XapiStatementReferenceInvalidException, SQLException{ XapiObject theObject = theStatement.getObject(); if(!theObject.getObjectType().equals("StatementRef") || !(theObject instanceof XapiStatementRef)){ throw new XapiStatementReferenceInvalidException("the Object must be a statement reference"); } XapiStatementRef theStatementRef = (XapiStatementRef) theObject; int id = myStatementReader.findIDByUUID(theStatementRef.getId().toString()); if(id == -1){ throw new XapiStatementReferenceInvalidException("Could not find the statement being referenced"); } myVoidingStatement.setInt(1, 1); myVoidingStatement.setInt(2, id); myVoidingStatement.executeUpdate(); } /* (non-Javadoc) * @see com.claresco.tinman.sql.SQLWriter#close() */ @Override protected void close() throws SQLException { super.close(); SQLUtility.closeStatement(myInsertStatement); SQLUtility.closeStatement(myVoidingStatement); } public static void main(String[] args) { Gson gson = JsonUtility.createGson(); String path1 = "/Users/rheza/Documents/workspace/ClarescoExperienceAPI/src/com/claresco/tinman/json/Statement5.json"; try{ BufferedReader bf = new BufferedReader(new FileReader(path1)); XapiStatement s = gson.fromJson(bf, XapiStatement.class); Connection conn = SQLUtility.establishDefaultConnection(); } catch(Exception e){ e.printStackTrace(); } finally{ } } }