use of cbit.vcell.mathmodel.MathModel in project vcell by virtualcell.
the class ClientDocumentManager method substituteFieldFuncNames.
public void substituteFieldFuncNames(VCDocument vcDocument, VersionableTypeVersion originalOwner) throws DataAccessException, MathException, ExpressionException {
Vector<ExternalDataIdentifier> errorCleanupExtDataIDV = new Vector<ExternalDataIdentifier>();
try {
if (originalOwner == null || originalOwner.getVersion().getOwner().compareEqual(getUser())) {
// Substitution for FieldFunc not needed for new doc or if we own doc
return;
}
// Get Objects from Document that might need to have FieldFuncs replaced
Vector<Object> fieldFunctionContainer_mathDesc_or_simContextV = new Vector<Object>();
if (vcDocument instanceof MathModel) {
fieldFunctionContainer_mathDesc_or_simContextV.add(((MathModel) vcDocument).getMathDescription());
} else if (vcDocument instanceof BioModel) {
SimulationContext[] simContextArr = ((BioModel) vcDocument).getSimulationContexts();
for (int i = 0; i < simContextArr.length; i += 1) {
fieldFunctionContainer_mathDesc_or_simContextV.add(simContextArr[i]);
}
}
// Get original Field names
Vector<String> origFieldFuncNamesV = new Vector<String>();
for (int i = 0; i < fieldFunctionContainer_mathDesc_or_simContextV.size(); i += 1) {
Object fieldFunctionContainer = fieldFunctionContainer_mathDesc_or_simContextV.elementAt(i);
FieldFunctionArguments[] fieldFuncArgsArr = null;
if (fieldFunctionContainer instanceof MathDescription) {
fieldFuncArgsArr = FieldUtilities.getFieldFunctionArguments((MathDescription) fieldFunctionContainer);
} else if (fieldFunctionContainer instanceof SimulationContext) {
fieldFuncArgsArr = ((SimulationContext) fieldFunctionContainer).getFieldFunctionArguments();
}
for (int j = 0; j < fieldFuncArgsArr.length; j += 1) {
if (!origFieldFuncNamesV.contains(fieldFuncArgsArr[j].getFieldName())) {
origFieldFuncNamesV.add(fieldFuncArgsArr[j].getFieldName());
}
}
}
if (origFieldFuncNamesV.size() == 0) {
// No FieldFunctions to substitute
return;
}
FieldDataDBOperationResults copyNamesFieldDataOpResults = fieldDataDBOperation(FieldDataDBOperationSpec.createCopyNoConflictExtDataIDsSpec(getUser(), origFieldFuncNamesV.toArray(new String[0]), originalOwner));
errorCleanupExtDataIDV.addAll(copyNamesFieldDataOpResults.oldNameNewIDHash.values());
// Copy Field Data on Data Server FileSystem
for (String fieldname : origFieldFuncNamesV) {
KeyValue sourceSimDataKey = copyNamesFieldDataOpResults.oldNameOldExtDataIDKeyHash.get(fieldname);
if (sourceSimDataKey == null) {
throw new DataAccessException("Couldn't find original data key for FieldFunc " + fieldname);
}
ExternalDataIdentifier newExtDataID = copyNamesFieldDataOpResults.oldNameNewIDHash.get(fieldname);
getSessionManager().fieldDataFileOperation(FieldDataFileOperationSpec.createCopySimFieldDataFileOperationSpec(newExtDataID, sourceSimDataKey, originalOwner.getVersion().getOwner(), FieldDataFileOperationSpec.JOBINDEX_DEFAULT, getUser()));
}
// Finally substitute new Field names
for (int i = 0; i < fieldFunctionContainer_mathDesc_or_simContextV.size(); i += 1) {
Object fieldFunctionContainer = fieldFunctionContainer_mathDesc_or_simContextV.elementAt(i);
if (fieldFunctionContainer instanceof MathDescription) {
MathDescription mathDesc = (MathDescription) fieldFunctionContainer;
FieldUtilities.substituteFieldFuncNames(mathDesc, copyNamesFieldDataOpResults.oldNameNewIDHash);
} else if (fieldFunctionContainer instanceof SimulationContext) {
SimulationContext simContext = (SimulationContext) fieldFunctionContainer;
simContext.substituteFieldFuncNames(copyNamesFieldDataOpResults.oldNameNewIDHash);
}
}
fireFieldDataDB(new FieldDataDBEvent(this));
} catch (Exception e) {
e.printStackTrace();
// Cleanup
for (int i = 0; i < errorCleanupExtDataIDV.size(); i += 1) {
try {
fieldDataDBOperation(FieldDataDBOperationSpec.createDeleteExtDataIDSpec(errorCleanupExtDataIDV.elementAt(i)));
} catch (Exception e2) {
// ignore, we tried to cleanup
}
try {
fieldDataFileOperation(FieldDataFileOperationSpec.createDeleteFieldDataFileOperationSpec(errorCleanupExtDataIDV.elementAt(i)));
} catch (Exception e1) {
// ignore, we tried to cleanup
}
}
throw new RuntimeException("Error copying Field Data \n" + e.getMessage());
}
}
use of cbit.vcell.mathmodel.MathModel in project vcell by virtualcell.
the class XmlHelper method exportSBML.
/**
* Exports VCML format to another supported format (currently: SBML or CellML). It allows
* choosing a specific Simulation Spec to export.
* Creation date: (4/8/2003 12:30:27 PM)
* @return java.lang.String
*/
public static String exportSBML(VCDocument vcDoc, int level, int version, int pkgVersion, boolean isSpatial, SimulationContext simContext, SimulationJob simJob) throws XmlParseException {
if (vcDoc == null) {
throw new XmlParseException("Invalid arguments for exporting SBML.");
}
if (vcDoc instanceof BioModel) {
try {
// check if model to be exported to SBML has units compatible with SBML default units (default units in SBML can be assumed only until SBML Level2)
ModelUnitSystem forcedModelUnitSystem = simContext.getModel().getUnitSystem();
if (level < 3 && !ModelUnitSystem.isCompatibleWithDefaultSBMLLevel2Units(forcedModelUnitSystem)) {
forcedModelUnitSystem = ModelUnitSystem.createDefaultSBMLLevel2Units();
}
// create new Biomodel with new (SBML compatible) unit system
BioModel modifiedBiomodel = ModelUnitConverter.createBioModelWithNewUnitSystem(simContext.getBioModel(), forcedModelUnitSystem);
// extract the simContext from new Biomodel. Apply overrides to *this* modified simContext
SimulationContext simContextFromModifiedBioModel = modifiedBiomodel.getSimulationContext(simContext.getName());
SimulationContext clonedSimContext = applyOverridesForSBML(modifiedBiomodel, simContextFromModifiedBioModel, simJob);
// extract sim (in simJob) from modified Biomodel, if not null
SimulationJob modifiedSimJob = null;
if (simJob != null) {
Simulation simFromModifiedBiomodel = clonedSimContext.getSimulation(simJob.getSimulation().getName());
modifiedSimJob = new SimulationJob(simFromModifiedBiomodel, simJob.getJobIndex(), null);
}
SBMLExporter sbmlExporter = new SBMLExporter(modifiedBiomodel, level, version, isSpatial);
sbmlExporter.setSelectedSimContext(simContextFromModifiedBioModel);
sbmlExporter.setSelectedSimulationJob(modifiedSimJob);
return sbmlExporter.getSBMLFile();
} catch (ExpressionException | SbmlException | SBMLException | XMLStreamException e) {
e.printStackTrace(System.out);
throw new XmlParseException(e);
}
} else if (vcDoc instanceof MathModel) {
try {
return MathModel_SBMLExporter.getSBMLString((MathModel) vcDoc, level, version);
} catch (ExpressionException | IOException | SBMLException | XMLStreamException e) {
e.printStackTrace(System.out);
throw new XmlParseException(e);
}
} else {
throw new RuntimeException("unsupported Document Type " + vcDoc.getClass().getName() + " for SBML export");
}
}
use of cbit.vcell.mathmodel.MathModel in project vcell by virtualcell.
the class ChooseFile method run.
/**
* Insert the method's description here.
* Creation date: (5/31/2004 6:04:14 PM)
* @param hashTable java.util.Hashtable
* @param clientWorker cbit.vcell.desktop.controls.ClientWorker
*/
public void run(Hashtable<String, Object> hashTable) throws java.lang.Exception {
VCDocument documentToExport = fetch(hashTable, DocumentToExport.EXPORT_DOCUMENT, VCDocument.class, true);
File exportFile = null;
if (documentToExport instanceof BioModel) {
exportFile = showBioModelXMLFileChooser(hashTable);
} else if (documentToExport instanceof MathModel) {
exportFile = showMathModelXMLFileChooser(hashTable);
} else if (documentToExport instanceof Geometry) {
exportFile = showGeometryModelXMLFileChooser(hashTable);
} else {
throw new Exception("Unsupported document type for XML export: " + documentToExport.getClass());
}
// check to see if we've changed extension from what user entered
if (extensionUserProvided != null && !extensionUserProvided.isEmpty()) {
String fp = exportFile.getAbsolutePath();
String currentExt = FilenameUtils.getExtension(fp);
if (!extensionUserProvided.equals(currentExt)) {
hashTable.put(RENAME_KEY, fp);
}
}
hashTable.put(EXPORT_FILE, exportFile);
}
use of cbit.vcell.mathmodel.MathModel in project vcell by virtualcell.
the class ExportDocument method run.
/**
* Insert the method's description here.
* Creation date: (5/31/2004 6:04:14 PM)
* @param hashTable java.util.Hashtable
* @param clientWorker cbit.vcell.desktop.controls.ClientWorker
*/
public void run(Hashtable<String, Object> hashTable) throws java.lang.Exception {
VCDocument documentToExport = (VCDocument) hashTable.get("documentToExport");
File exportFile = fetch(hashTable, EXPORT_FILE, File.class, true);
ExtensionFilter fileFilter = fetch(hashTable, FILE_FILTER, ExtensionFilter.class, true);
DocumentManager documentManager = fetch(hashTable, DocumentManager.IDENT, DocumentManager.class, true);
String resultString = null;
FileCloseHelper closeThis = null;
try {
if (documentToExport instanceof BioModel) {
if (!(fileFilter instanceof SelectorExtensionFilter)) {
throw new Exception("Expecting fileFilter type " + SelectorExtensionFilter.class.getName() + " but got " + fileFilter.getClass().getName());
}
BioModel bioModel = (BioModel) documentToExport;
SimulationContext chosenSimContext = fetch(hashTable, SIM_CONTEXT, SimulationContext.class, false);
((SelectorExtensionFilter) fileFilter).writeBioModel(documentManager, bioModel, exportFile, chosenSimContext);
/* DELETE this after finishing validation testing
// check format requested
if (fileFilter.getDescription().equals(FileFilters.FILE_FILTER_MATLABV6.getDescription())){
// matlab from application; get application
SimulationContext chosenSimContext = fetch(hashTable,SIM_CONTEXT,SimulationContext.class, true);
// regenerate a fresh MathDescription
MathMapping mathMapping = chosenSimContext.createNewMathMapping();
MathDescription mathDesc = mathMapping.getMathDescription();
if(mathDesc != null && !mathDesc.isSpatial() && !mathDesc.isNonSpatialStoch()){
// do export
resultString = exportMatlab(exportFile, fileFilter, mathDesc);
}else{
throw new Exception("Matlab export failed: NOT an non-spatial deterministic application!");
}
} else if (fileFilter.equals(FileFilters.FILE_FILTER_PDF)) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(exportFile);
documentManager.generatePDF(bioModel, fos);
} finally {
if(fos != null) {
fos.close();
}
}
return; //will take care of writing to the file as well.
}
//Export a simulation to Smoldyn input file, if there are parameter scans
//in simulation, we'll export multiple Smoldyn input files.
else if (fileFilter.equals(FileFilters.FILE_FILTER_SMOLDYN_INPUT))
{
Simulation selectedSim = (Simulation)hashTable.get("selectedSimulation");
if (selectedSim != null) {
int scanCount = selectedSim.getScanCount();
if(scanCount > 1) // has parameter scan
{
String baseExportFileName = exportFile.getPath().substring(0, exportFile.getPath().indexOf("."));
for(int i=0; i<scanCount; i++)
{
SimulationTask simTask = new SimulationTask(new SimulationJob(selectedSim, i, null),0);
// Need to export each parameter scan into a separate file
String newExportFileName = baseExportFileName + "_" + i + SMOLDYN_INPUT_FILE_EXTENSION;
exportFile = new File(newExportFileName);
PrintWriter pw = new PrintWriter(exportFile);
SmoldynFileWriter smf = new SmoldynFileWriter(pw, true, null, simTask, false);
smf.write();
pw.close();
}
}
else if(scanCount == 1)// regular simulation, no parameter scan
{
SimulationTask simTask = new SimulationTask(new SimulationJob(selectedSim, 0, null),0);
// export the simulation to the selected file
PrintWriter pw = new PrintWriter(exportFile);
SmoldynFileWriter smf = new SmoldynFileWriter(pw, true, null, simTask, false);
smf.write();
pw.close();
}
else
{
throw new Exception("Simulation scan count is smaller than 1.");
}
}
return;
} else {
// convert it if other format
if (!fileFilter.equals(FileFilters.FILE_FILTER_VCML)) {
// SBML or CellML; get application name
if ((fileFilter.equals(FileFilters.FILE_FILTER_SBML_12)) || (fileFilter.equals(FileFilters.FILE_FILTER_SBML_21)) ||
(fileFilter.equals(FileFilters.FILE_FILTER_SBML_22)) || (fileFilter.equals(FileFilters.FILE_FILTER_SBML_23)) ||
(fileFilter.equals(FileFilters.FILE_FILTER_SBML_24)) || (fileFilter.equals(FileFilters.FILE_FILTER_SBML_31_CORE)) ||
(fileFilter.equals(FileFilters.FILE_FILTER_SBML_31_SPATIAL)) ) {
SimulationContext selectedSimContext = (SimulationContext)hashTable.get("selectedSimContext");
Simulation selectedSim = (Simulation)hashTable.get("selectedSimulation");
int sbmlLevel = 0;
int sbmlVersion = 0;
int sbmlPkgVersion = 0;
boolean bIsSpatial = false;
if ((fileFilter.equals(FileFilters.FILE_FILTER_SBML_12))) {
sbmlLevel = 1;
sbmlVersion = 2;
} else if (fileFilter.equals(FileFilters.FILE_FILTER_SBML_21)) {
sbmlLevel = 2;
sbmlVersion = 1;
} else if (fileFilter.equals(FileFilters.FILE_FILTER_SBML_22)) {
sbmlLevel = 2;
sbmlVersion = 2;
} else if (fileFilter.equals(FileFilters.FILE_FILTER_SBML_23)) {
sbmlLevel = 2;
sbmlVersion = 3;
} else if (fileFilter.equals(FileFilters.FILE_FILTER_SBML_24)) {
sbmlLevel = 2;
sbmlVersion = 4;
} else if (fileFilter.equals(FileFilters.FILE_FILTER_SBML_31_CORE)) {
sbmlLevel = 3;
sbmlVersion = 1;
} else if (fileFilter.equals(FileFilters.FILE_FILTER_SBML_31_SPATIAL)) {
sbmlLevel = 3;
sbmlVersion = 1;
sbmlPkgVersion = 1;
bIsSpatial = true;
}
if (selectedSim == null) {
resultString = XmlHelper.exportSBML(bioModel, sbmlLevel, sbmlVersion, sbmlPkgVersion, bIsSpatial, selectedSimContext, null);
XmlUtil.writeXMLStringToFile(resultString, exportFile.getAbsolutePath(), true);
return;
} else {
for (int sc = 0; sc < selectedSim.getScanCount(); sc++) {
SimulationJob simJob = new SimulationJob(selectedSim, sc, null);
resultString = XmlHelper.exportSBML(bioModel, sbmlLevel, sbmlVersion, sbmlPkgVersion, bIsSpatial, selectedSimContext, simJob);
// Need to export each parameter scan into a separate file
String newExportFileName = exportFile.getPath().substring(0, exportFile.getPath().indexOf(".xml")) + "_" + sc + ".xml";
exportFile.renameTo(new File(newExportFileName));
XmlUtil.writeXMLStringToFile(resultString, exportFile.getAbsolutePath(), true);
}
return;
}
} else if (fileFilter.equals(FileFilters.FILE_FILTER_BNGL)) {
RbmModelContainer rbmModelContainer = bioModel.getModel().getRbmModelContainer();
StringWriter bnglStringWriter = new StringWriter();
PrintWriter pw = new PrintWriter(bnglStringWriter);
RbmNetworkGenerator.writeBngl(bioModel, pw);
resultString = bnglStringWriter.toString();
pw.close();
} else if (fileFilter.equals(FileFilters.FILE_FILTER_NFSIM)) {
// TODO: get the first thing we find for now, in the future we'll need to modify ChooseFile
// to only offer the applications / simulations with bngl content
SimulationContext simContexts[] = bioModel.getSimulationContexts();
SimulationContext aSimulationContext = simContexts[0];
Simulation selectedSim = aSimulationContext.getSimulations(0);
//Simulation selectedSim = (Simulation)hashTable.get("selectedSimulation");
SimulationTask simTask = new SimulationTask(new SimulationJob(selectedSim, 0, null),0);
long randomSeed = 0; // a fixed seed will allow us to run reproducible simulations
//long randomSeed = System.currentTimeMillis();
NFsimSimulationOptions nfsimSimulationOptions = new NFsimSimulationOptions();
// we get the data we need from the math description
Element root = NFsimXMLWriter.writeNFsimXML(simTask, randomSeed, nfsimSimulationOptions);
Document doc = new Document();
doc.setRootElement(root);
XMLOutputter xmlOut = new XMLOutputter();
resultString = xmlOut.outputString(doc);
} else if (fileFilter.equals(FileFilters.FILE_FILTER_CELLML)) {
Integer chosenSimContextIndex = (Integer)hashTable.get("chosenSimContextIndex");
String applicationName = bioModel.getSimulationContext(chosenSimContextIndex.intValue()).getName();
resultString = XmlHelper.exportCellML(bioModel, applicationName);
// cellml still uses default character encoding for now ... maybe UTF-8 in the future
} else if (fileFilter.equals(FileFilters.FILE_FILTER_SEDML)) {
// export the entire biomodel to a SEDML file (for now, only non-spatial,non-stochastic applns)
int sedmlLevel = 1;
int sedmlVersion = 1;
String sPath = FileUtils.getFullPathNoEndSeparator(exportFile.getAbsolutePath());
String sFile = FileUtils.getBaseName(exportFile.getAbsolutePath());
String sExt = FileUtils.getExtension(exportFile.getAbsolutePath());
SEDMLExporter sedmlExporter = null;
if (bioModel instanceof BioModel) {
sedmlExporter = new SEDMLExporter(bioModel, sedmlLevel, sedmlVersion);
resultString = sedmlExporter.getSEDMLFile(sPath);
} else {
throw new RuntimeException("unsupported Document Type " + bioModel.getClass().getName() + " for SedML export");
}
if(sExt.equals("sedx")) {
sedmlExporter.createManifest(sPath, sFile);
String sedmlFileName = sPath + FileUtils.WINDOWS_SEPARATOR + sFile + ".sedml";
XmlUtil.writeXMLStringToFile(resultString, sedmlFileName, true);
sedmlExporter.addSedmlFileToList(sFile + ".sedml");
sedmlExporter.addSedmlFileToList("manifest.xml");
sedmlExporter.createZipArchive(sPath, sFile);
return;
} else {
XmlUtil.writeXMLStringToFile(resultString, exportFile.getAbsolutePath(), true);
}
}
} else {
// if format is VCML, get it from biomodel.
bioModel.getVCMetaData().cleanupMetadata();
resultString = XmlHelper.bioModelToXML(bioModel);
XmlUtil.writeXMLStringToFile(resultString, exportFile.getAbsolutePath(), true);
return;
}
}*/
} else if (documentToExport instanceof MathModel) {
MathModel mathModel = (MathModel) documentToExport;
// check format requested
if (fileFilter.equals(FileFilters.FILE_FILTER_MATLABV6)) {
// check if it's ODE
if (mathModel.getMathDescription() != null && (!mathModel.getMathDescription().isSpatial() && !mathModel.getMathDescription().isNonSpatialStoch())) {
MathDescription mathDesc = mathModel.getMathDescription();
resultString = exportMatlab(exportFile, fileFilter, mathDesc);
} else {
throw new Exception("Matlab export failed: NOT an non-spatial deterministic model.");
}
} else if (fileFilter.equals(FileFilters.FILE_FILTER_PDF)) {
FileOutputStream fos = new FileOutputStream(exportFile);
documentManager.generatePDF(mathModel, fos);
fos.close();
// will take care of writing to the file as well.
return;
} else if (fileFilter.equals(FileFilters.FILE_FILTER_VCML)) {
resultString = XmlHelper.mathModelToXML(mathModel);
} else if (fileFilter.equals(FileFilters.FILE_FILTER_CELLML)) {
resultString = XmlHelper.exportCellML(mathModel, null);
} else if (fileFilter.equals(FileFilters.FILE_FILTER_SBML_23)) {
resultString = XmlHelper.exportSBML(mathModel, 2, 3, 0, false, null, null);
} else if (fileFilter.equals(FileFilters.FILE_FILTER_SBML_24)) {
resultString = XmlHelper.exportSBML(mathModel, 2, 4, 0, false, null, null);
} else // in simulation, we'll export multiple Smoldyn input files.
if (fileFilter.equals(FileFilters.FILE_FILTER_SMOLDYN_INPUT)) {
Simulation selectedSim = (Simulation) hashTable.get("selectedSimulation");
if (selectedSim != null) {
int scanCount = selectedSim.getScanCount();
// -----
String baseExportFileName = (scanCount == 1 ? null : exportFile.getPath().substring(0, exportFile.getPath().indexOf(".")));
for (int i = 0; i < scanCount; i++) {
SimulationTask simTask = new SimulationTask(new SimulationJob(selectedSim, i, null), 0);
// Need to export each parameter scan into a separate file
File localExportFile = (scanCount == 1 ? exportFile : new File(baseExportFileName + "_" + i + SMOLDYN_INPUT_FILE_EXTENSION));
FileCloseHelper localCloseThis = new FileCloseHelper(localExportFile);
try {
SmoldynFileWriter smf = new SmoldynFileWriter(localCloseThis.getPrintWriter(), true, null, simTask, false);
smf.write();
} finally {
if (localCloseThis != null) {
localCloseThis.close();
}
}
}
}
return;
}
} else if (documentToExport instanceof Geometry) {
Geometry geom = (Geometry) documentToExport;
if (fileFilter.equals(FileFilters.FILE_FILTER_PDF)) {
documentManager.generatePDF(geom, (closeThis = new FileCloseHelper(exportFile)).getFileOutputStream());
} else if (fileFilter.equals(FileFilters.FILE_FILTER_VCML)) {
resultString = XmlHelper.geometryToXML(geom);
} else if (fileFilter.equals(FileFilters.FILE_FILTER_AVS)) {
cbit.vcell.export.AVS_UCD_Exporter.writeUCDGeometryOnly(geom.getGeometrySurfaceDescription(), (closeThis = new FileCloseHelper(exportFile)).getFileWriter());
} else if (fileFilter.equals(FileFilters.FILE_FILTER_STL)) {
// make sure filename end with .stl
File stlFile = exportFile;
if (!exportFile.getName().toLowerCase().endsWith(".stl")) {
stlFile = new File(exportFile.getParentFile(), exportFile.getName() + ".stl");
}
cbit.vcell.geometry.surface.StlExporter.writeBinaryStl(geom.getGeometrySurfaceDescription(), (closeThis = new FileCloseHelper(stlFile)).getRandomAccessFile("rw"));
} else if (fileFilter.equals(FileFilters.FILE_FILTER_PLY)) {
writeStanfordPolygon(geom.getGeometrySurfaceDescription(), (closeThis = new FileCloseHelper(exportFile)).getFileWriter());
}
}
if (resultString != null) {
(closeThis = new FileCloseHelper(exportFile)).getFileWriter().write(resultString);
}
} finally {
if (closeThis != null) {
closeThis.close();
}
}
}
use of cbit.vcell.mathmodel.MathModel in project vcell by virtualcell.
the class BatchTester method batchScanMathModels.
@SuppressWarnings("static-access")
public void batchScanMathModels(BadMathVisitor databaseVisitor, String statusTable, int chunkSize) throws DataAccessException, XmlParseException, SQLException, IOException {
PrintStream current = System.out;
// System.setOut(new PrintStream(new NullStream()));
try {
String processHostId = ManagementFactory.getRuntimeMXBean().getName();
String filename = processHostId + ".txt";
FileOutputStream fos = new FileOutputStream(filename);
System.setOut(new PrintStream(fos));
OutputStreamWriter writer = new OutputStreamWriter(fos);
// autoflush
PrintWriter printWriter = new PrintWriter(writer, true);
Connection conn = connFactory.getConnection(null);
conn.setAutoCommit(true);
printWriter.println("reserving slots");
try (Statement statement = conn.createStatement()) {
String query = "Update " + statusTable + " set scan_process = '" + processHostId + "', log_file = '" + filename + "' where scanned = 0 and scan_process is null and rownum <= " + chunkSize;
int uCount = statement.executeUpdate(query);
if (uCount > chunkSize) {
throw new Error("logic / SQL bad");
}
if (uCount == 0) {
printWriter.println("No models to scan, exiting");
System.exit(100);
}
}
printWriter.println("finding ours");
ArrayList<MathModelIdent> models = new ArrayList<BatchTester.MathModelIdent>();
try (Statement statement = conn.createStatement()) {
String query = "Select model_id from " + statusTable + " where scan_process ='" + processHostId + "' and scanned = 0";
ResultSet rs = statement.executeQuery(query);
while (rs.next()) {
MathModelIdent mmi = new MathModelIdent(rs);
models.add(mmi);
printWriter.println("claiming " + mmi.id);
}
}
try {
// start visiting models and writing log
printWriter.println("Start scanning math-models......");
printWriter.println("\n");
PreparedStatement ps = conn.prepareStatement("Update " + statusTable + " set scanned = 1, good = ? , exception_type = ?, exception = ?, scan_process = null where model_id = ?");
for (MathModelIdent modelIdent : models) {
ScanStatus scanStatus = ScanStatus.PASS;
String exceptionMessage = null;
String exceptionClass = null;
try {
KeyValue modelKey = convert(modelIdent.id);
BigString mathModelXML = null;
// seconds
long dbSleepTime = 10;
while (mathModelXML == null) {
try {
mathModelXML = dbServerImpl.getMathModelXML(BatchTester.ADMINISTRATOR, modelKey);
} catch (DataAccessException dae) {
Throwable cause = dae.getCause();
if (cause.getClass().getSimpleName().equals("UniversalConnectionPoolException")) {
printWriter.println("No db connection for " + modelIdent.id + ", sleeping " + dbSleepTime + " seconds");
Thread.currentThread().sleep(dbSleepTime * 1000);
// wait a little longer next time
dbSleepTime *= 1.5;
} else {
// other exception, just rethrow
throw dae;
}
}
}
MathModel storedModel = cbit.vcell.xml.XmlHelper.XMLToMathModel(new XMLSource(mathModelXML.toString()));
databaseVisitor.visitMathModel(storedModel, System.out);
} catch (Exception e) {
lg.error(e.getMessage(), e);
scanStatus = ScanStatus.FAIL;
exceptionClass = e.getClass().getName();
exceptionMessage = e.getMessage();
printWriter.println("failed " + modelIdent.id);
e.printStackTrace(printWriter);
}
ps.setInt(1, scanStatus.code);
ps.setString(2, exceptionClass);
ps.setString(3, exceptionMessage);
ps.setLong(4, modelIdent.id);
boolean estat = ps.execute();
if (estat) {
throw new Error("logic");
}
int uc = ps.getUpdateCount();
if (uc != 1) {
throw new Error("logic / sql ");
}
printWriter.println("model " + modelIdent.id + " " + scanStatus);
}
printWriter.close();
} finally {
System.setOut(current);
}
} catch (Exception e) {
e.printStackTrace();
}
}
Aggregations