417 lines
20 KiB
Java
417 lines
20 KiB
Java
package jmri.jmrix.can.cbus.node;
|
|
|
|
import java.io.File;
|
|
import java.util.ArrayList;
|
|
|
|
import jmri.jmrix.can.CanSystemConnectionMemo;
|
|
import jmri.jmrix.can.ConfigurationManager;
|
|
import jmri.util.JUnitAppender;
|
|
import jmri.util.JUnitUtil;
|
|
|
|
import org.junit.Assert;
|
|
import org.junit.jupiter.api.*;
|
|
import org.junit.jupiter.api.io.TempDir;
|
|
|
|
/**
|
|
*
|
|
* @author Paul Bender Copyright (C) 2017
|
|
* @author Steve Young Copyright (C) 2019
|
|
*/
|
|
public class CbusNodeBackupManagerTest {
|
|
|
|
@Test
|
|
public void testCTor() {
|
|
CbusNode node = new CbusNode(null,256);
|
|
CbusNodeBackupManager t = new CbusNodeBackupManager(node);
|
|
Assert.assertNotNull("exists",t);
|
|
node.dispose();
|
|
}
|
|
|
|
@Test
|
|
public void testNotOnNetwork() {
|
|
|
|
CbusNode node = new CbusNode(null,257);
|
|
CbusNodeBackupManager t = new CbusNodeBackupManager(node);
|
|
|
|
Assert.assertNull(t.getFirstBackupTime());
|
|
Assert.assertNull(t.getLastBackupTime());
|
|
|
|
Assert.assertTrue("node backup 0 entry exists",t.getBackups().isEmpty());
|
|
Assert.assertTrue(t.getNumCompleteBackups()==0);
|
|
|
|
t.nodeNotOnNetwork();
|
|
Assert.assertTrue("node backup 0 entry exists",1 == t.getBackups().size());
|
|
Assert.assertTrue(t.getNumCompleteBackups()==0);
|
|
Assert.assertEquals("Last backup not on network",
|
|
CbusNodeConstants.BackupType.NOTONNETWORK, t.getBackups().get(0).getBackupResult());
|
|
|
|
node.dispose();
|
|
}
|
|
|
|
@Test
|
|
public void testNodeInSlim() {
|
|
|
|
CbusNode node = new CbusNode(null,258);
|
|
CbusNodeBackupManager t = new CbusNodeBackupManager(node);
|
|
|
|
Assert.assertTrue("node backup 0 entry exists",t.getBackups().isEmpty());
|
|
Assert.assertTrue(t.getNumCompleteBackups()==0);
|
|
|
|
t.nodeInSLiM();
|
|
Assert.assertTrue("node backup 0 entry exists",1 == t.getBackups().size());
|
|
Assert.assertTrue(t.getNumCompleteBackups()==0);
|
|
Assert.assertEquals("Last backup slim",
|
|
CbusNodeConstants.BackupType.SLIM, t.getBackups().get(0).getBackupResult());
|
|
|
|
node.dispose();
|
|
}
|
|
|
|
@Test
|
|
public void testNodeBackupError() {
|
|
|
|
CbusNode node = new CbusNode(null,259);
|
|
CbusNodeBackupManager t = new CbusNodeBackupManager(node);
|
|
|
|
Assert.assertTrue("node backup 0 entry exists",t.getBackups().isEmpty());
|
|
Assert.assertTrue(t.getNumCompleteBackups()==0);
|
|
|
|
t.doStore(true, false); // create new, no existing errors logged
|
|
Assert.assertTrue("node backup 0 entry exists",1 == t.getBackups().size());
|
|
Assert.assertTrue(t.getNumCompleteBackups()==0);
|
|
Assert.assertEquals("Last backup complete with errors",
|
|
CbusNodeConstants.BackupType.COMPLETEDWITHERROR, t.getBackups().get(0).getBackupResult());
|
|
|
|
node.dispose();
|
|
}
|
|
|
|
@Test
|
|
public void testOpenxistingFile() throws java.text.ParseException, java.io.IOException {
|
|
|
|
CbusNode node = new CbusNode(null,41375);
|
|
CbusNodeBackupManager t = new CbusNodeBackupManager(node);
|
|
|
|
// jmri.util.FileUtil.createDirectory("cbus" + java.io.File.separator + "node");
|
|
|
|
java.io.File dir = new java.io.File("java/test/jmri/jmrix/can/cbus/node/");
|
|
java.io.File systemFile = new java.io.File(dir, "41375.xml");
|
|
|
|
// note that 41375.xml deliberately has the backup in the wrong order
|
|
// to ensure that the array order is corrected
|
|
|
|
java.nio.file.Files.copy(systemFile.toPath(), t.getFileLocation().toPath(),
|
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
|
|
|
|
Assert.assertTrue("node backup 0 entry exists",t.getBackups().isEmpty());
|
|
Assert.assertTrue(t.getNumCompleteBackups()==0);
|
|
|
|
t.doLoad();
|
|
|
|
Assert.assertEquals("File loaded to ArrayList",6, t.getBackups().size());
|
|
Assert.assertTrue(t.getNumCompleteBackups()==2);
|
|
|
|
Assert.assertEquals("Node Username from xml","My Node Name for Node 41375", node.getUserName());
|
|
Assert.assertEquals("Node UserComment from xml","My Node 41375 Freetext", node.getUserComment());
|
|
Assert.assertEquals("Node custom Module Type Name from xml","CATFLAP", node.getNodeNameFromName());
|
|
|
|
Assert.assertEquals("First Backup Time",t.xmlDateStyle.parse("2019-06-24 19:51:15"), t.getFirstBackupTime());
|
|
Assert.assertEquals("Last Backup Time",t.xmlDateStyle.parse("2019-08-30 14:51:15"), t.getLastBackupTime());
|
|
|
|
Assert.assertEquals("backup 0 complete with errors",
|
|
CbusNodeConstants.BackupType.COMPLETEDWITHERROR, t.getBackups().get(0).getBackupResult());
|
|
Assert.assertEquals("backup 1 complete",
|
|
CbusNodeConstants.BackupType.COMPLETE, t.getBackups().get(1).getBackupResult());
|
|
Assert.assertEquals("backup 2 slim",
|
|
CbusNodeConstants.BackupType.SLIM, t.getBackups().get(2).getBackupResult());
|
|
Assert.assertEquals("backup 3 not on network",
|
|
CbusNodeConstants.BackupType.NOTONNETWORK, t.getBackups().get(3).getBackupResult());
|
|
Assert.assertEquals("backup 4 complete",
|
|
CbusNodeConstants.BackupType.COMPLETE, t.getBackups().get(4).getBackupResult());
|
|
Assert.assertEquals("backup 5 incomplete",
|
|
CbusNodeConstants.BackupType.INCOMPLETE, t.getBackups().get(5).getBackupResult());
|
|
|
|
Assert.assertEquals("backup 4 comment",
|
|
"First Backup Completed Comment", t.getBackups().get(4).getBackupComment());
|
|
Assert.assertTrue("backup 2 comment", t.getBackups().get(2).getBackupComment().isEmpty());
|
|
|
|
Assert.assertEquals("backup node parameters",
|
|
"A5591D800D01010D0D0100080000000000000101", t.getBackups().get(4).getNodeParamManager().getParameterHexString());
|
|
Assert.assertEquals("backup node NVs","01", t.getBackups().get(4).getNodeNvManager().getNvHexString());
|
|
|
|
|
|
ArrayList<CbusNodeEvent> tempList = t.getBackups().get(4).getNodeEventManager().getEventArray();
|
|
Assert.assertNotNull("Ev Array Not Null", tempList);
|
|
|
|
|
|
Assert.assertEquals("backup node events",
|
|
"[NN:127 EN:100 , NN:299 EN:203 , NN:127 EN:207 ]",
|
|
tempList.toString());
|
|
|
|
CbusNodeEvent tmpEv = t.getBackups().get(4).getNodeEventManager().getNodeEvent(299,203);
|
|
Assert.assertNotNull("Ev Not Null", tmpEv);
|
|
|
|
Assert.assertEquals("backup node event 203 nn 299 ev vars",
|
|
"0102030405060708090A0B0CFF",
|
|
tmpEv.getHexEvVarString());
|
|
|
|
node.dispose();
|
|
}
|
|
|
|
@Test
|
|
public void testSaveFile() throws java.text.ParseException, java.io.IOException {
|
|
|
|
CbusNode node = new CbusNode(null,41375);
|
|
CbusNodeBackupManager t = new CbusNodeBackupManager(node);
|
|
|
|
java.io.File dir = new java.io.File("java/test/jmri/jmrix/can/cbus/node/");
|
|
java.io.File systemFile = new java.io.File(dir, "41375.xml");
|
|
|
|
// note that 41375.xml deliberately has the backup in the wrong order
|
|
// to ensure that the array order is corrected
|
|
|
|
java.nio.file.Files.copy(systemFile.toPath(), t.getFileLocation().toPath(),
|
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
|
|
Assert.assertEquals("File should not be loaded",0, t.getBackups().size());
|
|
t.doLoad();
|
|
Assert.assertEquals("File loaded to ArrayList",6, t.getBackups().size());
|
|
|
|
t.nodeInSLiM();
|
|
|
|
// we can't do a direct comparison of the xml as the new entry will have a date stamp
|
|
// but we can reload it and check a few things have saved ok
|
|
node.getNodeBackupManager().setBackupStarted(false);
|
|
t.resetBupArray();
|
|
t.doLoad();
|
|
|
|
JUnitUtil.waitFor(()->{ return(t.getBackups().size()>6); }, "Not all backups loaded");
|
|
|
|
Assert.assertEquals("File loaded to ArrayList",7, t.getBackups().size());
|
|
Assert.assertTrue(t.getNumCompleteBackups()==2);
|
|
|
|
Assert.assertEquals("Node Username from xml","My Node Name for Node 41375", node.getUserName());
|
|
Assert.assertEquals("Node UserComment from xml","My Node 41375 Freetext", node.getUserComment());
|
|
Assert.assertEquals("Node custom Module Type Name from xml","CATFLAP", node.getNodeNameFromName());
|
|
|
|
Assert.assertEquals("First Backup Time",t.xmlDateStyle.parse("2019-06-24 19:51:15"), t.getFirstBackupTime());
|
|
Assert.assertEquals("Last Backup Time",t.xmlDateStyle.parse("2019-08-30 14:51:15"), t.getLastBackupTime());
|
|
|
|
Assert.assertEquals("backup 0 slim",
|
|
CbusNodeConstants.BackupType.SLIM, t.getBackups().get(0).getBackupResult());
|
|
Assert.assertEquals("backup 1 complete with errors",
|
|
CbusNodeConstants.BackupType.COMPLETEDWITHERROR, t.getBackups().get(1).getBackupResult());
|
|
Assert.assertEquals("backup 2 complete",
|
|
CbusNodeConstants.BackupType.COMPLETE, t.getBackups().get(2).getBackupResult());
|
|
Assert.assertEquals("backup 3 slim",
|
|
CbusNodeConstants.BackupType.SLIM, t.getBackups().get(3).getBackupResult());
|
|
Assert.assertEquals("backup 4 not on network",
|
|
CbusNodeConstants.BackupType.NOTONNETWORK, t.getBackups().get(4).getBackupResult());
|
|
Assert.assertEquals("backup 5 complete",
|
|
CbusNodeConstants.BackupType.COMPLETE, t.getBackups().get(5).getBackupResult());
|
|
Assert.assertEquals("backup 6 incomplete",
|
|
CbusNodeConstants.BackupType.INCOMPLETE, t.getBackups().get(6).getBackupResult());
|
|
|
|
Assert.assertEquals("backup 5 comment",
|
|
"First Backup Completed Comment", t.getBackups().get(5).getBackupComment());
|
|
Assert.assertTrue("backup 3 comment", t.getBackups().get(3).getBackupComment().isEmpty());
|
|
|
|
Assert.assertEquals("backup node parameters",
|
|
"A5591D800D01010D0D0100080000000000000101", t.getBackups().get(5).getNodeParamManager().getParameterHexString());
|
|
Assert.assertEquals("backup node NVs","01", t.getBackups().get(5).getNodeNvManager().getNvHexString());
|
|
|
|
ArrayList<CbusNodeEvent> tempList = t.getBackups().get(5).getNodeEventManager().getEventArray();
|
|
Assert.assertNotNull("Ev Array Not Null", tempList);
|
|
|
|
Assert.assertEquals("backup node events",
|
|
"[NN:127 EN:100 , NN:299 EN:203 , NN:127 EN:207 ]",
|
|
tempList.toString());
|
|
|
|
CbusNodeEvent tmpEv = t.getBackups().get(5).getNodeEventManager().getNodeEvent(299,203);
|
|
Assert.assertNotNull("Ev Not Null", tmpEv);
|
|
|
|
Assert.assertEquals("backup node event 203 nn 299 ev vars",
|
|
"0102030405060708090A0B0CFF",
|
|
tmpEv.getHexEvVarString());
|
|
|
|
node.dispose();
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testTrimBackups() throws java.text.ParseException, java.io.IOException {
|
|
|
|
Assertions.assertNotNull(memo);
|
|
jmri.jmrix.can.cbus.CbusPreferences pref = memo.get( jmri.jmrix.can.cbus.CbusPreferences.class);
|
|
|
|
CbusNode node = new CbusNode(memo,41376);
|
|
CbusNodeBackupManager t = new CbusNodeBackupManager(node);
|
|
|
|
java.io.File dir = new java.io.File("java/test/jmri/jmrix/can/cbus/node/");
|
|
java.io.File systemFile = new java.io.File(dir, "41376.xml");
|
|
|
|
java.nio.file.Files.copy(systemFile.toPath(), t.getFileLocation().toPath(),
|
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
|
|
Assert.assertEquals("File should not be loaded",0, t.getBackups().size());
|
|
|
|
t.doLoad();
|
|
Assert.assertEquals("File loaded to ArrayList",14, t.getBackups().size());
|
|
|
|
Assert.assertEquals(12,t.getNumCompleteBackups());
|
|
|
|
Assert.assertEquals("First Backup Time",t.xmlDateStyle.parse("2019-01-24 19:51:15"), t.getFirstBackupTime());
|
|
Assert.assertEquals("Last Backup Time",t.xmlDateStyle.parse("2019-12-24 19:51:15"), t.getLastBackupTime());
|
|
|
|
pref.setMinimumNumBackupsToKeep(10);
|
|
t.doStore(false,false);
|
|
|
|
// reload it
|
|
node.getNodeBackupManager().setBackupStarted(false);
|
|
t.resetBupArray();
|
|
t.doLoad();
|
|
|
|
JUnitUtil.waitFor(()->{ return(t.getBackups().size()>10); }, "Not all backups loaded");
|
|
|
|
Assert.assertEquals("File loaded to ArrayList",11, t.getBackups().size());
|
|
Assert.assertEquals("Complete backups after save and trim",10,t.getNumCompleteBackups());
|
|
|
|
Assert.assertEquals("First Backup Time",t.xmlDateStyle.parse("2019-01-24 19:51:15"), t.getFirstBackupTime());
|
|
Assert.assertEquals("Last Backup Time",t.xmlDateStyle.parse("2019-12-24 19:51:15"), t.getLastBackupTime());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-12-24 19:51:15"), t.getBackups().get(0).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-11-24 19:51:15"), t.getBackups().get(1).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-10-24 19:51:15"), t.getBackups().get(2).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-09-24 19:51:15"), t.getBackups().get(3).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-08-27 19:51:15"), t.getBackups().get(4).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-08-24 19:51:15"), t.getBackups().get(5).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-07-24 19:51:15"), t.getBackups().get(6).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-06-24 19:51:15"), t.getBackups().get(7).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-05-24 19:51:15"), t.getBackups().get(8).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-04-24 19:51:15"), t.getBackups().get(9).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-01-24 19:51:15"), t.getBackups().get(10).getBackupTimeStamp());
|
|
|
|
|
|
pref.setMinimumNumBackupsToKeep(5);
|
|
t.doStore(false,false);
|
|
|
|
// reload it
|
|
node.getNodeBackupManager().setBackupStarted(false);
|
|
t.resetBupArray();
|
|
t.doLoad();
|
|
|
|
Assert.assertEquals("File loaded to ArrayList",6, t.getBackups().size());
|
|
Assert.assertEquals("Complete backups after save and trim",5,t.getNumCompleteBackups());
|
|
|
|
Assert.assertEquals("First Backup Time",t.xmlDateStyle.parse("2019-01-24 19:51:15"), t.getFirstBackupTime());
|
|
Assert.assertEquals("Last Backup Time",t.xmlDateStyle.parse("2019-12-24 19:51:15"), t.getLastBackupTime());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-12-24 19:51:15"), t.getBackups().get(0).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-11-24 19:51:15"), t.getBackups().get(1).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-10-24 19:51:15"), t.getBackups().get(2).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-09-24 19:51:15"), t.getBackups().get(3).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-08-27 19:51:15"), t.getBackups().get(4).getBackupTimeStamp());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-01-24 19:51:15"), t.getBackups().get(5).getBackupTimeStamp());
|
|
|
|
t.getBackups().get(1).setBackupComment("Test Comment to avoid being deleted");
|
|
|
|
pref.setMinimumNumBackupsToKeep(0);
|
|
t.doStore(false,false);
|
|
|
|
// reload it
|
|
node.getNodeBackupManager().setBackupStarted(false);
|
|
t.resetBupArray();
|
|
t.doLoad();
|
|
|
|
Assert.assertEquals("File loaded to ArrayList",2, t.getBackups().size());
|
|
Assert.assertEquals("Complete backups after save and trim",2,t.getNumCompleteBackups());
|
|
|
|
Assert.assertEquals("First Backup Time",t.xmlDateStyle.parse("2019-01-24 19:51:15"), t.getFirstBackupTime());
|
|
Assert.assertEquals("Last Backup Time",t.xmlDateStyle.parse("2019-11-24 19:51:15"), t.getLastBackupTime());
|
|
Assert.assertEquals(t.xmlDateStyle.parse("2019-11-24 19:51:15"), t.getBackups().get(0).getBackupTimeStamp());
|
|
|
|
node.dispose();
|
|
}
|
|
|
|
@Test
|
|
public void testFailedBackups() throws java.text.ParseException, java.io.IOException {
|
|
|
|
CbusNode node = new CbusNode(null,41377);
|
|
CbusNodeBackupManager t = new CbusNodeBackupManager(node);
|
|
|
|
java.io.File dir = new java.io.File("java/test/jmri/jmrix/can/cbus/node/");
|
|
java.io.File systemFile = new java.io.File(dir, "41377.xml");
|
|
|
|
java.nio.file.Files.copy(systemFile.toPath(), t.getFileLocation().toPath(),
|
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
|
|
Assert.assertEquals("File should not be loaded",0, t.getBackups().size());
|
|
|
|
t.doLoad();
|
|
|
|
JUnitAppender.assertWarnMessageStartsWith("Incorrect Event Variable Length in Backup");
|
|
JUnitAppender.assertErrorMessageStartsWith("NO datetimestamp in a backup log entry");
|
|
JUnitAppender.assertErrorMessageStartsWith("NO result in a backup log entry");
|
|
JUnitAppender.assertErrorMessageStartsWith("Unable to parse date NOT A DATE");
|
|
|
|
JUnitAppender.assertWarnMessageStartsWith("Incorrect Node / Event Number in Backup");
|
|
JUnitAppender.assertErrorMessageStartsWith("Node / Event Number Missing in Backup");
|
|
JUnitAppender.assertErrorMessageStartsWith("Node / Event Number Missing in Backup");
|
|
JUnitAppender.assertErrorMessageStartsWith("NO result in a backup log entry");
|
|
|
|
Assert.assertEquals("File loaded to ArrayList",8, t.getBackups().size());
|
|
Assert.assertEquals("backup 0 INCOMPLETE",
|
|
CbusNodeConstants.BackupType.INCOMPLETE, t.getBackups().get(0).getBackupResult());
|
|
Assert.assertEquals("backup 1 INCOMPLETE",
|
|
CbusNodeConstants.BackupType.INCOMPLETE, t.getBackups().get(1).getBackupResult());
|
|
Assert.assertEquals("backup 2 INCOMPLETE",
|
|
CbusNodeConstants.BackupType.INCOMPLETE, t.getBackups().get(2).getBackupResult());
|
|
Assert.assertEquals("backup 3 INCOMPLETE",
|
|
CbusNodeConstants.BackupType.INCOMPLETE, t.getBackups().get(3).getBackupResult());
|
|
Assert.assertEquals("backup 4 INCOMPLETE",
|
|
CbusNodeConstants.BackupType.INCOMPLETE, t.getBackups().get(4).getBackupResult());
|
|
Assert.assertEquals("backup 5 INCOMPLETE",
|
|
CbusNodeConstants.BackupType.INCOMPLETE, t.getBackups().get(5).getBackupResult());
|
|
Assert.assertEquals("backup 6 INCOMPLETE",
|
|
CbusNodeConstants.BackupType.INCOMPLETE, t.getBackups().get(6).getBackupResult());
|
|
Assert.assertEquals("backup 7 INCOMPLETE",
|
|
CbusNodeConstants.BackupType.INCOMPLETE, t.getBackups().get(7).getBackupResult());
|
|
|
|
node.dispose();
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testMalfordmedFile() throws java.text.ParseException, java.io.IOException {
|
|
|
|
CbusNode node = new CbusNode(null,41378);
|
|
CbusNodeBackupManager t = new CbusNodeBackupManager(node);
|
|
|
|
java.io.File dir = new java.io.File("java/test/jmri/jmrix/can/cbus/node/");
|
|
java.io.File systemFile = new java.io.File(dir, "41378.xml");
|
|
|
|
java.nio.file.Files.copy(systemFile.toPath(), t.getFileLocation().toPath(),
|
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
|
|
|
|
t.doLoad();
|
|
JUnitAppender.assertErrorMessageStartsWith("File invalid: 41378.xml");
|
|
|
|
}
|
|
|
|
private CanSystemConnectionMemo memo = null;
|
|
|
|
@BeforeEach
|
|
public void setUp(@TempDir File folder) throws java.io.IOException {
|
|
JUnitUtil.setUp();
|
|
JUnitUtil.resetProfileManager(new jmri.profile.NullProfile(folder));
|
|
memo = new CanSystemConnectionMemo();
|
|
memo.setProtocol(ConfigurationManager.MERGCBUS);
|
|
memo.configureManagers();
|
|
}
|
|
|
|
@AfterEach
|
|
public void tearDown() {
|
|
Assertions.assertNotNull(memo);
|
|
memo.dispose();
|
|
memo = null;
|
|
JUnitUtil.deregisterBlockManagerShutdownTask();
|
|
JUnitUtil.tearDown();
|
|
}
|
|
|
|
// private static final Logger log = LoggerFactory.getLogger(CbusNodeXmlTest.class);
|
|
|
|
}
|